Linux安全加固之账户安全加固


一、账号安全的重要性

在当今很多网络系统都以用户名(帐号)和口令作为鉴权方式,口令的重要性就可想而知了。口令就相当手进入家门的钥匙,当他人有一把可以进入你家的钥匙,想想你的安全、你的财物、你的隐私。。。害怕了吧。因为弱口令很容易被他人猜到或破解,所以如果你使用弱口令,就像把家门钥匙放在家门口的垫子下面,是非常危险的。

一般攻击者的渗透过程都会经过如下几个阶段:

  • 扫描探测=>渗透攻击=>攻陷入侵=>恶意行为。

1.1 扫描探测

扫描探测:攻击者在攻击前的对目标的扫描,包括网络扫描、系统扫描、端口、漏洞扫描等,扫描行为是攻击入侵的前期准备阶段,通过信息收集,掌握目标机器的系统,漏洞信息,对进一步进行入侵攻击有事半功倍的效果。

  • 如使用netdiscover/nmap等工具

1.2 渗透攻击

该阶段是已经对目标机器做了扫描,或是直接对目标机器进行攻击,包括利用系统栈堆方面的漏洞,利用Web系统平台方面的漏洞,逻辑配置错误方面的漏洞,内存破坏方面的漏洞等,对目标主机发起攻击。

  • 如使用hydra进行口令爆破

1.3 攻陷入侵

该阶段表示了目标主机已经被黑客成功攻陷,接下来攻击者可以做他想做的事情,攻陷阶段的表现形式比如,SSH登录成功,FTP登录成功。

  • 如下,通过hydra成功爆破出ssh的账号密码,然后进行登录。

1.4 恶意行为

攻击者在目标主机可能进行删库,修改配置文件,下载数据库文件或者安装完恶意软件后进行对主机进行恶意操作等。

小结

通过上述示例,我们可以了解到如果账户和口令安全性较低会大大增加被攻陷入侵的可能性,因此账号口令安全加固的重要性不言而喻。

一般而言,一种常见的加固思路比如:修改用户口令有效机制,用户离开工作岗位一段时间后,其账户自动失效,就算管理员忘记删除该账户,该账户也不会给系统带来危害。

二、账户期限加固

2.1 /etc/login.defs文件

/etc/login.defs 是一个系统配置文件,它包含了许多与用户账户和密码相关的配置选项。在类 Unix 系统中,这个文件定义了系统级的用户账户和密码管理的默认值和限制。不同的系统和发行版可能会有不同的配置选项,但以下是一些常见的配置项:

  1. PASS_MAX_DAYS:密码的最大有效天数。
  2. PASS_MIN_DAYS:密码的最小有效天数。
  3. PASS_WARN_AGE:在密码过期前多少天开始警告用户。
  4. ENCRYPT_METHOD:密码加密的方法。
  5. UID_MINUID_MAX:系统用户和组的最小和最大用户ID。
  6. GID_MINGID_MAX:系统组的最小和最大组ID。
  7. CREATE_HOME:当创建新用户时是否创建家目录。
  8. UMASK:新文件的默认权限掩码。
  9. USERGROUPS_ENAB:是否允许用户属于多个组。
  10. MAIL_DIR:用户的邮件目录。
  11. MAIL_FILE:用户的邮件文件。
  12. SU_NAME:默认的超级用户名称。

修改 /etc/login.defs 文件可以改变这些默认值,但通常需要管理员权限。在修改此文件时应该非常小心,因为错误的配置可能会导致安全问题或系统功能不正常。在编辑文件后,通常需要重新启动相关的服务或者系统,以使更改生效。对于大多数更改,你可能需要重新启动 pam(可插拔认证模块)服务或者重启系统。

通常要修改下面两个个字段:

  1. PASS_MAX_DAYS:密码的最大有效天数。
  2. PASS_WARN_AGE:在密码过期前多少天开始警告用户。

2.2 /etc/default/useradd文件

/etc/default/useradd 文件中,INACTIVEEXPIRE 是两个与用户账户过期相关的配置项:

  1. INACTIVE:这个配置项用来设置密码过期后账户被禁用之前的天数。如果 INACTIVE 设置为 -1,则表示账户不会因密码过期而被禁用,这是默认值。如果设置为其他值,比如 30,则表示如果用户在密码过期后30天内没有更新密码,账户将被禁用。
  2. EXPIRE:这个配置项用来设置账户的过期日期。如果设置了 EXPIRE,那么账户将在指定的日期后过期。日期格式通常是 MM/DD/YYYYYY-MM-DD。如果没有设置 EXPIRE 或者留空,那么账户将不会过期。

例如,如果你想要设置一个新用户的账户在密码过期后7天内被禁用,以及账户在2024年12月31日过期,你可以在 /etc/default/useradd 文件中设置如下:

INACTIVE=7
EXPIRE=2024-12-31

这样,任何新添加的用户都将遵循这些默认设置。需要注意的是,这些设置只影响新添加的用户,对于已经存在的用户,需要使用 usermod 命令单独设置。

三、账号密码策略加固

3.1 密码复杂度加固

3.1.1 /etc/pam.d/system-auth简介

/etc/pam.d/system-auth 是一个非常重要的配置文件,它位于 Linux 系统中,用于定义用户认证的行为。PAM(Pluggable Authentication Modules)是一个动态链接库和一组应用程序接口(API),它们允许将多个认证机制集成到系统中的应用程序中。system-auth 文件通常用于处理系统的认证任务,如登录、密码更改等。

3.1.2 配置文件结构

/etc/pam.d/system-auth 文件包含一系列的模块条目,每个条目都指定了如何处理特定的认证请求。这些条目通常包括以下字段:

  1. 控制标志:如 auth, account, password, session,它们指定了 PAM 模块的类型。
  2. PAM 模块路径:模块的完整路径,如 pam_unix.so
  3. 模块选项:传递给 PAM 模块的参数。
  4. 模块参数:可选的,传递给 PAM 模块的额外参数。

示例:

#%PAM-1.0
auth        required      pam_env.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        [default=die] pam_faillock.so preauth silent audit deny=5 unlock_time=900
auth        sufficient    pam_succeed_if.so uid >= 1000 quiet
auth        required      pam_deny.so

account     required      pam_access.so
account     required      pam_unix.so broken_shadow
account     [default=bad success=ok user_unknown=ignore] pam_succeed_if.so quiet

password    requisite    pam_pwquality.so retry=3
password    sufficient    pam_unix.so md5 shadow use_authtok try_first_pass
password    [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
password    [default=1] pam_faillock.so authsucc audit deny=5 unlock_time=900
password    sufficient    pam_deny.so

session     optional      pam_keyinit.so force revoke
session     required      pam_limits.so
session     [default=1]   pam_succeed_if.so service in crond quiet use_uid
session     sufficient    pam_unix.so
  • ubuntu系统没有/etc/pam.d/system-auth文件?【/etc/pam.d/common-password】

在Ubuntu系统中,/etc/pam.d/system-auth 文件可能不存在,这是因为Ubuntu使用的是不同的文件来处理PAM(Pluggable Authentication Modules)配置。Ubuntu系统中与密码设置及登录控制相关的文件通常是 /etc/pam.d/common-password。这是因为Ubuntu和其他基于Debian的系统使用 /etc/pam.d/common-password 作为密码认证的通用配置文件,而不是像一些基于Red Hat的系统那样使用 /etc/pam.d/system-auth 文件。

因此,如果你在Ubuntu系统中寻找类似于 /etc/pam.d/system-auth 的配置文件,你应该查看 /etc/pam.d/common-password 文件,以及其他可能的 /etc/pam.d/ 目录下的文件,如 /etc/pam.d/common-auth 等,这些文件共同定义了Ubuntu系统的认证和账户管理策略。

3.1.3 密码复杂度设置

要设置密码复杂度,你需要编辑 /etc/pam.d/common-password 文件,并找到包含 pam_pwquality.sopam_cracklib.so 的行,然后添加或修改上述参数。例如,以下配置要求密码至少12个字符长,至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符,并且root用户也必须遵守这些规则:

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
minlen=N:设置密码的最小长度。例如,minlen=12 表示密码至少需要12个字符。
dcredit=N:控制密码中数字的出现次数。当N>0时,表示新密码中数字出现的最大次数;当N<0时,表示新密码中数字出现的最少次数。例如,dcredit=-1 表示密码至少包含一个数字。
ucredit=N:控制密码中大写字母的出现次数。规则与 dcredit 相同。ucredit=-1 表示密码至少包含一个大写字母。
lcredit=N:控制密码中小写字母的出现次数。规则与 dcredit 相同。lcredit=-1 表示密码至少包含一个小写字母。
ocredit=N:控制密码中特殊字符的出现次数。规则与 dcredit 相同。ocredit=-1 表示密码至少包含一个特殊字符。
retry=N:定义用户在密码失败后可以重试的次数。例如,retry=3 允许用户在密码输入错误后重试3次。
difok=N:新密码与旧密码至少不同的字符数。例如,difok=3 表示新密码必须与旧密码至少有3个字符不同。
enforce_for_root:即使是root用户设置密码,也应强制执行复杂性策略。

或者,如果你使用的是 pam_cracklib.so 模块,配置可能如下:

password requisite pam_cracklib.so retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1

在进行这些更改后,为了使配置生效,你可能需要重新启动相关的服务或者系统。请记得在修改系统文件之前备份原始文件,以便在出现问题时可以恢复。

3.2 其他密码策略的配置

auth required pam_tally2.so deny=6 unlock_time=300 even_deny_root root_unlock_time=60
  • pam_tally2.so:这是一个账户锁定模块,用于防止暴力破解攻击。
  • deny=6:如果用户连续6次输入错误的密码,账户将被锁定。
  • unlock_time=300:账户锁定后,将在300秒(5分钟)后自动解锁。
  • even_deny_root:这个选项意味着即使是root用户,也会受到账户锁定的限制。
  • root_unlock_time=60:对于root用户,账户锁定时间是60秒。
password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minclass=3 minlen=8
  • pam_cracklib.so:另一个用于检查密码质量的模块。
  • try_first_pass:尝试使用前一阶段的密码。当这个选项被设置时,PAM模块会尝试使用在认证阶段(通常是用户登录时)已经输入的密码,而不是要求用户再次输入密码。这意味着如果用户在登录时输入了密码,这个密码会被“记住”,并在需要时用于密码更改操作。
  • retry=3:用户可以重试3次。
  • dcredit=-1:密码至少包含一个数字。
  • lcredit=-1:密码至少包含一个小写字母。
  • ucredit=-1:密码至少包含一个大写字母。
  • ocredit=-1:密码至少包含一个特殊字符。
  • minclass=3:密码至少包含三种不同类型的字符。
  • minlen=8:密码的最小长度为8个字符。
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
  • pam_unix.so:使用SHA-512算法来加密密码。
  • shadow:使用影子密码文件。
  • nullok:允许空密码。
  • try_first_pass:尝试使用前一阶段的密码。
  • use_authtok:使用认证阶段的密码。
  • remember=5:记住用户最近使用的5个密码,防止用户重复使用旧密码。

四、登录控制

4.1 禁止除root以外的所有用户登录

touch /etc/nologin
  1. 阻止普通用户登录:当 /etc/nologin 文件存在时,除了 root 用户之外的所有用户在尝试登录时都会收到一条消息,通常是 “/etc/nologin: Permission denied” 或者文件中定义的消息,并且登录尝试会被拒绝。这可以用于系统维护或在系统更新期间防止用户登录。

  2. 自定义登录消息:你可以在 /etc/nologin 文件中添加自定义消息,这样当用户尝试登录时,他们会看到这条消息而不是默认的拒绝消息。这可以用来通知用户系统维护的时间或者为什么他们不能登录。

  3. 系统维护:在系统需要进行维护或更新时,创建 /etc/nologin 文件是一种快速通知所有用户系统暂时不可用的方法。

例如:

echo "System maintenance in progress. Please try again later." > /etc/nologin

这将会在 /etc/nologin 文件中写入一条消息,告知用户系统正在进行维护。

请注意,创建 /etc/nologin 文件是一个影响所有非 root 用户的操作,因此在执行此操作之前应该谨慎考虑,并确保所有受影响的用户都得到了适当的通知。

五、账户权限控制

5.1 /etc/sudoers简介

/etc/sudoers 文件是 Unix 和类 Unix 系统中用于定义哪些用户可以执行哪些命令以及他们可以在哪台机器上执行这些命令的核心配置文件。这个文件是 sudo 工具的基础,sudo 允许授权的用户以其他用户的安全权限执行命令,默认情况下是以超级用户(root)的权限执行。

编辑 /etc/sudoers 文件需要非常小心,因为错误的配置可能导致系统无法正常使用 sudo 命令。推荐使用 visudo 命令来编辑这个文件,因为 visudo 会在保存前检查语法错误,从而防止配置错误。

5.2 sudders配置示例

# 允许用户 alice 从任何主机执行任何命令,不需要密码
alice ALL=(ALL) NOPASSWD: ALL

# 允许用户 bob 仅在本地主机执行命令,需要密码
bob localhost=(ALL) ALL

# 允许整个 wheel 组的用户在任何主机上执行命令,需要密码
%wheel ALL=(ALL) ALL

# 定义一个命令别名,例如定义一个只允许重启服务的别名
Cmnd_Alias REBOOT = /sbin/shutdown -r now, /sbin/reboot

# 允许用户 carol 执行 REBOOT 别名中的命令,不需要密码
carol ALL=(ALL) NOPASSWD: REBOOT
zhangsan ALL=NOPASSWD: /bin/passwd, !/bin/passwd root
  1. zhangsan**:这是用户名,表示这个配置规则适用于名为 zhangsan 的用户。
  2. ALL:这表示该规则适用于所有主机。zhangsan 用户可以在任何主机上使用以下命令。
  3. =NOPASSWD:这是一个选项,表示在执行后面的命令时,不需要输入密码。NOPASSWD 是一个常用的 sudo 选项,用于提高便利性,但需要注意这可能会带来安全风险。
  4. /bin/passwd:这是一个命令别名,通常用于更改用户密码。在这里,它允许 zhangsan 用户更改任何用户的密码,包括自己的。
  5. !/bin/passwd root:这里的感叹号 ! 表示否定,即 zhangsan 用户不允许使用 /bin/passwd 命令来更改 root 用户的密码。

综合来看,这行配置允许用户 zhangsan 在所有主机上更改任何用户的密码,但有一个例外:zhangsan 不能更改 root 用户的密码,即使不需要输入密码。这种配置可以用于赋予特定用户管理其他用户密码的权限,同时保留对 root 密码的控制权。

root    ALL=(ALL:ALL) ALL
# 这一行赋予 root 用户在所有主机(ALL)上以任何用户身份(ALL)执行任何命令(ALL)的权限。

%admin ALL=(ALL) ALL
# 这一行允许 admin 组的所有成员在所有主机上执行任何命令。% 符号用于表示组,而不是单个用户。

%sudo   ALL=(ALL:ALL) ALL
# 这一行允许 sudo 组的成员在所有主机上以任何用户身份执行任何命令。

@includedir /etc/sudoers.d
# 这一行是一个指令,告诉 sudo 去 /etc/sudoers.d 目录下包含额外的配置文件。这些文件通常用于为个别用户或组设置更精细的权限,而不必编辑主 /etc/sudoers 文件
  • root ALL=(ALL:ALL) ALL
  1. root:这是用户名,表示这个配置规则适用于 root 用户。
  2. ALL:这是主机(或主机组)的指定,表示这个规则适用于所有主机。当你想要为特定主机或一组主机设置权限时,你可以在这里指定主机名或使用通配符。
  3. **=(ALL:ALL)**:这是委托(Delegation)部分,它定义了用户可以以哪些用户的身份执行命令。
    • **(ALL:ALL)**:括号内的部分表示用户可以以所有用户(ALL)的身份在所有组(ALL)中执行命令。这意味着 root 用户可以切换到任何用户和组。
  4. ALL:这是命令的指定,表示这个规则适用于所有命令。也就是说,root 用户可以执行任何命令。

综合来看,这个条目意味着 root 用户在所有主机上可以以任何用户的身份执行任何命令。这是 root 用户的默认权限,通常不需要在 /etc/sudoers 文件中显式写出,因为 root 用户默认就有所有权限。但是,为了清晰和完整性,有时管理员会在 /etc/sudoers 文件中显式地声明这一点。

  • 主机的概念

/etc/sudoers 文件中的 “主机”(Host)指定部分,指的是 sudo 命令可以被执行的计算机或服务器。这个概念允许管理员为不同的机器设置不同的权限规则。以下是一些具体的例子:

  1. 特定主机:你可以为特定的主机设置 sudo 权限。例如,user host1=(ALL) ALL 表示用户在名为 host1 的主机上可以执行任何命令。
  2. 所有主机:使用 ALL 表示规则适用于所有主机。例如,user ALL=(ALL) ALL 允许用户在所有主机上执行任何命令。
  3. 主机组:在某些系统中,你可以定义主机组,并为整个组设置权限。例如,如果你有一个名为 webservers 的主机组,你可以设置 user @webservers=(ALL) ALL 来允许用户在所有属于 webservers 组的主机上执行命令。
  4. IP 地址:你也可以使用 IP 地址来指定主机。例如,user 192.168.1.100=(ALL) ALL 允许用户在 IP 地址为 192.168.1.100 的主机上执行命令。
  5. 网络范围:使用网络范围指定主机,如 user 192.168.1.%=(ALL) ALL 允许用户在 192.168.1. 网络范围内的所有主机上执行命令。

在远程管理多个服务器的环境中,这种灵活性允许管理员为不同的服务器设置不同的访问控制策略,以增强安全性和管理效率。

5.3 查找除root之外uid为0的用户并将其删除

  • 这个命令使用 awk 工具来处理 /etc/passwd 文件。/etc/passwd 是一个存储系统用户账户信息的文件。
  • -F: 指定了字段分隔符为冒号 :
  • ($3==0) 是一个条件表达式,检查第三个字段(用户 ID,通常是 UID)是否为0。在 Unix 和类 Unix 系统中,UID 为0通常表示 root 用户。
  • {print $1} 如果条件为真,则打印出第一个字段,即用户名。
  • 但是,这个命令有一个语法错误。正确的命令应该是 awk -F: '$3==0 {print $1}' /etc/passwd,这样它会打印出所有 UID 为0的用户名。

如果发现test用户uid为0,将其删除:

userdel -r -f test
  • 这个命令用于删除用户 test
  • -r 选项表示同时删除用户的家目录和邮件队列。
  • -f 选项表示强制删除用户,即使用户当前登录也不会影响删除操作。

5.4 高权限文件

5.4.1 检查是否有文件存在过高的权限

find / -type f \( -perm -0007 \) | xargs -I {} ls -lh {}
  • find / -type f:从根目录 / 开始查找所有类型为文件的项。
  • (-perm -0007):查找权限为 7(即所有用户都有读、写、执行权限)的文件。
  • xargs -I {} ls -lh {}:对找到的每个文件执行 ls -lh 命令,显示详细信息,包括文件权限、所有者、大小和修改日期。

5.4.2 去掉所有文件的 SUID 和 SGID

find / -type f \( -perm -4000 -o -perm -2000 \) | xargs -I {} chmod ug-s {}
  • find / -type f:同样从根目录开始查找所有文件。
  • (-perm -4000 -o -perm -2000):查找设置了 SUID(4000)或 SGID(2000)位的文件。
  • xargs -I {} chmod ug-s {}:对找到的每个文件执行 chmod ug-s 命令,移除 SUID 和 SGID 位。

5.5 禁止使用任意用户 rlogin 登录

cat /dev/null > /root/.rhosts
  • cat /dev/null:创建一个空文件。
  • > /root/.rhosts:将这个空文件重定向到 /root/.rhosts。这个文件用于控制哪些远程用户可以通过 rlogin 访问 root 用户。清空这个文件可以防止任何用户通过 rlogin (远程登录)登录为 root。

这些命令用于增强系统的安全性,通过限制权限和控制访问来减少潜在的安全风险。

5.6 启动脚本文件权限管理

  1. 任务描述:检查并修复启动脚本文件权限,以防止潜在的安全漏洞,如未授权访问或恶意软件(木马)的植入。
  2. 命令和输出
    • ls -l /etc/rc.d/init.d:列出 /etc/rc.d/init.d 目录下的所有文件及其权限。这个目录通常包含系统启动时运行的脚本。
    • 输出显示了多个文件的权限,其中一些文件具有 rwx(读、写、执行)权限,这意味着所有用户都可以执行这些脚本,这可能是一个安全风险。
  3. 修复命令
    • chmod 700 /etc/rc.d/init.d/*:将 /etc/rc.d/init.d 目录下所有文件的权限更改为 700,这意味着只有文件所有者(通常是 root)可以读取、写入和执行这些文件,增强安全性。

5.7 限制用户使用 su 切换到 root

  1. 任务描述:配置系统以限制只有特定组(如 wheel 组)的用户才能使用 su 命令切换到 root 用户。
  2. 配置步骤
    • 编辑 /etc/pam.d/su 文件,添加 auth required pam_wheel.so group=wheel。这行配置确保只有 wheel 组的成员才能使用 su 命令切换到 root。
  3. 验证步骤
    • 使用 grep wheel /etc/group 检查 wheel 组的成员。输出显示 zhangsan 是 wheel 组的成员。
    • 尝试使用 su -l root 命令切换到 root 用户。zhangsan 成功切换到 root,而 lisi 因为不是 wheel 组的成员,尝试失败并收到 “Permission denied” 的消息。

总结:

Linux系统账户安全加固对于保护服务器和数据至关重要。通过限制SUID和SGID位,可以防止恶意程序获取过高权限;严格管理文件权限,避免未授权访问;使用chmod命令限制启动脚本的访问权限,防止恶意代码执行。此外,通过配置/etc/pam.d/su文件,限制只有特定用户组能使用su切换到root,进一步增强安全性。这些措施共同构建了一个更加安全的环境,防止未授权访问、数据泄露和系统被恶意软件感染,确保系统稳定性和数据完整性。


文章作者: 司晓凯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 司晓凯 !
  目录