如何禁止Linux用户su切换 /etc/pam.d/su配置限制技巧

禁止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配置限制技巧

禁止Linux用户使用su命令切换用户,核心在于修改/etc/pam.d/su的PAM(Pluggable Authentication Modules)配置文件。这允许你控制哪些用户可以执行su,甚至完全禁用su命令。

如何禁止Linux用户su切换 /etc/pam.d/su配置限制技巧

解决方案:

如何禁止Linux用户su切换 /etc/pam.d/su配置限制技巧

要禁止特定用户使用su命令,或者限制只有特定用户才能使用,你需要编辑/etc/pam.d/su文件。

  1. 编辑/etc/pam.d/su文件

    如何禁止Linux用户su切换 /etc/pam.d/su配置限制技巧

    使用你喜欢的文本编辑器,以root权限打开/etc/pam.d/su。例如:

    sudo vi /etc/pam.d/su
  2. 添加或修改规则

    在文件中找到类似于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文件中,认证将被拒绝。

  3. 保存并关闭文件

    保存对/etc/pam.d/su的更改,并关闭编辑器。

  4. 测试配置

    尝试使用受影响的用户账户通过su命令切换到root或其他用户。确保配置按照预期工作。

如何确认/etc/pam.d/su的修改生效?

修改/etc/pam.d/su后,最直接的验证方法就是尝试使用su命令切换用户。

  1. 使用受限用户尝试su

    如果你配置了只允许特定用户使用su,尝试使用一个不在允许列表中的用户执行su命令。如果配置正确,你应该会看到类似“su: Authentication failure”或者其他错误信息,表明认证失败。

  2. 检查系统日志

    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命令,以及认证是否成功。

  3. 使用pamdump命令

    pamdump命令可以显示指定服务(例如su)的PAM配置。虽然它不能直接告诉你配置是否生效,但可以帮助你确认/etc/pam.d/su文件中的配置是否正确。

    pamdump su

    查看输出,确认你所做的修改已经正确地反映在PAM配置中。

  4. 重启sshd服务(如果通过SSH测试)

    如果你的测试涉及到通过SSH连接的用户,并且你修改了与SSH会话相关的PAM配置,可能需要重启sshd服务才能使更改生效。

    sudo systemctl restart sshd

    但请注意,这可能会中断现有的SSH连接,因此请谨慎操作。

  5. 使用su -命令

    su -命令会模拟完全的登录环境,包括加载用户的环境变量和启动文件。与简单的su命令相比,它可能触发不同的PAM配置路径。因此,在测试时,也应该尝试使用su -命令。

/etc/pam.d/su配置错误导致无法su到root怎么办?

不小心错误配置了/etc/pam.d/su,导致无法使用su命令切换到root用户,这确实是个麻烦的问题。但通常有几种方法可以解决,具体取决于你的系统配置和错误类型。

  1. 使用sudo命令

    如果你的用户账户在sudoers文件中具有root权限,你可以使用sudo命令来执行需要root权限的操作,而无需使用su。例如:

    sudo bash

    或者

    sudo vi /etc/pam.d/su

    这允许你绕过su的PAM配置,直接以root权限执行命令。

  2. 通过SSH以root用户登录

    如果允许root用户通过SSH登录(通常不建议这样做,但如果你的系统是这样配置的),你可以尝试通过SSH直接以root用户登录,然后修复/etc/pam.d/su文件。

    ssh root@your_server_ip

    登录后,使用文本编辑器修复/etc/pam.d/su文件。

  3. 使用单用户模式(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
  4. 使用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
    • 重启系统。

  5. 检查SELinux或AppArmor

    在某些系统中,SELinux或AppArmor等安全模块可能会阻止su命令的正常工作。检查这些模块的日志,看看是否有相关的拒绝信息。如果是这种情况,你可能需要调整SELinux或AppArmor的策略。

如何恢复/etc/pam.d/su的默认配置?

恢复/etc/pam.d/su的默认配置取决于你的Linux发行版。不同的发行版可能有不同的默认配置。以下是一些常见发行版的默认配置示例,以及如何找到它们的方法。

通用方法:

  1. 查找备份文件

    在修改/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
  2. 从其他相同版本的系统复制

    如果你有另一台运行相同Linux发行版和版本的机器,你可以从该机器上复制/etc/pam.d/su文件。

特定发行版方法:

  1. Debian/Ubuntu

    Debian和Ubuntu通常使用pam-auth-update工具来管理PAM配置。你可以尝试重新运行此工具来恢复默认配置:

    sudo pam-auth-update --force

    这将重新配置所有PAM模块,包括su。

    或者,你可以查看/usr/share/pam-configs/目录,找到与su相关的配置文件(如果有的话),并手动恢复/etc/pam.d/su。

  2. 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。

  3. 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命令,仍然有其他方法可以进行用户切换和权限提升,这对于系统管理和日常使用至关重要。

  1. 使用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命令安全地编辑此文件。

  2. 使用pkexec命令

    pkexec是PolicyKit提供的命令,允许授权用户以其他用户身份(通常是root)执行命令,而无需输入root密码。它通常用于图形应用程序,但也可以在命令行中使用。

    pkexec <command>

    例如,要以root用户身份运行gedit文本编辑器,可以执行:

    pkexec gedit

    pkexec的权限由PolicyKit策略控制。这些策略通常位于/usr/share/polkit-1/actions/和/etc/polkit-1/rules.d/目录中。

  3. 使用ssh命令

    如果允许root用户通过SSH登录,你可以使用ssh命令以root用户身份登录到本地或远程系统。

    ssh root@localhost

    或者,以其他用户身份登录:

    ssh <username>@localhost

    然后,可以使用sudo命令提升权限。

  4. 使用runuser命令

    runuser命令用于以其他用户身份运行命令。它通常与sudo结合使用。

    sudo runuser -l <username> -c <command>

    例如,要以www-data用户身份运行whoami命令,可以执行:

    sudo runuser -l www-data -c whoami

    -l选项模拟完全的登录环境,包括加载用户的环境变量和启动文件。

  5. 使用machinectl shell命令 (systemd)

    在systemd系统中,可以使用machinectl shell命令进入容器或虚拟机的shell。

    machinectl shell <container_name>

    这将在容器或虚拟机中打开一个shell,你可以使用sudo命令提升权限。

  6. 使用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权限执行代码。请谨慎使用,并确保程序经过充分的安全审查。

  7. 使用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也可能存在安全风险。请仔细评估你的需求,并仅授予必要的权限。

如何监控和审计用户权限变更?

监控和审计用户权限变更对于维护系统安全至关重要。以下是一些常用的方法和工具。

  1. 使用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
  2. 使用syslog

    syslog是Linux系统日志的标准。许多应用程序和系统服务都会将日志消息发送到syslog。你可以配置syslog来记录用户权限变更事件。

    • 配置syslog

      编辑/etc/syslog.conf或/etc/rsyslog.conf文件,添加规则来将与用户权限变更相关的日志消息发送到特定的文件。

    • 查看日志文件

      查看配置的日志文件,查找与用户权限变更相关的消息。

  3. 使用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
  4. 监控/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
  5. 使用SELinux或AppArmor

    SELinux和AppArmor是Linux安全模块,可以用于限制进程的权限。它们也可以记录安全事件,包括用户权限变更。

    • 查看SELinux日志

      sudo ausearch -m avc
    • 查看AppArmor日志

      sudo aa-logprof
  6. 使用脚本和自动化工具

    你可以编写脚本来定期检查用户权限,并将结果发送到日志文件或警报系统。例如,你可以编写一个脚本来检查/etc/sudoers文件的更改,并将更改发送到电子邮件。

  7. 使用SIEM系统

    安全信息和事件管理(SIEM)系统可以收集和分析来自多个来源的日志数据,包括用户权限变更事件。SIEM系统可以帮助你识别潜在的安全威胁,并采取相应的措施。

如何做好Linux服务器的权限管理?

做好Linux服务器的权限管理是确保系统安全的关键。一个良好的权限管理策略可以防止未经授权的访问、数据泄露和恶意攻击。

  1. 最小权限原则

    这是权限管理的核心原则。只授予用户执行其工作所需的最小权限。避免授予用户不必要的root权限。

  2. 使用用户组

    将用户组织成组,并为组分配权限。这比为单个用户分配权限更有效率,也更容易管理。

    • 创建用户组

      sudo groupadd <group_name>
    • 将用户添加到用户组

      sudo usermod -a -G <group_name> <username>
    • 更改文件或目录的组所有权

      sudo chgrp <group_name> <file_or_directory>
  3. 正确设置文件和目录权限

    使用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>              # 移除组的写权限
  4. 使用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>
  5. 限制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
  6. 禁用不必要的服务和账户

    禁用所有不需要的服务和账户。删除所有不使用的用户账户。

  7. 定期审查权限

    定期审查用户权限,确保它们仍然符合最小权限原则。

  8. **使用双因素认证(2

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享