重要的是,所有未用于登录的系统和供应商帐户都应被锁定。要获取系统上已解锁的帐户列表,您可以检查 /etc/shadow 文件中没有以 ! 或 * 开头的加密密码字符串的帐户。如果您使用 passwd -l 或 usermod -L 锁定帐户,它会在加密密码前加上 !,从而有效地禁用密码。许多系统和共享帐户默认情况下通过使用 *、!! 或 !* 作为密码字段来锁定,这会将加密密码转换为无效字符串。因此,要获取所有已解锁(可加密)帐户的列表,请运行以下命令
# egrep -v ':\*|:\!' /etc/shadow | awk -F: '{print $1}'此外,请确保所有帐户在 /etc/passwd 文件中的密码字段中都有一个 x。以下命令列出所有密码字段中没有 x 的帐户
# grep -v ':x:' /etc/passwd密码字段中的 x 表示密码已被隐藏,例如,需要从 /etc/shadow 文件中查找加密密码。如果 /etc/passwd 文件中的密码字段为空,则系统不会查找 shadow 文件,并且会在登录提示符处提示用户输入密码。
密码过期是一般最佳实践,但可能需要排除某些系统和共享帐户(例如,Oracle)。如果应用程序帐户过期,则使这些帐户过期可能会导致系统停机。
通常应制定公司策略,规定系统和共享帐户的密码更改规则/程序。但是,普通用户帐户的密码应自动过期。以下示例显示了如何为单个用户帐户设置密码过期。
以下文件和表中的参数可用于使用 useradd 命令创建新帐户时。这些设置存储在每个用户帐户的 /etc/shadow 文件中。如果使用 YaST 工具 () 添加用户,则这些设置在每个用户的基础上可用。以下是各种设置,其中一些也可以是系统范围的(例如,修改 /etc/login.defs 和 /etc/default/useradd)
|
|
|
密码有效的最大天数。 |
|
|
|
自上次更改以来,用户可以更改密码的最小天数。 |
|
|
|
自上次密码更改以来到下次密码更改提醒之间的天数。 |
|
|
|
在密码过期后帐户被禁用的天数。 |
|
|
|
帐户过期日期,格式为 YYYY-MM-DD。 |
在进行这些修改之前创建的用户不受影响。
确保在 /etc/login.defs 和 /etc/default/useradd 文件中更改上述参数。查看 /etc/shadow 文件可以显示这些设置在添加用户后如何存储。
要创建一个新的用户帐户,请执行以下命令
# useradd -c "TEST_USER" -g USERS TEST-g 选项指定此帐户的主组
# id TEST
uid=509(test) gid=100(users) groups=100(users)在 /etc/login.defs 和 /etc/default/useradd 中的设置记录在 /etc/shadow 文件中,如下所示
# grep TEST /etc/shadow
test:!!:12742:7:60:7:14::可以使用 chage 命令随时修改密码老化。要禁用系统和共享帐户的密码老化,您可以运行以下 chage 命令
# chage -M -1 SYSTEM_ACCOUNT_NAME要获取密码过期信息
# chage -l SYSTEM_ACCOUNT_NAME例如
# chage -l TEST
Minimum: 7
Maximum: 60
Warning: 7
Inactive: 14
Last Change: Jan 11, 2015
Password Expires: Mar 12, 2015
Password Inactive: Mar 26, 2015
Account Expires: Never在经过审计的系统中,重要的是限制人们使用容易被破解的简单密码。如果安全存储,写下复杂的密码是可以的。有人认为强密码可以保护您免受字典攻击,并且可以通过在尝试几次失败后锁定帐户来击败这些类型的攻击。但是,这并不总是可行的。如果设置如下,锁定系统帐户可能会导致您的应用程序和系统崩溃,这无异于拒绝服务攻击——另一个问题。
无论如何,重要的是实践有效的密码管理安全。大多数公司要求密码至少包含一个数字、一个小写字母和一个大写字母。策略各不相同,但保持密码强度/复杂性和管理之间的平衡可能很困难。
Linux-PAM(Linux 的可插拔身份验证模块)是一套共享库,使本地系统管理员可以选择应用程序如何验证用户。
强烈建议熟悉 PAM 的功能以及如何利用这种架构为环境提供最佳身份验证设置。可以在一次性完成此配置,并在所有系统上实施(标准),或者可以针对单个主机进行增强(增强安全性——按主机/服务/应用程序)。关键是认识到架构的灵活性。
要了解有关 PAM 架构的更多信息,请在 /usr/share/doc/packages/pam 目录中查找 PAM 文档(以各种格式)。
以下讨论是修改默认 PAM 堆栈的示例——特别是围绕密码策略——例如密码强度、密码重用和帐户锁定。虽然这些只是可能性中的几个,但它们是一个很好的起点,并展示了 PAM 的灵活性。
pam-config 限制pam-config 工具可用于配置 common-{account,auth,password,session} PAM 配置文件,其中包含全局选项。这些文件包含以下注释
# This file is autogenerated by pam-config. All changes # will be overwritten.
必须直接编辑单个服务文件,例如 login、password、sshd 和 su。您可以选择直接编辑所有文件,而不使用 pam-config,但 pam-config 包含有用的功能,例如转换旧配置、更新当前配置和进行合理性检查。有关更多信息,请参阅 man 8 pam-config。
openSUSE Leap 可以利用 pam_cracklib 库来测试弱密码——并在确定明显弱点时建议使用更强的密码。以下参数代表了可能成为公司密码策略或由于审计约束而要求的一部分示例。
PAM 库遵循定义的流程。设计完美的堆栈的最佳方法通常是考虑所有要求和策略并绘制流程图。
|
|
|
密码的最小长度为 8 |
|
|
|
小写字母的最小数量为 1 |
|
|
|
大写字母的最小数量为 1 |
|
|
|
数字的最小数量为 1 |
|
|
|
其他字符的最小数量为 1 |
要设置这些密码限制,请使用 pam-config 工具指定要配置的参数。例如,可以这样修改最小长度参数
>sudopam-config -a --cracklib-minlen=8 --cracklib-retry=3 \ --cracklib-lcredit=-1 --cracklib-ucredit=-1 --cracklib-dcredit=-1 \ --cracklib-ocredit=-1 --cracklib
现在验证新的密码限制是否适用于新密码。登录到非 root 帐户,并使用 passwd 命令更改密码。请注意,如果您以 root 用户身份运行 passwd 命令,则不会强制执行上述要求。
可以使用 pam_pwhistory 模块来配置不能重用的先前密码的数量。以下命令实施密码限制,系统要求密码不能在至少六个月后重用
>sudopam-config -a --pwhistory --pwhistory-remember=26
回想一下,在 第 14.2 节,“启用密码老化” 中,我们将 PASS_MIN_DAYS 设置为 7,这指定了允许密码更改之间的最小天数。因此,如果 pam_unix 配置为记住 26 个密码,则先前使用的密码不能重用至少六个月(26*7 天)。
PAM 配置(/etc/pam.d/common-password)来自 pam-config 命令如下所示
auth required pam_env.so auth required pam_unix.so try_first_pass account required pam_unix.so try_first_pass password requisite pam_cracklib.so password required pam_pwhistory.so remember=26 password optional pam_gnome_keyring.so use_authtok password required pam_unix.so use_authtok nullok shadow try_first_pass session required pam_limits.so session required pam_unix.so try_first_pass session optional pam_umask.so
锁定帐户在定义数量的 ssh、登录、su 或 sudo 尝试失败后是一种常见的安全做法。但是,这可能会导致停机,如果应用程序、管理员或 root 用户被锁定。
密码失败计数很容易被滥用来造成拒绝服务攻击,通过故意创建登录失败。
只有在必须这样做时才使用密码失败计数。将锁定限制为必要的最小值,并且不要锁定关键帐户。请记住,锁定不仅适用于人类用户,还适用于用于提供服务的系统帐户。
openSUSE Leap 默认情况下不锁定帐户,但提供了 PAM 模块 pam_tally2 以轻松实施密码失败计数。将以下行添加到 /etc/pam.d/login 的顶部,以在六次失败的登录后锁定所有用户(root 除外),并在十分钟后自动解锁帐户
auth required pam_tally2.so deny=6 unlock_time=600
这是一个完整的 /etc/pam.d/login 文件的示例
#%PAM-1.0 auth requisite pam_nologin.so auth include common-auth auth required pam_tally2.so deny=6 unlock_time=600 account include common-account account required pam_tally2.so password include common-password session required pam_loginuid.so session include common-session #session optional pam_lastlog.so nowtmp showfailed session optional pam_mail.so standard
您也可以锁定 root 用户,但显然您必须非常确定您想要这样做
auth required pam_tally2.so deny=6 even_deny_root unlock_time=600
您可以为 root 用户定义不同的锁定时间
auth required pam_tally2.so deny=6 root_unlock_time=120 unlock_time=600
如果您希望管理员解锁帐户,请省略 unlock_time 选项。接下来的两个示例命令显示了失败的登录尝试次数以及如何解锁用户帐户
>sudopam_tally2 -u usernameLogin Failures Latest failure From username 6 12/17/19 13:49:43 pts/1>sudopam_tally2 -r -u username
尝试访问的默认位置记录在 /var/log/tallylog 中。
如果用户在登录超时到期后或管理员重置其帐户后成功登录,则计数器将重置为 0。
配置其他登录服务以在 /etc/pam.d/ 中的各自配置文件中使用 pam_tally2:sshd, su, sudo, sudo-i 和 su-l。
默认情况下,root 用户被分配了密码,并且可以使用各种方法登录——例如,在本地终端上、在图形会话中或通过 SSH 远程登录。应尽可能限制这些方法。应避免共享 root 帐户的使用。相反,各个管理员应使用诸如 su 或 sudo(有关更多信息,请键入 man 1 su 或 man 8 sudo)之类的工具来获取提升的权限。这允许将 root 登录与特定用户关联起来。这还增加了一层安全性;不仅 root 密码,而且 root 和 管理员常规帐户的密码都需要被破解才能获得完全的 root 访问权限。本节说明如何在系统的不同级别限制直接 root 登录。
TTY 设备通过控制台提供文本模式的系统访问。对于桌面系统,这些可以通过本地键盘访问,或者——对于服务器系统——通过连接到 KVM 交换机或远程管理卡的输入设备(例如,ILO 和 DRAC)访问。默认情况下,Linux 提供六个不同的控制台,可以通过 Alt–F1 到 Alt–F6 的组合键切换,在文本模式下运行时,或 Ctrl–Alt–F1 到 Ctrl–Alt–F6 在图形会话运行时。关联的终端设备名为 tty1 到 tty6。
以下步骤将 root 访问限制为第一个 TTY。即使这种访问方法仅用于系统的紧急访问,也不应将其用于日常系统管理任务。
此处显示的步骤是针对 PC 架构(x86 和 AMD64/Intel 64)量身定制的。在 POWER 等架构上,与 tty1 不同的终端设备名称可能会被使用。请小心不要通过指定错误的终端设备名称来把自己锁定在外面。您可以通过运行 tty 命令来确定当前登录的终端的设备名称。请勿在虚拟终端中执行此操作,例如通过 SSH 或在图形会话中(设备名称 /dev/pts/N),而仅从可以通过 Alt–FN 访问的实际登录终端执行此操作。
确保 PAM 堆栈配置文件 /etc/pam.d/login 在 auth 块中包含 pam_securetty 模块
auth requisite pam_nologin.so auth [user_unknown=ignore success=ok ignore=ignore auth_err=die default=bad] pam_securetty.so noconsole auth include common-auth
这将在本地控制台上进行身份验证过程中包含 pam_securetty 模块,从而将 root 限制为仅在 /etc/securetty 文件中列出的 TTY 设备上登录。
从 /etc/securetty 中删除所有条目,只保留一个。这将限制 root 的 TTY 设备访问。
# # This file contains the device names of tty lines (one per line, # without leading /dev/) on which root is allowed to login. # tty1
检查是否拒绝了其他终端的 root 登录。例如,在 tty2 上的登录应该立即被拒绝,甚至不查询帐户密码。同时确保您仍然可以成功登录到 tty1,从而确保 root 未被锁定在系统之外。
不要将 pam_securetty 模块添加到 /etc/pam.d/common-auth 文件。这将破坏 su 和 sudo 命令,因为这些工具也会拒绝 root 身份验证。
这些配置更改还会导致拒绝对串行控制台(例如 /dev/ttyS0)的 root 登录。如果您需要这种用例,则需要在 /etc/securetty 文件中另外列出相应的 TTY 设备。
为了提高服务器的安全性,请尽量避免使用图形环境。图形程序通常不是设计为以 root 身份运行的,并且可能包含控制台程序中不存在的安全问题。如果您需要图形登录,请使用非 root 登录。配置您的系统以禁止 root 登录到图形会话。
要防止 root 登录到图形会话,您可以应用与 第 14.5.1 节,“限制本地文本控制台登录” 中概述的相同基本步骤。只需将 pam_securetty 模块添加到属于显示管理器的 PAM 堆栈文件(例如,GDM 的 /etc/pam.d/gdm)即可。图形会话也在 TTY 设备上运行:默认情况下,tty7。因此,如果您将 root 登录限制为 tty1,则会拒绝 root 在图形会话中登录。
默认情况下,root 用户也允许通过 SSH 网络协议远程登录到机器(如果 SSH 端口未被防火墙阻止)。要限制此操作,请对 OpenSSH 配置进行以下更改
编辑 /etc/ssh/sshd_config 并调整以下参数
PermitRootLogin no
重新启动 sshd 服务以使更改生效
systemctl restart sshd.service
使用 PAM pam_securetty 模块不适用于 OpenSSH 的情况,因为并非所有 SSH 登录都在授权期间通过 PAM 堆栈进行(例如,在使用 SSH 公钥身份验证时)。此外,攻击者可以区分错误的密码和仅在稍后被策略拒绝的成功登录。
sudo 命令允许用户以另一个用户的身份(通常是 root 用户)执行命令。 sudo 配置由一组规则组成,这些规则定义了要执行的命令与其允许的源用户和目标用户和组之间的映射。配置存储在 /etc/sudoers 文件中。
默认情况下,sudo 在 SUSE 系统上要求输入 root 密码。但是,与 su 不同,sudo 会记住密码,并允许在五分钟内无需再次输入密码即可执行进一步的命令作为 root。因此,sudo 仅应为选定的管理员用户启用。
sudo #编辑文件 /etc/sudoers,例如通过执行 visudo。
注释掉允许每个用户在知道他们想要使用的用户的密码的情况下运行每个命令的行。之后,它应该如下所示
#ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!
取消注释以下行
%wheel ALL=(ALL) ALL
这将限制上述功能仅限于 wheel 组的成员。您可以将不同的组用作 wheel,因为 wheel 可能会产生不适合您设置的其他影响。
将应允许使用 sudo 的用户添加到所选组。要将用户 tux 添加到组 wheel,请使用
usermod -aG wheel tux为了获得新的组 membership,用户必须注销并重新登录。
通过使用未在您选择的访问控制组中的用户运行命令来验证更改。您应该看到错误消息
wilber is not in the sudoers file. This incident will be reported.
接下来,尝试使用该组的成员执行相同的操作。他们仍然应该能够通过 sudo 执行命令。
此配置仅限制 sudo 功能。 su 命令仍然可供所有用户使用。如果还有其他访问系统的方式,了解 root 密码的用户可以通过这种方式轻松执行命令。
在交互式 shell 会话之后终止一段时间的不活动可能是一个好主意。例如,为了防止打开的、无人看管的会话,或为了避免浪费系统资源。
默认情况下,shell 没有不活动超时。如果 shell 保持打开且未使用数天甚至数年,也不会发生任何事情。但是,可以配置大多数 shell,以便在一段时间的不活动后自动终止空闲会话。以下示例说明了如何为几种常见的 shell 类型设置不活动超时。
不活动超时可以配置为仅用于登录 shell,也可以用于所有交互式 shell。在后一种情况下,不活动超时将为每个 shell 实例单独运行。这意味着超时会累积。当启动子 shell 或子 shell 时,子 shell 或子 shell 将开始新的超时,然后父超时的运行才会继续。
以下表包含随 openSUSE Leap 提供的常用 shell 的配置详细信息
| package | shell personalities | shell variable | time unit | readonly setting | config path (only login shell) | config path (all shells) |
|---|---|---|---|---|---|---|
|
|
| seconds |
|
|
|
|
|
| seconds |
|
|
|
|
|
| minutes |
|
|
|
|
|
| seconds |
|
|
|
每个列出的 shell 都支持一个内部超时 shell 变量,可以将其设置为特定的时间值,以导致不活动超时。如果您希望防止用户覆盖超时设置,可以将相应的 shell 超时变量标记为只读。相应的变量声明语法也包含在表中。
此功能仅有助于避免疏忽或不安全做法的用户面临的风险。它不能防止恶意用户。超时仅适用于 shell 的交互式等待状态。恶意用户始终可以找到绕过超时并保持会话打开的方法,无论如何。
要配置不活动超时,需要将匹配的超时变量声明添加到每个 shell 的启动脚本。使用表中列出的仅登录 shell的路径,或所有 shell 的路径。以下示例使用适合 bash 和 ksh 的路径和设置来设置无法被用户覆盖的只读登录 shell 超时。使用以下内容创建文件 /etc/profile.d/timeout.sh
# /etc/profile.d/timeout.sh for SUSE Linux # # Timeout in seconds until the bash/ksh session is terminated # in case of inactivity. # 24h = 86400 sec readonly TMOUT=86400
我们建议在使用 screen 工具分离会话后再注销。 screen 会话不会终止,并且可以随时重新连接。有关详细信息,请阅读 man screen 中关于使用 Ctrl–A–X / lockscreen 锁定会话的内容。
Linux 允许您设置用户和组可以消耗的系统资源的限制。如果程序中的错误导致它们消耗过多的资源(例如,内存泄漏),使机器变慢,甚至使系统无法使用,这也很有用。不正确的设置可能会允许程序使用过多的资源,这可能会导致服务器对新的连接或甚至本地登录无响应(例如,如果程序耗尽了主机上所有可用的文件句柄)。如果允许某人消耗所有系统资源并因此导致拒绝服务攻击(无论是无计划的,还是更糟的,有计划的),这也可能是一个安全问题。为用户和组设置资源限制可能是一种保护系统的有效方法,具体取决于环境。
以下示例演示了为 Oracle 用户帐户设置或限制系统资源消耗的实际用法。有关系统资源设置的列表,请参阅 /etc/security/limits.conf 或 man limits.conf。
大多数 shell,例如 Bash,都提供对各种资源的控制(例如,允许的最大打开文件描述符数量或最大进程数),这些资源在每个用户的基础上可用。要检查 shell 中的所有当前限制,请执行
# ulimit -a有关 Bash shell 中 ulimit 的更多信息,请查阅 Bash 手册页。
设置““硬””和““软””限制在使用 SSH 会话时可能不会产生预期的结果。要查看有效行为,可能需要以 root 用户身份登录,然后 su 到具有限制的 ID(例如,这些示例中的 Oracle)。如果应用程序在启动过程中自动启动,资源限制也应该有效。如果似乎资源限制的更改无法通过 SSH 工作,则可能需要在 /etc/ssh/sshd_config 中设置 UsePrivilegeSeparation 为 no 并重新启动 SSH 守护程序 (systemctl restart sshd)。但是,通常不建议这样做,因为它会削弱系统的安全性。
ssh 禁用密码登录您可以通过禁用 SSH 的密码身份验证来为您的服务器增加额外的安全性。请记住,您需要配置 SSH 密钥,否则您将无法访问服务器。要禁用密码登录,请将以下行添加到 /etc/ssh/sshd_config
UseLogin no UsePAM no PasswordAuthentication no PubkeyAuthentication yes
在本例中,通过编辑 /etc/security/limits.conf 作为 root 来更改用户 oracle 可以使用的文件句柄或打开文件的数量,进行以下更改
oracle soft nofile 4096 oracle hard nofile 63536
第一行中的软限制定义了 oracle 用户登录后文件句柄(打开文件)的数量限制。如果用户看到有关文件句柄用尽的错误消息,则用户可以像在此示例中一样将文件句柄的数量增加到硬限制(在此示例中为 63536)通过执行
# ulimit -n 63536如果需要,您可以设置更高的软限制和硬限制。
谨慎使用 ulimits 非常重要。允许用户对于 nofile 的““硬””限制等于内核限制 (/proc/sys/fs/file-max) 是不好的。如果用户消耗了所有可用的文件句柄,则系统无法启动新的登录,因为无法访问执行登录所需的 PAM 模块。
您还需要确保 pam_limits 要么在 /etc/pam.d/common-auth 中全局配置,要么为 SSH、su、login 和 telnet 等单个服务在
/etc/pam.d/sshd (用于 SSH) |
/etc/pam.d/su (用于 su) |
/etc/pam.d/login (本地登录和 telnet) |
如果您不想为所有登录启用它,则有一个特定的 PAM 模块会读取 /etc/security/limits.conf 文件。PAM 配置指令中的条目如下所示
session required /lib/security/pam_limits.so session required /lib/security/pam_unix.so
更改不会立即生效,需要新的登录会话
#su - oracle>ulimit -n 4096
这些示例是针对 Bash shell 的;其他 shell 的 ulimit 选项不同。用户 oracle 的默认限制为 4096。要将用户 oracle 可以使用的文件句柄数量增加到 63536,请执行
#su - oracle>ulimit -n 4096>ulimit -n 63536>ulimit -n 63536
要使其永久生效,需要将设置 ulimit -n 63536(再次,对于 Bash)添加到用户的配置文件 (~/.bashrc 或 ~/.profile 文件),这是 openSUSE Leap 上 Bash shell 的用户启动文件(要验证您的 shell,请运行:echo $SHELL)。为此,您可以为 Bash shell 的用户 oracle 运行以下命令
#su - oracle>cat >> ~oracle/.bash_profile << EOF ulimit -n 63536 EOF
出于法律/审计策略原因或向用户提供安全说明,通常需要在所有服务器上的登录屏幕上放置一个横幅。
要在用户通过 SSH 或在本地控制台等基于文本的终端登录后打印登录横幅,可以使用文件 /etc/motd(motd = message of the day)。该文件默认存在于 openSUSE Leap 上,但它是空的。只需添加组织适用/要求的任何内容即可。
尝试将登录横幅内容保持在一个终端页面(或更少),因为它如果无法适应会滚动屏幕,使其更难以阅读。
您还可以让用户在基于文本的终端登录前打印登录横幅。对于本地控制台登录,您可以编辑 /etc/issue 文件,这将导致在登录提示符之前显示横幅。对于通过 SSH 登录,您可以编辑 /etc/ssh/sshd_config 文件中的““Banner””参数,然后适当地在 SSH 登录提示符之前显示横幅文本。
对于通过 GDM 的图形登录,您可以按照 GNOME 管理指南 设置登录横幅。此外,您可以进行以下更改,要求用户通过选择 或 来确认法律横幅。编辑 /etc/gdm/Xsession 文件,并在脚本的 开头 添加以下行
if ! /usr/bin/gdialog --yesno '\nThis system is classified...\n' 10 10; then
/usr/bin/gdialog --infobox 'Aborting login'
exit 1;
fi文本 此系统被归类... 需要替换为所需的横幅文本。此对话框不会阻止登录继续。有关 GDM 脚本的更多信息,请参阅 GDM 管理手册。
以下是您可以用来获取用户登录数据的命令列表
who. 列出当前登录的用户。
w. 显示谁已登录以及他们在做什么。
last. 显示最近登录用户的列表,包括登录时间、注销时间、登录 IP 地址等。
lastb. 与 last 相同,但默认情况下它显示 /var/log/btmp,其中包含所有失败的登录尝试。
lastlog. 此命令报告在 /var/log/lastlog 中维护的数据,这是用户上次登录时间的记录。
ac. 在安装 acct 包后可用。以小时为单位打印每个用户或每天的连接时间等。此命令读取 /var/log/wtmp。
dump-utmp. 将来自 /var/run/utmp 或 /var/log/wtmp 的原始数据转换为 ASCII 可解析格式。
还要检查 /var/log/messages 文件,或者如果未运行任何日志记录设施,则检查 journalctl 的输出。有关 systemd 日志的更多信息,请参阅 “参考”手册,第 11 章“journalctl:查询 systemd 日志”。