基线加固
1. 账号安全
1.1 空口令用户
-
没有密码
awk -F: '($2="")' /etc/shadow # 查看有空密码的账户
-
没有密码占位符(空密码账户,可以本地登录,不能远程登录)
awk -F: '($3==0)' /etc/passwd
1.2 账户的锁定与解锁
使用passwd
命令
passwd
命令不仅可以用来更改用户密码,还可以锁定用户账户。锁定用户账户后,该用户将无法登录系统。
sudo passwd -l username
-l
:锁定用户账户。username
:要锁定的用户名。
使用usermod
命令
usermod
命令也可以用来锁定用户账户,通过设置密码为过期状态来实现。
sudo usermod -L username
-L
:锁定用户账户。username
:要锁定的用户名。
使用chage
命令
chage
命令可以用来管理用户密码的过期信息,也可以用来锁定用户账户。
sudo chage -E 0 username
-E
:设置账户的过期日期。设置为0
表示立即过期。username
:要锁定的用户名。
1.3 解锁用户账户
使用passwd
命令
解锁用户账户时,可以使用passwd
命令。
sudo passwd -u username
-u
:解锁用户账户。username
:要解锁的用户名。
使用usermod
命令
usermod
命令也可以用来解锁用户账户。
sudo usermod -U username
-U
:解锁用户账户。username
:要解锁的用户名。
使用chage
命令
如果之前使用chage
命令锁定了用户账户,可以通过以下命令解锁:
sudo chage -E -1 username
-E -1
:设置账户的过期日期为永不过期。username
:要解锁的用户名。
1.4 检查密码重用是否受限制
防止用户重复使用旧密码,从而增加账户的安全性
- 找到PAM配置文件 PAM配置文件通常位于
/etc/pam.d/
目录下。对于密码管理,主要的配置文件是/etc/pam.d/common-password
(在Debian/Ubuntu系统中)或/etc/pam.d/system-auth
(在Red Hat/CentOS系统中)。 - 检查
pam_pwhistory
模块 打开相应的PAM配置文件,查找pam_pwhistory
模块的配置。例如:
- 在Debian/Ubuntu系统中:
sudo vi /etc/pam.d/common-password
- 在Red Hat/CentOS系统中:
sudo vi /etc/pam.d/system-auth
- 确认配置 查找类似以下的行:
password requisite pam_pwhistory.so remember=5
pam_pwhistory.so
:表示使用了pam_pwhistory
模块。remember=5
:表示系统会记住用户最近5个密码,不允许用户重复使用这5个密码。
如果没有找到pam_pwhistory
模块的配置,或者remember
值为0或未设置,则表示密码重用限制未启用。
1.5 umask值的重要性(权限的掩码值)
-
umask + 数字
umask 077 #调整umask值为了提升权限
1.6 su的限制
(防止root密码泄露之后,使用其他低权限账户su,然后进行高危操作)
修改 PAM 配置文件
PAM(Pluggable Authentication Modules)是一种用于处理用户登录认证的模块。通过修改/etc/pam.d/su
文件,可以限制su
命令的使用
-
只有属于
wheel
组的用户才能使用su
命令auth required pam_wheel.so group=wheel# auth:指定这是认证模块。 # required:表示该模块必须成功通过认证,否则用户无法继续。 # pam_wheel.so:这是 PAM 模块,用于检查用户是否属于指定的组。 # group=wheel:指定用户必须属于 wheel 组才能使用 su 命令。你可以将 wheel 替换为其他组名,例如 sudo 或 admin。
-
用户在连续失败 3 次后,将在 10 分钟内无法使用
su
命令。auth required pam_tally2.so deny=3 unlock_time=600# auth:指定这是认证模块。 # required:表示该模块必须成功通过认证,否则用户无法继续。 # pam_tally2.so:这是 PAM 模块,用于记录失败的认证尝试。 # deny=3:表示用户在尝试使用 su 命令时,如果连续失败 3 次,将被锁定。 # unlock_time=600:表示用户在被锁定后,600 秒(10 分钟)后自动解锁。
-
将用户加入特定组
sudo usermod -aG wheel username # sudo:以管理员权限执行命令。 # usermod:用户管理命令。 # -aG:将用户添加到指定的组。-a 表示追加,-G 表示指定组。 # wheel:目标组名。你可以将 wheel 替换为其他组名。 # username:要添加到组的用户名。
-
修改
/etc/login.defs
文件SU_WHEEL_ONLY yes# SU_WHEEL_ONLY:这是一个配置项,用于限制 su 命令的使用。 # yes:表示只有属于 wheel 组的用户才能使用 su 命令。
-
使用
sudo
命令sudo
配置文件位于/etc/sudoers
。username ALL=(ALL) !/bin/su # username:要限制的用户名。 # ALL=(ALL):表示该用户可以在任何主机上以任何用户的身份执行命令。 # !/bin/su:表示该用户不能执行 /bin/su 命令。
-
修改
/bin/su
命令的权限sudo chmod 700 /bin/su# sudo:以管理员权限执行命令。 # chmod:修改文件权限。 # 700:表示只有文件的所有者(通常是 root)有读、写和执行权限,其他用户没有任何权限。 # /bin/su:su 命令的路径。
1.7 密码最长有效期
使用文本编辑器打开 /etc/login.defs
文件
/etc/login.defs
是一个系统级的配置文件,用于定义各种与用户登录和密码相关的默认设置。它主要影响系统的行为,而不是直接对密码的复杂性进行详细控制。
-
修改
PASS_MAX_DAYS
参数-
PASS_MAX_DAYS
:定义密码的最大有效天数。 -
PASS_MIN_DAYS
:定义密码的最小有效天数。用户必须等待这个天数后才能更改密码。 -
PASS_MIN_LEN
:定义密码的最小长度。 -
PASS_WARN_AGE
:定义密码过期前的警告天数。用户在密码过期前的这些天数内会收到警告提示。
change -M 90 -W 7 # chage 命令主要用于设置用户密码的过期信息,但它不直接支持修改 /etc/login.defs 文件中的全局密码策略参数, -M:设置密码的最大有效天数。 -m:设置用户可以更改密码的最小天数。 -W:设置密码过期前的警告天数。 -I:设置密码过期后账户仍然有效的天数。 -E:设置账户过期的日期。 -d:设置上次密码更改的日期sudo sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN 12/' /etc/login.defs sudo sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 7/' /etc/login.defs
-
1.8 密码复杂性
-
检查当前对密码复杂度要求和规定
/etc/security/pwquality.conf
是一个专门用于控制密码质量的配置文件。它提供了更详细的密码复杂性规则,用于确保用户设置的密码符合安全要求。grep -E ‘minlen|minclass’ /etc/security/pwquality.conf 命令的各个部分: # 1. grep 命令 # grep 是一个强大的文本搜索工具,用于在文件中搜索符合特定模式的字符串或正则表达式。 # 2. -E 选项 # -E 是 grep 的一个选项,表示使用扩展正则表达式(Extended Regular Expressions)。这允许使用更复杂的正则表达式语法。 # 3. ‘minlen|minclass’ # 这是 grep 要搜索的模式。这里使用了扩展正则表达式的 | 符号,表示“或”的关系。 # minclass 用于指定密码策略中密码必须包含的字符类别数量。 # minlen 用于指定密码的最小长度。 # dcredit:指定密码中数字字符的最大数量。 # ucredit:指定密码中大写字母的最大数量。 # lcredit:指定密码中小写字母的最大数量。 # ocredit:指定密码中特殊字符的最大数量 # 4. /etc/security/pwquality.conf # 这是 grep 要搜索的目标文件。/etc/security/pwquality.conf 是 Linux 系统中用于配置密码质量检查的文件。它定义了密码的复杂性要求,例如最小长度、字符类别等。
-
对密码复杂度要求和规定进行修改:可以使用vim、sed等进行修改
# 1.备份原始文件(可选但推荐):(先备份) sudo cp /etc/security/pwquality.conf /etc/security/pwquality.conf.bak # 2.在修改 sudo sed -i 's/^minlen = .*/minlen = 10/' /etc/security/pwquality.conf sudo sed -i 's/^minclass = .*/minclass = 4/' /etc/security/pwquality.conf# 参数说明 # -i:直接修改文件内容,而不是输出到标准输出。 # s/^minlen = .*/minlen = 10/:匹配以 minlen = 开头的行,并将其替换为 minlen = 10。 # s/^minclass = .*/minclass = 4/:匹配以 minclass = 开头的行,并将其替换为 minclass = 4。# 3.验证更改 #修改完成后,可以通过查看 /etc/security/pwquality.conf 文件来验证更改是否生效: cat /etc/security/pwquality.conf 或者 grep -E 'minlen|minclass' /etc/security/pwquality.conf
1.8 禁止ssh使用空密码登录
-
进入
/etc/ssh/sshd_config
文件,修改或确认PermitEmptyPasswords
选项 -
如果该行被注释掉了(即前面有
#
),则取消注释,并将其值设置为no
:PermitEmptyPasswords no
1.9 设置登录超时自动注销
在 /etc/profile
中文件最后一行添加export TMOUT=180
unset i
unset -f pathmunge
export TMOUT=180 # 登录超时自动注销或者
TMOUT=180
export TMOUT
# 当用户在终端中无操作达到 180 秒时,系统会自动注销当前用户
1.10 多次登录失败后锁定账户
多次登录失败后锁定账户的机制主要依赖于 PAM(Pluggable Authentication Modules)模块。具体配置方法如下:
-
pam_tally2.so
配置 PAM 模块:
pam_tally2.so
是一个常用的 PAM 模块,用于跟踪用户登录失败的次数,并在达到指定次数后锁定账户。
-
在
/etc/pam.d/system-auth
或/etc/pam.d/sshd
文件中添加以下内容:auth required pam_tally2.so onerr=fail deny=5 unlock_time=600 even_deny_root root_unlock_time=600 file=/var/log/tallylogdeny=5:表示用户连续登录失败 5 次后锁定账户。 unlock_time=600:表示账户锁定时间为 600 秒(10 分钟)。 even_deny_root:表示即使是 root 用户也会受到锁定限制。 root_unlock_time=600:表示 root 用户锁定时间也为 600 秒。
常用参数
deny=n
:用户连续登录失败 n 次后,账户将被锁定。unlock_time=n
:账户锁定的时间(秒数)。如果设置为 0,则账户将永久锁定,直到管理员手动解锁。onerr=[succeed|fail]
:当模块遇到错误时的行为。succeed
表示忽略错误,fail
表示将错误视为失败file=/path/to/log
:指定失败登录记录的文件路径,默认为/var/log/tallylog
。audit
:如果登录的用户未找到,则将用户名记录到系统日志中。silent
:不打印相关的信息。no_log_info
:不通过 syslog 记录日志信息。magic_root
:当 root 用户(uid=0)调用该模块时,计数器不会递增。even_deny_root
:即使 root 用户失败登录次数超过指定次数,也会拒绝访问。root_unlock_time=n
:与 even_deny_root 配合使用,指定 root 用户的锁定时间。
- 查看和解锁账户:
- 使用
pam_tally2 --user 用户名
命令查看用户登录失败的次数。 - 使用
pam_tally2 -r -u 用户名
命令解锁指定用户。
- 使用
- 其他相关配置:
- 在
/etc/login.defs
文件中,可以设置LOGIN_RETRIES
和LOGIN_TIMEOUT
等参数。
- 在
通过上述配置,可以有效防止恶意攻击和未经授权的访问,同时保护系统安全。
2. pam_faillock.so
pam_faillock.so
是一个更新的模块,提供了更灵活的配置选项,用于防止暴力破解攻击。
常用参数
- deny=n:用户连续登录失败 n 次后,账户将被锁定。
- fail_interval=n:在 n 秒内连续失败登录次数达到
deny
次后,账户将被锁定。 - unlock_time=n:账户锁定的时间(秒数)。
- even_deny_root:即使 root 用户失败登录次数超过指定次数,也会拒绝访问。
- root_unlock_time=n:与
even_deny_root
配合使用,指定 root 用户的锁定时间。 - audit:记录失败的登录尝试。
- silent:不打印相关的信息。
- dir=/path/to/dir:指定存储失败登录记录的目录,默认为
/var/run/faillock
。
在 /etc/pam.d/system-auth
文件中添加以下内容:
auth required pam_faillock.so preauth silent audit deny=5 fail_interval=900 unlock_time=600
auth [default=die] pam_faillock.so authfail audit deny=5 fail_interval=900 unlock_time=600
auth sufficient pam_unix.so
auth required pam_deny.so
此配置表示用户在 15 分钟内连续登录失败 5 次后,账户将被锁定 10 分钟
1.11 限制root用户远程登录
限制 root
用户远程登录是一个重要的安全措施,可以有效防止未经授权的访问。以下是一些常见的方法来限制 root
用户远程登录,主要针对基于 SSH 的远程登录场景:
1. 修改 SSH 配置文件
SSH(Secure Shell)是常用的远程登录协议。你可以通过修改 SSH 的配置文件来限制 root
用户远程登录。
操作步骤:
-
打开 SSH 配置文件:
SSH 的配置文件通常位于/etc/ssh/sshd_config
。使用文本编辑器(如vi
或nano
)打开该文件:sudo vi /etc/ssh/sshd_config
或
sudo nano /etc/ssh/sshd_config
2. **修改配置**:找到以下行:
PermitRootLogin yes
将其改为:
PermitRootLogin no
这样,`root` 用户将无法通过 SSH 远程登录。3. **保存并重启 SSH 服务**:
保存文件后,重启 SSH 服务以使配置生效:
```bash
sudo systemctl restart sshd
2. 使用用户组限制
如果你希望某些用户可以远程登录,而 root
用户不能,可以通过用户组来实现。
操作步骤:
-
创建一个用户组:
创建一个允许远程登录的用户组,例如sshusers
:sudo groupadd sshusers
2. **将用户添加到该组**:将需要远程登录的用户添加到 `sshusers` 组:```bashsudo usermod -aG sshusers username
-
修改 SSH 配置文件:
修改/etc/ssh/sshd_config
文件,添加以下内容:AllowGroups sshusers
这样,只有属于
sshusers
组的用户才能通过 SSH 远程登录。 -
保存并重启 SSH 服务:
保存文件后,重启 SSH 服务:sudo systemctl restart sshd
3. 使用密钥认证
使用密钥认证而不是密码认证可以提高安全性。你可以为普通用户生成密钥对,并限制 root
用户使用密码登录。
操作步骤:
-
生成密钥对:
在客户端机器上生成密钥对:ssh-keygen -t rsa -b 4096
-
将公钥复制到服务器:
将生成的公钥复制到服务器上的普通用户目录:ssh-copy-id username@server_ip
-
修改 SSH 配置文件:
修改/etc/ssh/sshd_config
文件,添加以下内容:PasswordAuthentication no
这样,所有用户(包括
root
)都将无法通过密码登录,只能通过密钥认证。 -
保存并重启 SSH 服务:
保存文件后,重启 SSH 服务:sudo systemctl restart sshd
4. 使用防火墙限制
如果你希望完全禁止 root
用户的远程登录,可以通过防火墙规则来限制。
操作步骤:
-
使用
iptables
:
你可以使用iptables
来限制特定端口的访问。例如,禁止root
用户通过端口 22(默认 SSH 端口)访问:sudo iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner root -j DROP
-
保存规则:
保存iptables
规则:sudo iptables-save
2. 系统安全基线
2.1 检查Grub密码
在使用 systemd
的系统(如 CentOS 7.x、RHEL 7.x、Ubuntu 16.04+)中,可以通过以下步骤设置 GRUB 加密:
1. 生成加密密码
-
使用
grub2-mkpasswd-pbkdf2
命令生成加密密码:sudo grub2-mkpasswd-pbkdf2
- 按提示输入并确认密码,系统将生成一个加密后的密码字符串。
2. 编辑 GRUB 配置文件
-
编辑
/etc/grub.d/40_custom
文件:sudo vi /etc/grub.d/40_custom
-
在文件末尾添加以下内容,设置用户名和加密密码:
set superusers="your_username" password_pbkdf2 your_username <加密密码>
-
其中
your_username
是你希望设置的用户名,<加密密码>
是上一步生成的加密密码。
-
3. 更新 GRUB 配置
-
更新 GRUB 配置文件:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- 这将生成新的
grub.cfg
文件,使更改生效。
- 这将生成新的
4. 重启系统
-
重启系统以应用新的 GRUB 加密设置:
sudo reboot
- 重启后,GRUB 将要求输入用户名和密码才能进入系统。
验证设置
- 重启系统并验证:
- 在系统启动时,按下
Shift
键或Esc
键进入 GRUB 引导界面。 - 尝试编辑启动项(按下
e
键),系统应提示输入用户名和密码。
- 在系统启动时,按下
注意事项
- 备份配置文件:在修改配置文件之前,建议备份原始文件。
- 妥善保管密码:请确保妥善保管生成的加密密码,以免丢失。
- 系统差异:不同 Linux 发行版的 GRUB 配置文件路径可能略有不同,例如 Ubuntu 系统的 GRUB 配置文件路径为
/etc/default/grub
。
2.2 修改内核网络参数
修改 /etc/sysctl.conf
文件后,需要运行 sudo sysctl -p
来应用更改。
2.3 禁止Control-Alt-Delete键盘关闭命令
grep -ril "Ctrl-Alt-Del" /etc
对于使用 systemd 的系统(如 CentOS 7.x、RHEL 7.x、Ubuntu 16.04+)
-
禁用并屏蔽
ctrl-alt-del.target
服务:sudo systemctl disable ctrl-alt-del.target sudo systemctl mask ctrl-alt-del.target
-
验证是否成功:
sudo systemctl is-enabled ctrl-alt-del.target
如果输出为
masked
,则表示已成功禁用
2.4 修改命令历史记录条目数以及时间标签
在 Linux 系统中,命令历史记录(history
)是一个非常有用的工具,可以帮助用户查看和重复执行之前输入的命令。你可以通过修改一些配置文件来调整命令历史记录的条目数和添加时间标签。
2.4.1 修改命令历史记录条目数
默认情况下,命令历史记录的条目数是有限制的,通常存储在 ~/.bash_history
文件中。你可以通过修改 Shell 配置文件来增加或减少这个限制。
修改 HISTSIZE
和 HISTFILESIZE
-
打开终端。
-
编辑 Shell 配置文件:
-
对于 Bash,编辑
~/.bashrc
或~/.bash_profile
文件:nano ~/.bashrc
-
对于 Zsh,编辑
~/.zshrc
文件:nano ~/.zshrc
-
3. **设置 `HISTSIZE` 和 `HISTFILESIZE`**:- `HISTSIZE` 控制当前会话中保存的历史命令数量。- `HISTFILESIZE` 控制保存到 `~/.bash_history` 文件中的命令数量。- 添加或修改以下行:```bashexport HISTSIZE=1000export HISTFILESIZE=2000
- 这里的
1000
和2000
是示例值,你可以根据需要调整。
-
保存并退出编辑器。
-
重新加载配置文件:
source ~/.bashrc
或者重新登录以使更改生效。
2.4.2 添加时间标签
为了在命令历史记录中显示时间戳,你可以设置 HISTTIMEFORMAT
环境变量。
-
打开终端。
-
编辑 Shell 配置文件:
-
对于 Bash,编辑
~/.bashrc
或~/.bash_profile
文件:nano ~/.bashrc
-
对于 Zsh,编辑
~/.zshrc
文件:nano ~/.zshrc
-
-
设置
HISTTIMEFORMAT
:-
添加以下行:
export HISTTIMEFORMAT="%F %T "
-
-
这里的格式字符串
%F %T
表示日期和时间,格式为YYYY-MM-DD HH:MM:SS
。你可以根据需要调整格式。-
时间格式:
HISTTIMEFORMAT
的时间格式字符串可以使用date
命令的格式选项,例如:%F
:日期,格式为YYYY-MM-DD
。%T
:时间,格式为HH:MM:SS
。%Y
:四位年份。%m
:两位月份。%d
:两位日期。%H
:两位小时(24小时制)。%M
:两位分钟。%S
:两位秒数。
-
-
保存并退出编辑器。
-
重新加载配置文件:
source ~/.bashrc
或者重新登录以使更改生效。
验证更改
-
打开终端。
-
查看命令历史记录:
history
- 你应该能看到带有时间戳的命令历史记录。
- 配置文件路径:确保你编辑的是正确的配置文件。不同的 Shell(如 Bash、Zsh)可能使用不同的配置文件。
- 权限问题:如果你需要修改全局设置(对所有用户生效),可以编辑
/etc/bash.bashrc
或/etc/profile
文件。
2.5 设置登录超时时间
修改 /etc/login.defs
文件
/etc/login.defs
文件中包含了许多与登录相关的配置选项。你可以通过修改这个文件来设置登录超时时间。
-
打开终端。
-
编辑
/etc/login.defs
文件:sudo nano /etc/login.defs
-
查找或添加
LOGIN_TIMEOUT
配置项:- 如果文件中已经存在
LOGIN_TIMEOUT
配置项,修改它的值。 - 如果没有,可以添加一行:
LOGIN_TIMEOUT 60
- 这里的
60
表示超时时间为 60 秒。你可以根据需要设置其他值。
保存并退出
- 如果文件中已经存在
2.6 是否将/var/log/messages文件设置为只可追加
使用 lsattr 命令,你可以看到文件是否被设置了以下一些特殊的属性:
i (Immutable):文件不能被修改、删除或重命名。
a (Append Only):文件只能被追加内容,不能被删除或重写。
S (Sparse file):稀疏文件属性,用于大文件优化存储。
s (Secure Deletion):当文件被删除时,会安全擦除其数据,防止恢复。
u (Undelete):一种“防删除”标志,尽管Linux系统中很少直接支持此特性。
c (Compressed):文件内容被压缩。
d (No dump):在系统备份时,该文件不会被dump程序备份。
e (Extent format):文件使用extent来记录其磁盘空间的分配情况,主要针对大文件优化。
A (No atime updates):访问文件时不更新访问时间戳。
基本用法如下:查看指定文件或目录的属性:lsattr [选项] 文件或目录
若要查看目录下的所有文件属性(递归),需加上 -R 选项:lsattr -R 目录
使用命令:chattr +a /var/log/messages,配置日志文件只可追加。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937560.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!