禁止linux用户使用su命令切换用户的核心方法是修改/etc/pam.d/su的pam配置文件。1. 编辑/etc/pam.d/su文件,添加或修改规则以限制su使用权限;2. 若要禁止所有用户使用su,可注释或删除文件中的auth行;3. 若仅允许特定用户使用su,可通过pam_listfile.so模块指定允许列表文件;4. 若要禁止特定用户使用su,则在配置中使用sense=deny参数指向拒绝列表;5. 修改后测试配置是否生效,可通过受限用户尝试su命令、检查系统日志(如/var/log/auth.log)、使用pamdump命令查看pam配置等方式验证;6. 若配置错误导致无法su到root,可通过sudo、ssh直接登录root、单用户模式、live cd/usb、或检查selinux/apparmor策略进行恢复;7. 恢复默认配置的方法包括查找备份文件、从相同版本系统复制、或根据发行版特性提取默认配置;8. 禁用su后仍可通过sudo、pkexec、ssh、runuser等命令进行权限切换与提升;9. 监控和审计用户权限变更可通过auditd、syslog、acct工具、文件完整性监控、selinux/apparmor日志、脚本自动化及siem系统实现;10. 做好linux服务器权限管理应遵循最小权限原则、合理使用用户组、正确设置文件目录权限、使用acl细化权限控制、限制sudo使用、禁用不必要服务账户并定期审查权限。
禁止Linux用户使用su命令切换用户,核心在于修改/etc/pam.d/su的PAM(Pluggable Authentication Modules)配置文件。这允许你控制哪些用户可以执行su,甚至完全禁用su命令。
解决方案:
要禁止特定用户使用su命令,或者限制只有特定用户才能使用,你需要编辑/etc/pam.d/su文件。
-
编辑/etc/pam.d/su文件:
使用你喜欢的文本编辑器,以root权限打开/etc/pam.d/su。例如:
sudo vi /etc/pam.d/su
-
添加或修改规则:
在文件中找到类似于auth required pam_wheel.so use_uid这样的行。如果不存在,可以添加一行。这行通常用于控制只有wheel组的用户才能使用su。
-
禁止所有用户使用su:
最简单的方法是注释掉(在行首添加#)或者删除/etc/pam.d/su中的所有auth行。这样,即使输入正确的root密码,su命令也会失败。但需要注意,这样做会影响所有用户,包括管理员,除非他们通过其他方式获取root权限(例如,使用sudo)。
-
仅允许特定用户使用su:
这需要更精细的配置。你可以使用pam_listfile.so模块来指定允许或禁止的用户列表。
首先,创建一个包含允许用户的列表文件,例如/etc/security/su.allow,每行一个用户名:
root user1 user2
然后在/etc/pam.d/su中添加或修改以下行:
auth required pam_listfile.so item=user file=/etc/security/su.allow onerr=succeed auth sufficient pam_unix.so auth required pam_deny.so
这里的逻辑是:如果用户在/etc/security/su.allow文件中,pam_listfile.so会成功,跳过后续验证;否则,pam_deny.so会拒绝认证。onerr=succeed确保即使列表文件不存在或读取失败,认证也不会立即失败,而是继续尝试后续的认证方法。
或者,禁止特定用户使用su,可以这样配置:
auth required pam_listfile.so item=user file=/etc/security/su.deny sense=deny onerr=succeed auth sufficient pam_unix.so auth required pam_deny.so
这里,sense=deny意味着如果用户在/etc/security/su.deny文件中,认证将被拒绝。
-
-
保存并关闭文件:
保存对/etc/pam.d/su的更改,并关闭编辑器。
-
测试配置:
尝试使用受影响的用户账户通过su命令切换到root或其他用户。确保配置按照预期工作。
如何确认/etc/pam.d/su的修改生效?
修改/etc/pam.d/su后,最直接的验证方法就是尝试使用su命令切换用户。
-
使用受限用户尝试su:
如果你配置了只允许特定用户使用su,尝试使用一个不在允许列表中的用户执行su命令。如果配置正确,你应该会看到类似“su: Authentication failure”或者其他错误信息,表明认证失败。
-
检查系统日志:
PAM相关的认证信息通常会记录在系统日志中。你可以查看/var/log/auth.log(debian/ubuntu)或/var/log/secure(centos/RHEL)等日志文件,查找与su命令相关的认证尝试记录。例如:
grep "su" /var/log/auth.log
或者
grep "su" /var/log/secure
这些日志可以帮助你确认PAM模块是否按照预期工作,以及哪些用户尝试了su命令,以及认证是否成功。
-
使用pamdump命令:
pamdump命令可以显示指定服务(例如su)的PAM配置。虽然它不能直接告诉你配置是否生效,但可以帮助你确认/etc/pam.d/su文件中的配置是否正确。
pamdump su
查看输出,确认你所做的修改已经正确地反映在PAM配置中。
-
重启sshd服务(如果通过SSH测试):
如果你的测试涉及到通过SSH连接的用户,并且你修改了与SSH会话相关的PAM配置,可能需要重启sshd服务才能使更改生效。
sudo systemctl restart sshd
但请注意,这可能会中断现有的SSH连接,因此请谨慎操作。
-
使用su -命令:
su -命令会模拟完全的登录环境,包括加载用户的环境变量和启动文件。与简单的su命令相比,它可能触发不同的PAM配置路径。因此,在测试时,也应该尝试使用su -命令。
/etc/pam.d/su配置错误导致无法su到root怎么办?
不小心错误配置了/etc/pam.d/su,导致无法使用su命令切换到root用户,这确实是个麻烦的问题。但通常有几种方法可以解决,具体取决于你的系统配置和错误类型。
-
使用sudo命令:
如果你的用户账户在sudoers文件中具有root权限,你可以使用sudo命令来执行需要root权限的操作,而无需使用su。例如:
sudo bash
或者
sudo vi /etc/pam.d/su
这允许你绕过su的PAM配置,直接以root权限执行命令。
-
通过SSH以root用户登录:
如果允许root用户通过SSH登录(通常不建议这样做,但如果你的系统是这样配置的),你可以尝试通过SSH直接以root用户登录,然后修复/etc/pam.d/su文件。
ssh root@your_server_ip
登录后,使用文本编辑器修复/etc/pam.d/su文件。
-
使用单用户模式(Single User Mode):
单用户模式提供了一个无需认证的root shell。你可以通过以下步骤进入单用户模式:
- 重启系统。
- 在GRUB启动菜单中,选择你的Linux发行版,然后按e键编辑启动选项。
- 找到以linux开头的行,在行尾添加single或1,然后按Ctrl+X或F10启动。
- 系统将启动到单用户模式,你将获得一个root shell。
在单用户模式下,你可以挂载根文件系统为可写模式(如果默认是只读的):
mount -o remount,rw /
然后,使用文本编辑器修复/etc/pam.d/su文件。
修复完成后,重启系统:
reboot
-
使用Live CD/USB:
如果以上方法都不可行,你可以使用Linux Live CD/USB启动系统。
-
使用Live CD/USB启动系统。
-
挂载包含/etc/pam.d/su文件的文件系统。首先确定你的根分区,例如/dev/sda1。
sudo fdisk -l
然后挂载根分区:
sudo mount /dev/sda1 /mnt
-
使用文本编辑器修复/mnt/etc/pam.d/su文件。
-
卸载文件系统:
sudo umount /mnt
-
重启系统。
-
-
检查SELinux或AppArmor:
在某些系统中,SELinux或AppArmor等安全模块可能会阻止su命令的正常工作。检查这些模块的日志,看看是否有相关的拒绝信息。如果是这种情况,你可能需要调整SELinux或AppArmor的策略。
如何恢复/etc/pam.d/su的默认配置?
恢复/etc/pam.d/su的默认配置取决于你的Linux发行版。不同的发行版可能有不同的默认配置。以下是一些常见发行版的默认配置示例,以及如何找到它们的方法。
通用方法:
-
查找备份文件:
在修改/etc/pam.d/su之前,你应该已经创建了备份。检查是否有类似/etc/pam.d/su.bak或/etc/pam.d/su.old这样的备份文件。如果有,直接复制回去即可:
sudo cp /etc/pam.d/su.bak /etc/pam.d/su
-
从其他相同版本的系统复制:
如果你有另一台运行相同Linux发行版和版本的机器,你可以从该机器上复制/etc/pam.d/su文件。
特定发行版方法:
-
Debian/Ubuntu:
Debian和Ubuntu通常使用pam-auth-update工具来管理PAM配置。你可以尝试重新运行此工具来恢复默认配置:
sudo pam-auth-update --force
这将重新配置所有PAM模块,包括su。
或者,你可以查看/usr/share/pam-configs/目录,找到与su相关的配置文件(如果有的话),并手动恢复/etc/pam.d/su。
-
CentOS/RHEL/Fedora:
这些发行版通常没有提供直接恢复单个PAM配置文件的工具。你可以尝试从安装介质或软件包中提取默认的/etc/pam.d/su文件。
-
从RPM包中提取:
首先,确定哪个RPM包包含/etc/pam.d/su文件。你可以使用rpm -qf命令:
rpm -qf /etc/pam.d/su
然后,从RPM包中提取文件:
rpm2cpio <package_name>.rpm | cpio -idmv ./etc/pam.d/su
将
.rpm替换为实际的RPM包文件名。这将在当前目录下创建一个etc/pam.d/su文件,你可以将其复制到/etc/pam.d/su。
-
-
Arch Linux:
Arch Linux通常不提供默认的/etc/pam.d/su文件。用户需要根据自己的需求手动创建。你可以参考Arch Wiki上的PAM页面,了解如何配置su。
默认配置示例:
以下是一些常见发行版的/etc/pam.d/su默认配置示例。请注意,这些示例可能因发行版版本而异。
-
Debian/Ubuntu (可能):
#%PAM-1.0 auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so group=wheel auth include system-auth account required pam_permit.so session required pam_unix.so
-
CentOS/RHEL/Fedora (可能):
#%PAM-1.0 auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust members of the wheel group. #auth sufficient pam_wheel.so use_uid auth include system-auth account required pam_unix.so session required pam_unix.so session optional pam_keyinit.so force revoke
警告:
- 在恢复默认配置之前,请务必备份当前的/etc/pam.d/su文件,以便在出现问题时可以恢复。
- 恢复默认配置可能会影响系统的安全性。请仔细评估你的需求,并根据需要进行调整。
禁用su命令后,如何进行用户切换和权限提升?
即使禁用了su命令,仍然有其他方法可以进行用户切换和权限提升,这对于系统管理和日常使用至关重要。
-
使用sudo命令:
sudo是替代su最常用的方法。它允许授权用户以其他用户(通常是root)的身份执行命令。
-
以root用户身份执行单个命令:
sudo <command>
例如,要以root用户身份编辑/etc/fstab文件,可以执行:
sudo vi /etc/fstab
-
以root用户身份打开一个shell:
sudo bash
或者
sudo su -
这将打开一个具有root权限的shell。
-
以其他用户身份执行命令:
sudo -u <username> <command>
例如,要以www-data用户身份执行命令,可以执行:
sudo -u www-data whoami
要使用sudo,用户必须在/etc/sudoers文件中具有相应的权限。可以使用visudo命令安全地编辑此文件。
-
-
使用pkexec命令:
pkexec是PolicyKit提供的命令,允许授权用户以其他用户身份(通常是root)执行命令,而无需输入root密码。它通常用于图形应用程序,但也可以在命令行中使用。
pkexec <command>
例如,要以root用户身份运行gedit文本编辑器,可以执行:
pkexec gedit
pkexec的权限由PolicyKit策略控制。这些策略通常位于/usr/share/polkit-1/actions/和/etc/polkit-1/rules.d/目录中。
-
使用ssh命令:
如果允许root用户通过SSH登录,你可以使用ssh命令以root用户身份登录到本地或远程系统。
ssh root@localhost
或者,以其他用户身份登录:
ssh <username>@localhost
然后,可以使用sudo命令提升权限。
-
使用runuser命令:
runuser命令用于以其他用户身份运行命令。它通常与sudo结合使用。
sudo runuser -l <username> -c <command>
例如,要以www-data用户身份运行whoami命令,可以执行:
sudo runuser -l www-data -c whoami
-l选项模拟完全的登录环境,包括加载用户的环境变量和启动文件。
-
使用machinectl shell命令 (systemd):
在systemd系统中,可以使用machinectl shell命令进入容器或虚拟机的shell。
machinectl shell <container_name>
这将在容器或虚拟机中打开一个shell,你可以使用sudo命令提升权限。
-
使用setuid程序:
setuid程序是一种以程序所有者的权限运行的程序,无论执行程序的用户是谁。这允许普通用户执行需要root权限的操作。
-
创建setuid程序:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { setuid(0); // 设置用户ID为root system("/usr/bin/some_command"); // 执行需要root权限的命令 return 0; }
-
编译setuid程序:
gcc setuid_program.c -o setuid_program
-
设置setuid权限:
sudo chown root:root setuid_program sudo chmod 4755 setuid_program
警告:
setuid程序可能存在安全风险,因为它们允许普通用户以root权限执行代码。请谨慎使用,并确保程序经过充分的安全审查。
-
-
使用Capabilities:
Capabilities允许将root权限细分为更小的权限单元,并授予特定程序或用户这些权限单元。
-
授予Capabilities:
sudo setcap cap_net_bind_service=+ep /usr/bin/some_program
这将授予/usr/bin/some_program程序绑定到特权端口(小于1024)的权限。
-
查看Capabilities:
getcap /usr/bin/some_program
警告:
Capabilities也可能存在安全风险。请仔细评估你的需求,并仅授予必要的权限。
-
如何监控和审计用户权限变更?
监控和审计用户权限变更对于维护系统安全至关重要。以下是一些常用的方法和工具。
-
使用auditd:
auditd是Linux审计系统的用户空间组件。它可以记录系统上发生的各种事件,包括用户权限变更。
-
安装auditd:
sudo apt-get install auditd # Debian/Ubuntu sudo yum install auditd # CentOS/RHEL/Fedora
-
配置auditd:
编辑/etc/audit/audit.rules文件,添加规则来记录用户权限变更事件。例如,要记录对/etc/sudoers文件的所有访问,可以添加以下规则:
-w /etc/sudoers -p wa -k sudoers_changes
-w选项指定要监视的文件或目录。-p选项指定要监视的权限(w表示写,a表示属性)。-k选项指定一个关键字,用于在日志中标记事件。
-
启动auditd:
sudo systemctl start auditd
-
查看审计日志:
使用ausearch命令查看审计日志。例如,要查找与sudoers_changes关键字相关的事件,可以执行:
sudo ausearch -k sudoers_changes
-
使用auditctl命令:
auditctl命令用于动态管理审计规则。例如,要添加一个临时的审计规则,可以执行:
sudo auditctl -w /etc/passwd -p wa -k passwd_changes
-
-
使用syslog:
syslog是Linux系统日志的标准。许多应用程序和系统服务都会将日志消息发送到syslog。你可以配置syslog来记录用户权限变更事件。
-
配置syslog:
编辑/etc/syslog.conf或/etc/rsyslog.conf文件,添加规则来将与用户权限变更相关的日志消息发送到特定的文件。
-
查看日志文件:
查看配置的日志文件,查找与用户权限变更相关的消息。
-
-
使用acct工具:
acct工具用于记录用户活动,包括登录、注销和执行的命令。
-
安装acct:
sudo apt-get install acct # Debian/Ubuntu sudo yum install psacct # CentOS/RHEL/Fedora
-
启动acct:
sudo systemctl start acct
-
查看用户活动:
使用lastcomm命令查看用户执行的命令。
lastcomm
使用sa命令查看用户活动统计信息。
sa
-
-
监控/etc/passwd、/etc/group、/etc/shadow文件:
这些文件包含用户账户和组的信息。你可以使用文件完整性监控工具(例如AIDE或Tripwire)来监视这些文件的更改。
-
安装AIDE:
sudo apt-get install aide # Debian/Ubuntu sudo yum install aide # CentOS/RHEL/Fedora
-
配置AIDE:
编辑/etc/aide.conf文件,指定要监视的文件和目录。
-
初始化AIDE数据库:
sudo aide --init
-
检查文件完整性:
sudo aide --check
-
-
使用SELinux或AppArmor:
SELinux和AppArmor是Linux安全模块,可以用于限制进程的权限。它们也可以记录安全事件,包括用户权限变更。
-
查看SELinux日志:
sudo ausearch -m avc
-
查看AppArmor日志:
sudo aa-logprof
-
-
使用脚本和自动化工具:
你可以编写脚本来定期检查用户权限,并将结果发送到日志文件或警报系统。例如,你可以编写一个脚本来检查/etc/sudoers文件的更改,并将更改发送到电子邮件。
-
使用SIEM系统:
安全信息和事件管理(SIEM)系统可以收集和分析来自多个来源的日志数据,包括用户权限变更事件。SIEM系统可以帮助你识别潜在的安全威胁,并采取相应的措施。
如何做好Linux服务器的权限管理?
做好Linux服务器的权限管理是确保系统安全的关键。一个良好的权限管理策略可以防止未经授权的访问、数据泄露和恶意攻击。
-
最小权限原则:
这是权限管理的核心原则。只授予用户执行其工作所需的最小权限。避免授予用户不必要的root权限。
-
使用用户组:
将用户组织成组,并为组分配权限。这比为单个用户分配权限更有效率,也更容易管理。
-
创建用户组:
sudo groupadd <group_name>
-
将用户添加到用户组:
sudo usermod -a -G <group_name> <username>
-
更改文件或目录的组所有权:
sudo chgrp <group_name> <file_or_directory>
-
-
正确设置文件和目录权限:
使用chmod命令设置文件和目录的权限。
-
文件权限:
- r (read): 允许读取文件内容。
- w (write): 允许修改文件内容。
- x (execute): 允许执行文件。
-
目录权限:
- r (read): 允许列出目录内容。
- w (write): 允许在目录中创建或删除文件。
- x (execute): 允许进入目录。
-
使用数字模式设置权限:
sudo chmod 755 <file_or_directory> # 所有者读写执行,组和其他用户只读执行 sudo chmod 644 <file> # 所有者读写,组和其他用户只读
-
使用符号模式设置权限:
sudo chmod u+x <file> # 授予所有者执行权限 sudo chmod g-w <file> # 移除组的写权限
-
-
使用ACL(Access Control Lists):
ACL提供了比基本文件权限更细粒度的控制。它们允许你为特定用户或组分配特定的权限,即使这些用户或组不是文件或目录的所有者。
-
安装ACL工具:
sudo apt-get install acl # Debian/Ubuntu sudo yum install acl # CentOS/RHEL/Fedora
-
设置ACL权限:
sudo setfacl -m u:<username>:rwx <file_or_directory> # 授予特定用户读写执行权限 sudo setfacl -m g:<group_name>:rx <file_or_directory> # 授予特定组读执行权限
-
查看ACL权限:
getfacl <file_or_directory>
-
-
限制sudo的使用:
只允许信任的用户使用sudo。使用visudo命令编辑/etc/sudoers文件,并仔细配置用户的sudo权限。
-
允许特定用户执行所有命令:
<username> ALL=(ALL:ALL) ALL
-
允许特定用户执行特定命令:
<username> ALL=(ALL:ALL) /usr/bin/apt-get update, /usr/bin/apt-get upgrade
-
要求用户输入密码:
Defaults passwd_timeout=5
-
-
禁用不必要的服务和账户:
禁用所有不需要的服务和账户。删除所有不使用的用户账户。
-
定期审查权限:
定期审查用户权限,确保它们仍然符合最小权限原则。
-
**使用双因素认证(2