在Debian系统中,root账户拥有至高无上的权限。如果直接开启root的远程SSH登录,一旦密码被暴力破解或泄露,攻击者将直接获得系统的完全控制权,这对于生产环境来说是毁灭性的。因此,禁用root远程登录并建立一个完善的权限审计机制,不是可选项,而是安全基线的强制要求。仅仅使用sudo提权还不够,必须精确记录下通过sudo执行过的每一条命令,以便在发生故障或安全事件时进行溯源。
修改SSH配置以禁用Root登录实现这一目标的核心在于修改OpenSSH服务的配置文件。首先,我们需要以root权限编辑/etc/ssh/sshd_config文件。请务必小心操作,一旦配错可能导致无法远程连接。
sudo nano /etc/ssh/sshd_config
在文件中找到PermitRootLogin这一行。默认情况下,它可能被注释掉或者设置为yes。我们需要将其修改为no。如果该行不存在,则手动添加。同时,为了进一步强化安全,建议检查PasswordAuthentication是否设置为no,强制使用密钥登录,但这并非本次讨论的强制要求。
PermitRootLogin no
修改完成后,保存文件并退出编辑器。为了让配置生效,必须重启SSH服务。在Debian系统中,通常使用systemctl命令来完成。
sudo systemctl restart sshd
在重启服务之前,务必确认你已经配置好了一个普通用户,并且该用户拥有sudo权限。否则,你将把自己锁在服务器之外。你可以在另一个终端窗口尝试用普通用户登录,确认无误后再执行重启操作。
配置Sudoers文件以进行权限提权既然root不能直接登录了,所有需要特权才能执行的操作就必须通过sudo命令来完成。Debian系统使用visudo命令来安全地编辑/etc/sudoers文件。直接使用文本编辑器修改该文件存在语法错误导致sudo完全失效的风险,visudo会在保存时检查语法。
sudo visudo
在文件中,你需要确保你的管理用户被赋予了相应的权限。通常,我们会将用户加入到sudo组中,并确保sudoers文件中包含允许该组提权的配置。标准配置行如下,它允许sudo组的所有成员以任何身份在任何主机上执行任何命令。
%sudo ALL=(ALL:ALL) ALL
你可以通过以下命令将你的普通用户(例如用户名为deploy)添加到sudo组,这样就无需直接修改sudoers文件。
sudo usermod -aG sudo deploy
完成这一步后,deploy用户就可以在执行命令前加上sudo来获取root权限了。但这只是开始,我们还没有记录下他具体做了什么。
构建Sudo操作日志记录系统默认情况下,sudo的执行记录会发送到syslog,通常混杂在/var/log/auth.log文件中。虽然能看到谁在什么时间用了sudo,但无法看到具体的命令细节,特别是当用户通过sudo su -或sudo -i切换到root shell后,所有在root shell下执行的命令都不会被记录。我们需要的是精确的命令行日志。
解决方案是利用sudo内置的日志机制,将详细的执行信息输出到独立的文件中。再次通过visudo打开配置文件,在文件末尾添加以下默认值设置。
Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Defaults logfile="/var/log/sudo.log" Defaults log_input, log_output Defaults iolog_dir=/var/log/sudo-io/
这里的关键参数是log_input和log_output,它们会记录命令的输入和输出,但这会生成大量数据,通常用于极其严格的审计环境。对于大多数运维场景,我们更关注命令本身。因此,更实用的配置是结合使用logfile和env_keep来记录精确命令,并配合rsyslog的配置。不过,logfile参数本身只能记录sudo命令的发起,对于深入审计,我们需要使用sudoreplay配合iolog_dir。
然而,更轻量且直接的方案是配置rsyslog来记录所有通过sudo执行的命令。首先,在/etc/sudoers中添加一行,指定sudo日志的facility和级别。
Defaults syslog=local2
这行配置告诉sudo将所有消息发送到rsyslog的local2设施。接下来,我们需要配置rsyslog来接收这些消息并将其写入专用文件。创建一个新的rsyslog配置文件。
sudo nano /etc/rsyslog.d/50-sudo.conf
在文件中写入以下内容。这表示将local2设施的所有级别日志写入/var/log/sudo-commands.log文件,并停止后续处理以防止重复记录。
local2.* /var/log/sudo-commands.log & stop
保存文件后,重启rsyslog服务使配置生效。
sudo systemctl restart rsyslog
现在,任何通过sudo执行的命令都会被详细记录在/var/log/sudo-commands.log中。你可以使用tail命令实时查看日志。
sudo tail -f /var/log/sudo-commands.log
日志内容会包含时间戳、主机名、用户名以及具体执行的命令,这对于审计来说已经非常清晰。
实现更细粒度的命令审计上述方案能记录sudo命令,但如果用户执行了sudo bash获得了root shell,那么在shell内部执行的所有命令依然会逃逸审计。要解决这个问题,需要引入更高级的审计工具,如auditd,这是Linux内核级别的审计系统。
首先,安装auditd服务。
sudo apt update sudo apt install auditd -y
安装完成后,启用并启动服务。
sudo systemctl enable auditd sudo systemctl start auditd
auditd的强大之处在于它可以监控特定的系统调用。我们可以添加一条规则,监控所有用户(包括通过sudo切换到root的用户)执行的命令。编辑审计规则文件。
sudo nano /etc/audit/rules.d/audit.rules
在文件中添加以下规则。这条规则会记录所有用户ID大于等于1000(即普通用户)以及root用户执行的命令,并生成一个唯一的会话ID。
-a exit,always -F arch=b64 -S execve -F auid>=1000 -F auid!=unset -k admin-commands -a exit,always -F arch=b64 -S execve -F auid=0 -k root-commands
保存文件后,重启auditd服务以加载新规则。
sudo systemctl restart auditd
现在,所有关键命令的执行都会被内核捕获。你可以使用ausearch命令来查询这些日志。例如,查询特定用户deploy今天执行的所有命令。
sudo ausearch -ua deploy -ts today -k admin-commands
或者查询所有被标记为root-commands的事件。
sudo ausearch -k root-commands
通过auditd,即使攻击者或内部用户试图清除shell历史记录,也无法抹去内核级的审计轨迹。结合sudo的日志配置,你就拥有了一个从提权操作到具体命令执行的完整审计链。
日志轮替与维护策略审计日志会快速增长,如果不加管理,很快就会填满磁盘空间。必须配置logrotate来对自定义的sudo日志和auditd日志进行轮替。对于sudo日志,创建一个logrotate配置文件。
sudo nano /etc/logrotate.d/sudo-commands
输入以下配置,实现每日轮替、保留30天历史并进行压缩。
/var/log/sudo-commands.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 640 root adm
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
auditd服务自带日志轮替机制,其配置位于/etc/audit/auditd.conf。你可以调整max_log_file_action参数为rotate,并设置num_logs来保留适当数量的日志文件。典型的配置片段如下。
max_log_file = 50 max_log_file_action = rotate num_logs = 10
通过合理的轮替策略,既能满足长期的合规审计需求,又能保证系统的稳定运行。
验证配置的完整性与可靠性所有配置完成后,必须进行一次完整的验证,而不是假设一切正常。首先,在一个新的终端窗口中,尝试直接以root身份SSH连接服务器,你应该会收到“Permission denied”的提示,这证明禁用root登录已生效。
接着,使用你的普通用户deploy登录。执行一条带有sudo的命令,例如sudo ls /root。然后检查/var/log/sudo-commands.log文件,确认其中出现了这条执行记录。
最后,执行sudo su -切换到root用户,在root shell下执行几个无害的命令,如ls /tmp和whoami。然后使用ausearch -k root-commands命令查询auditd日志,确认这些在root shell下执行的命令被成功捕获。这一整套验证流程能确保你的安全配置没有漏洞,审计链条是闭合的。
通过将SSH访问限制、sudo提权管理以及多层次的命令审计结合起来,你为Debian服务器构建了一道坚固的安全防线。这种纵深防御的思路,远比单纯禁用root登录要可靠得多,它让每一次特权操作都变得有迹可循,让运维管理从混沌走向透明。
