附件1.服务器操作系统安全加固要求及配置建议【上】
链接如下
附件1.服务器操作系统安全加固要求及配置建议【上】
【系统管理员通过DAC保护系统中的公共资源(配置文件、库、命令、内核模块等),其它用户只可读取或执行,不能修改。】
-
我们没有公告资源,下面了解即可
-
系统管理员可以使用文件系统中的 DAC(Discretionary Access Control,自主访问控制)对公共资源进行保护。DAC 提供了基于用户标识符(UID)和权限位的控制,使得管理员可以对文件和目录进行细粒度的访问控制,并限制普通用户的访问权限。下面是一个保护公共资源的示例:
-
将所有公共资源(配置文件、库、命令等)存放在一个特定的目录中,例如 /usr/local/shared。
-
使用 chmod 命令设置公共资源的权限。例如,以下命令将 /usr/local/shared 目录的权限设置为 755,即管理员可读写执行,普通用户只可读取和执行:
# chmod 755 /usr/local/shared
-
对于需要限制普通用户写入的文件和目录,可以使用 chmod 命令将其权限设置为 644 或 755。例如,以下命令将 /usr/local/shared 下的所有可写文件的权限设置为 644:
# find /usr/local/shared -type f -perm /222 -exec chmod 644 {} \;
该命令首先查找 /usr/local/shared 目录下所有可写文件(权限包含 2 的位),然后修改它们的权限为 644。这样,只有管理员可以修改这些文件。 -
对于命令和内核模块,可以将其安装到某个受保护的目录中,并使用 chmod 命令将其权限设置为 755。例如,以下命令将 /usr/local/shared/bin 目录下的所有命令权限设置为 755:
# chmod -R 755 /usr/local/shared/bin
这将允许管理员执行这些命令,但普通用户只能读取和执行它们。 -
请注意,在使用 DAC 进行访问控制时,需要管理员了解用户和组的权限和 UID,以便正确地设置文件和目录的权限,并确保系统的安全和稳定性。建议管理员定期检查公共资源的权限设置,并进行必要的调整和更新。同时,建议管理员使用其他访问控制机制,如 SELinux 或 AppArmor 等来增强系统的安全性。
【系统的可执行程序安装于/usr/bin/, /usr/sbin/, /usr/libexec/,/usr/local/bin/, /usr/local/sbin/等目录下,这些目录都受DAC保护,只能由root去修改或替换。】
- 我们系统没有安装相关可执行程序,如果需要操作全选,参考上面一条中方法建议修改即可。
[root@computer07 ~]# ls -l /usr/local/bin/
total 0
[root@computer07 ~]#
[root@computer07 ~]# ls -l /usr/local/sbin/
total 0
[root@computer07 ~]#
对于安全标记,可运行命令restorecon(参照file_contexts文件)和iaclabel进行恢复,或者通过备份管理员恢复相关文件。】
-
系统自带集成restorecon命令,需要安装iaclabel。根据要求,需要存在这2样命令就行了吧?
-
针对安全标记的恢复,可以使用 restorecon 和 iaclabel 工具进行操作。
-
restorecon
:该工具可以根据指定的 file_contexts 文件恢复指定目录下的所有文件和目录的安全标记。- 例如,以下命令会将 /var/log/auth.log 文件的安全标记恢复为其在 file_contexts 文件中定义的值:
# restorecon /var/log/auth.log
- 如果要恢复整个目录,可以使用 -R 参数进行递归操作:
# restorecon -Rv /etc
- 例如,以下命令会将 /var/log/auth.log 文件的安全标记恢复为其在 file_contexts 文件中定义的值:
-
iaclabel
:该工具用于设置和清空文件的 SELinux ACL(访问控制列表)。与 restorecon 类似,管理员也可以使用 iaclabel 恢复文件的安全标记。- 例如
# iaclabel --restore /root/selinux.acl
这个命令会将 /root/selinux.acl 文件中定义的安全标记恢复到指定的文件中。 - 也可以使用 iaclabel 命令为目录设置 ACL:
# iaclabel -R /usr/local/myapp -i myapp-acl.txt
这条命令会为 /usr/local/myapp 目录下的所有文件和目录设置安全标记,标记信息存储在 myapp-acl.txt 文件中。
- 例如
-
在恢复安全标记时,需要管理员仔细核查 file_contexts 文件和 ACL 文件的内容,并确保恢复的标记不会影响系统的安全性和可用性。如果系统备份了相关文件,管理员还可以通过备份文件恢复安全标记。
-
总之,恢复安全标记是维护系统安全性的一个重要任务,管理员需要了解和熟悉相关工具和文件,并及时处理标记问题,以保障系统安全。
-
-
保障 SSOOS 系统在故障或中断后以最小的损害得到恢复,并按照 GB/T20271—2006 标准中的要求处理故障,是确保系统的可用性和稳定性的关键措施。
以下是一些常见的应对措施:-
启用备份系统:在出现故障或中断时,备份系统可以担负起主系统的任务,保障服务的连续性和稳定性。备份系统可以运行在另一个服务器或者虚拟机上,备份数据通常存储在远程位置上。
-
启用自动故障转移:自动故障转移能够快速检测并转移故障节点的服务任务到另一组节点上,保证业务的连续性和稳定性。自动故障转移可以通过负载均衡器或者集群管理软件来实现。
-
启动系统恢复机制:在系统出现故障或者中断后,系统恢复机制应及时启动,尽可能地减少服务中断时间。系统恢复机制可以包括自动重启服务、纠正错误并恢复数据、还原备份等一系列措施。
-
引入事故管理流程:在出现故障或者中断后,及时启动事故管理流程,通过事故报告、事故分析、事故处理和事故评估等流程,及时处理故障问题,减少因故障带来的损失。
-
定期进行系统备份和恢复测试:系统备份和恢复测试是保障 SSF 故障保护的重要手段,可以帮助管理员检查和验证备份系统和自动故障转移系统的正确性和可用性,及时修复潜在的问题并提高系统的鲁棒性和可靠性。
-
总之,为了保障 SSOOS 系统的正常运行和服务连续性,管理员需要采取一系列保障措施,包括启用备份系统、自动故障转移、启动系统恢复机制、建立事故管理流程等,同时还需要定期进行备份和恢复测试,以验证系统的可靠性和鲁棒性。
-
【通过pam_access.so控制登录终端的使用,相关的配置文件是/etc/security/access.conf。】
-
管理员可以通过 PAM 身份验证模块 pam_access.so 控制用户的登录终端使用。下面是一些配置步骤:
-
(不做)安装 PAM 身份验证模块 pam_access.so,通常在 pam 包中。在 Debian 或 Ubuntu 中,可以使用以下命令安装:
在其他 Linux 发行版中,可以按照相应的包管理器安装该模块。
# apt-get install libpam-modules
- (不做)修改 PAM 配置文件
/etc/pam.d/login
,在 auth、account 或 session 部分添加 pam_access.so 模块,如下所示:
auth required pam_securetty.so
auth required pam_access.so
account required pam_nologin.so
session required pam_env.so readenv=1
session required pam_env.so readenv=1 envfile=/etc/default/locale
session required pam_limits.so
session required pam_lastlog.so
session optional pam_motd.so
在上述配置中,pam_access.so 模块被添加到 auth 部分,以在用户身份验证之前检查登录终端使用。
- 配置
/etc/security/access.conf
文件来控制用户的登录终端,如下所示:
# /etc/security/access.conf
+ : root : tty1 tty2 tty3 tty4 tty5 tty6
+ : user1 : tty1 tty2
- : user2 : tty4 tty5 tty6
- : ALL : ALL
# 环境中
[root@computer07 ~]# tail -n4 /etc/security/access.conf
+ : root : tty1 tty2 tty3 tty4 tty5 tty6
+ : huzeqiu : tty1 tty2
- : fanbinglong : tty4 tty5 tty6
- : ALL : ALL
[root@computer07 ~]#
上述配置中,第一行允许 root 用户登录 tty1-tty6 终端;第二行允许 user1 用户登录 tty1-tty2 终端;第三行不允许 user2 用户登录 tty4-tty6 终端;第四行禁止所有用户登录除 tty1-tty6 以外的终端。
- 重新启动登录服务,以使更改生效:
[root@computer07 ~]# systemctl restart getty@tty1.service
[root@computer07 ~]# systemctl is-active getty@tty1.service
active
[root@computer07 ~]#
- 以上步骤使用了 pam_securetty.so 模块来限制 root 用户仅从本地控制台登录,而使用 pam_access.so 模块来限制用户登录的终端。管理员可以按照实际需要进行适当的配置,以限制用户的登录操作并增强系统的安全性。
【对于内存空间紧张:若/proc/sys/vm/panic_on_oom内容为0,则在可用内存低时触发OOM机制,系统自动根据进程的oom_score值选择结束某些进程;【系统为管理员用户预留的内存量由文件/proc/sys/vm/admin_reserve_kbytes 给 出 】 】
- 已经配置了,此题完结
可用内存低时会触发 OOM(Out of Memory)机制,系统根据进程的 OOM Score 值选择终止某些进程来释放内存。一般来说,管理员并不需要手动干预 OOM 机制的操作。
[root@computer07 ~]# cat /proc/sys/vm/panic_on_oom
0
[root@computer07 ~]#
[root@computer07 ~]# cat /proc/sys/vm/admin_reserve_kbytes
8192
[root@computer07 ~]#
- 下面是详细介绍OOM机制
-
在 Linux 中,每个进程都有一个 OOM Score(OOM 分数)值,用于表示系统对进程的优先级评估,值越高表示这个进程越容易被选择被结束。进程的 OOM Score 值可以由内核根据一定的规则计算得出。在默认情况下,每个进程的 OOM Score 值设为0,具体如下:
- 对于通过用户请求编译的进程,OOM Score 增加 1。
- 对于进程的 VSS(Virtual Set Size)值每增加 4KB,OOM Score 增加1。
- 对于进程的 RSS(Resident Set Size)值每增加4KB,OOM Score增加1。
- 在经过上述计算得出 OOM Score 值后,Linux 内核会根据该值来选择要终止的进程。具体原则如下:
找出 OOM Score 最高的进程,将其终止; - 如果还有足够的内存,且有其他进程处于“可终止”状态,那么终止 OOM Score 次高的进程;
- 依此类推,直到释放足够的内存为止,或者没有进程可供终止为止。
需要注意的是,手动杀死进程可能会导致数据丢失或应用程序崩溃,应谨慎使用。如果出现频繁的 OOM 报警,可以考虑增加服务器的内存大小或者优化系统配置,以避免进程被意外终止。
-
OOM(Out of Memory)机制是 Linux 中用于处理内存不足的一种机制。当系统内存不足时,操作系统会优先终止一些进程,以腾出更多的内存空间来支持系统的正常运行。
-
Linux 中的 OOM 机制使用 OOM Score(OOM 分数)值来判断要终止哪些进程。 OOM Score 值用于表示系统对进程的优先级评估,值越高表示这个进程越容易被选择被结束。如果进程的 OOM Score 高,那么它被结束的几率就越大。
-
管理员可以通过以下命令查看进程的 OOM Score:
ps axo pid,comm,vsz,oom_score | grep -v grep | sort -n -k4 | tail -n10
该命令会显示出占用内存最多的10个进程及其 OOM Score。(该命令输出的结果中,“vsz”列表示进程占用的虚拟内存大小,单位为 KiB,OOM Score 从小到大排序) -
当系统可用内存低于特定的阈值时,在内核日志文件中(通常为
/var/log/messages
)会记录如下的警告信息:Out of memory - kill process 1234 (some_process) score 321 or sacrifice child
这表示操作系统因为内存不足,而要终止 ID 为 1234 的进程 some_process。其中的 score 为该进程的 OOM Score 值。在该情况下,内核会根据 OOM Score 值选择一个进程并终止它,以释放更多的内存空间。 -
需要注意的是,触发 OOM 机制会导致部分进程被结束从而可能导致数据丢失、系统崩溃等问题,因此在实际运维中,管理员应该根据系统的实际情况和负载状况设定合理的 OOM_SCORE 和管理员内存预留值,以充分利用系统资源,并且保证系统的稳定和安全。
-
-
在可用内存低时会触发 OOM(Out of Memory)机制,系统根据进程的 OOM Score 值选择终止某些进程来释放内存。一般来说,管理员并不需要手动干预 OOM 机制的操作。
-
如果管理员确实需要手动终止某个进程,可以通过 kill 命令来实现。kill 命令可以向进程发送指定的终止信号,常用的终止信号包括 SIGTERM 和 SIGKILL。其中,SIGTERM 会通知程序用于按照正常流程结束程序,而 SIGKILL 会强制结束进程。
下面是 kill 命令的语法:kill [-signal] PID
其中参数 signal 表示要发送的信号,默认为 SIGTERM。需要终止的进程的进程 ID(PID)可以通过 ps 命令或者 pgrep 命令来获取。 -
例如,以下命令会向 PID 为 12345 的进程发送 SIGKILL 信号,强制结束该进程:
kill -9 12345
需要注意的是,在手动操作时应谨慎进行,因为音乐、游戏和一些基础的操作系统进程可能是系统重要的组成部分,终止它们可能会导致意外的问题发生。因此,在进行手动操作之前,一定要确保理解其风险,并进行充分的测试和备份。
-
-
【对于磁盘空间紧张:可为用户或用户组设置磁盘限额, 防止其过度消耗磁盘空间;系统管理员可以不受磁盘限额的限制,以执行其管理功能;】
-
说明
-
对于磁盘空间紧张的情况,为用户或用户组设置磁盘限额是一种有效的控制磁盘空间使用的方法。通过设置磁盘限额,可以限制每个用户或用户组可以使用的磁盘空间大小,从而避免它们过度消耗磁盘空间,导致系统磁盘空间不足。
-
Linux 系统提供了一种名为 quota 的机制,可以用来限制用户或用户组的磁盘使用量。通过设置磁盘限额,可以为每个用户或用户组分配特定的磁盘空间配额,一旦达到配额限制,用户或用户组将无法继续往磁盘中写入数据。
-
同时,为了确保系统管理员可以执行其管理功能,quota 机制允许管理员不受磁盘限额的限制。管理员可以使用其特权,以超级用户的身份执行各种磁盘维护和管理任务,而不受磁盘限额的限制。
-
需要注意的是,quota 机制只控制用户或用户组对磁盘空间的使用量,并不控制应用程序对内存的使用量。因此,在设置磁盘限额时,也需要关注系统内存的使用情况,以确保系统运行稳定和高效。
-
-
为用户或用户组设置磁盘限额,可以使用 Linux 系统提供的 quota 机制来实现。quota 机制允许管理员为每个用户或用户组设置磁盘空间配额,并在超过配额后阻止用户或用户组往磁盘中写入数据。
以下是 quota 机制的设置过程:【本题目要做的话,我觉得仅仅是安装auota命令即可,并不需要真正的去限制】 -
准备工作:首先需要安装并启用 quota 机制。具体步骤如下:
# 安装 quota 工具集
yum install quota -y
# 启用 quota 机制
vi /etc/fstab(编辑文件)
#在挂载选项中添加 usrquota(用户磁盘配额)或 grpquota(用户组磁盘配额),例如:
/dev/sda1 /home ext4 defaults,usrquota 0 0
# 重新挂载文件系统
mount -o remount /home
-
为用户或用户组设置磁盘限额:quota 机制的配额信息存放于文件系统上的特殊文件 quota.user 或 quota.group 中。管理员可以使用 edquota 命令针对每个用户或用户组单独设置磁盘限额。例如,以下命令为 user1 分配了 1GB 的磁盘空间配额:
-
edquota -u user1
然后按照提示设置 user1 的磁盘空间配额为 1GB 即可。 -
查看磁盘限额:可以使用 repquota 命令查看每个用户或用户组的磁盘配额信息,例如:
repquota /home
-
清除磁盘空间配额:如果需要解除对用户或用户组的磁盘限额,可以使用 edquota 命令将配额设为 0 或删除配额信息,例如:
edquota -u user1
(清除 user1 的磁盘限额) -
需要注意的是,为了有效控制用户或用户组的磁盘使用量,管理员应该定期检查和清理不必要的数据,并对新数据进行合理的存储和管理。只靠设置磁盘限额是无法解决磁盘空间紧张的问题的。
【 1,内核有参数/proc/sys/vm/min_free_kbytes, 在可用物理内存低于此阈值时,系统自动启动内核线程kswapd进行内存回收。】
- 已配置
[root@computer07 ~]# cat /proc/sys/vm/min_free_kbytes
135168
[root@computer07 ~]#
-
kswapd 是 Linux 内核的一个线程,它负责管理系统中的内存交换(或称内存回收)操作。当系统物理内存低于一定阈值时,kswapd 会启动并选择一些内存页交换到磁盘上,以释放物理内存空间,供其他应用程序使用。kswapd 的工作状态和策略可以通过内核的参数进行配置。
-
以下是常见的 kswapd 配置参数:
-
/proc/sys/vm/swappiness
:通过 /proc/sys/vm/swappiness 参数来调整内存回收的敏感度。该参数默认值为 60,表示系统将使用 40% 的内存作为缓存,并在缓存内存用尽时启动 kswapd 进程进行内存回收。可以根据需要将参数值调整为更合适的值。取值范围为 0~100,0 表示基本不需要交换,100 表示大部分内存交换。
例: 将 swappiness 参数设置为 20echo "20" > /proc/sys/vm/swappiness
-
/proc/sys/vm/vfs_cache_pressure
:通过 /proc/sys/vm/vfs_cache_pressure 参数调整 VFS 缓存项的回收敏感度。VFS 全称为 Virtual Filesystem Switch,是 Linux 内核文件系统层的抽象层。该参数指定了在回收内存时,VFS 缓存项相对于匿名和页面缓存的权重。默认值为 100,表示 VFS 缓存项与页面缓存和匿名缓存一样敏感,都应该被尽可能回收。可以根据需要将此参数值调整为更合适的值。【换一种说法:该参数决定当系统需要释放 inode 和 dentry 的时候,是释放 inode 和 dentry,还是交换部分内存出来。默认值为 100,表示系统倾向于释放 inode 和 dentry。】
例:将 vfs_cache_pressure 参数设置为 50echo "50" > /proc/sys/vm/vfs_cache_pressure
-
proc/sys/vm/dirty_background_ratio
:该参数决定当脏页的数量占可视内存的百分比时,内核开始清理脏页。默认值为 5。
例:将 dirty_background_ratio 参数设置为 10echo "10" > /proc/sys/vm/dirty_background_ratio
-
/proc/sys/vm/dirty_ratio
:该参数决定当脏页的数量占可视内存的百分比超过 dirty_ratio 时,系统将阻塞写入操作,直到页染色器将脏页面保持在后台。默认值为 10。
例: 将 dirty_ratio 参数设置为 20echo "20" > /proc/sys/vm/dirty_ratio
-
设置内核参数可以通过 echo 命令修改参数值,但需要注意的是,这些参数仅在当前会话中生效,系统重启后将失效。
-
-
如果要使新的参数设置永久生效,可以将其添加到
/etc/sysctl.conf
文件中,并使用sysctl -p
命令重新加载参数。 -
查看参数是否生效,如:
cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure
如果输出结果为之前设置的值,则说明参数设置已生效。 -
需要注意的是,调整 kswapd 的配置需要了解系统的实际使用情况和硬件资源,才能做到合理且稳定。为了避免因配置失误引发性能问题,建议谨慎操作,并测试修改后的效果。
-
以下是
/etc/sysctl.conf
文件中常见参数的详细说明: -
kernel.core_uses_pid:
这个参数控制是否将进程 ID 包括在核心转储文件的文件名里。如果将该值设置为 1,则核心转储文件的文件名将包括进程 ID。默认情况下它是 0。-
kernel.sysrq:
此选项允许管理员使用特殊组合键扳机多个内核操作。如果将该值设置为 1,则激活 SysRq 功能。默认情况下它是 1。 -
net.ipv4.ip_forward:
该选项控制内核是否允许 IP 数据包转发。如果将该值设置为 1,则允许转发。如果设置为 0,则禁止转发。默认情况下它是 0。 -
net.ipv4.tcp_max_syn_backlog:
该参数指定了 TCP 协议的 SYN 接收队列最大长度。默认值为 1024。 -
vm.swappiness:
该参数决定系统使用 swap 分区的程度。取值范围是从 0 到 100,0 表示系统尽量不使用 swap 分区,100 表示大部分内存都放到 swap 分区中。默认情况下它是 60。 -
fs.file-max:
该选项允许 root 用户设置系统所能打开的文件句柄的最大数量。默认值是 8192。 -
net.core.somaxconn:
该参数具体规定了并发的完整 TCP 连接队列的最大大小。默认值为 128。 -
net.ipv4.tcp_keepalive_time:
该选项对应的是 TCP 连接的闲置超时时间,单位是秒。它的默认值是 7200 秒(2 小时)。 -
kernel.msgmni:
这个值设定所有内核命名空间中所有消息队列的最大数量。默认情况下,它是 32000。 -
kernel.shmmax:
此选项指定了进程可以使用的最大物理页面大小(以字节为单位)。 -
vm.overcommit_memory:
该值决定在 Linux 内核中执行内存分配时是否有效于虚拟内存的实际物理内存,或者是否存在任何预算控制。默认情况下它是 0。 -
vm.vfs_cache_pressure:
该值意味着内核偏向于清除 inode 和 dentry,还是交换部分内存出来。默认值是 100,意味着内核总是更趋向于 inode 和 dentry。 -
net.ipv4.tcp_syncookies:
该选项控制是否启用 SYN Cookie 功能。如果设置为 1,则开启 SYN Cookie 功能;如果设置为 0,则关闭。 -
kernel.msgmax:
这个值决定了系统中一个消息能够传输的最大大小。默认情况下它是 65536。 -
net.core.optmem_max:
这个值规定套接字选项可用的最大存储段字节数。在默认情况下,该值是 2048 字节。 -
需要注意的是,修改 /etc/sysctl.conf 文件后可以使用 sysctl -p 命令使新的内核参数生效。此外,修改内核参数需要谨慎,应仅在必要的情况下进行,并在了解其含义和影响后进行操作。
-
【3,软件包Nagios可用来监视系统资源的使用状态,在内存、磁盘资源紧张时会给出报警。】
-
这是一套监控系统了,这暂时不搞
-
要使用Nagios来监视系统资源的使用状态,并在内存、磁盘资源紧张时给出报警,可以按照以下步骤进行实现:
- 安装Nagios:首先,确保已在您的系统上安装Nagios。具体安装方法会根据您所使用的操作系统而有所不同。您可以参考Nagios的官方文档或官方网站上的安装指南来完成安装。
-
定义资源监视:在Nagios的配置文件中定义用于监视系统资源的检查。具体步骤如下:
- 打开Nagios的配置文件,通常位于/etc/nagios/目录下。
- 在配置文件中,找到要监视的主机(或主机组)的定义区块,并在其中添加适当的监视服务定义。例如,要监视内存和磁盘使用情况,可以使用check_disk和check_mem插件。
- 针对每个监视服务,指定阈值和警报条件,以便在资源紧张时触发警报。您可以设置阈值为适当的百分比或绝对值,例如当内存使用率超过80%时触发警报。
配置警报通知:在Nagios中配置警报通知,以便在触发资源警报时,系统可以向您发送通知。具体步骤如下:
-
在Nagios的配置文件中,找到定义警报通知的区块,例如contacts.cfg或commands.cfg。
-
配置适当的警报通知方法,如电子邮件、短信、PagerDuty等。确保提供正确的联系信息和配置参数。
-
重启Nagios服务:完成资源监视和警报通知的配置后,重新启动Nagios服务以使更改生效。具体操作可以使用系统的服务管理工具,如systemctl或service命令。
-
测试和监视:等待一段时间,让Nagios开始监视系统资源,并在资源紧张时触发警报。确保您收到了警报通知,并根据需要进行调整和优化。
-
-
请注意,以上步骤只是一个简单的概述,并未包括所有细节和配置选项。在实际操作中,根据您的具体需求和系统环境,可能需要进行更多的配置和调整。建议参考Nagios的官方文档、社区论坛和相关资源来获取更详细的指导和帮助。
【维护模式下,安全机制都被关闭,管理员可执行各种管理操作;维护模式下,仅支持系统管理员登录;】
-
以下是针对Linux系统的一种实现方法,用于实现维护模式下关闭安全机制和仅支持系统管理员登录的功能:
-
- 关闭安全机制:
- SELinux: 将SELinux的运行模式切换为permissive或disabled。可以通过修改配置文件
/etc/selinux/config
中的SELINUX
参数来实现。例如,将SELINUX=enforcing
修改为SELINUX=permissive
。 - AppArmor: 可以通过修改AppArmor配置文件或禁用相关配置文件来暂时禁用AppArmor。具体步骤可能因所使用的Linux发行版而异,请参考相应的文档或查找相关信息。
- 防火墙:暂时放宽防火墙规则,以允许管理员执行维护操作。具体方法取决于使用的防火墙工具,例如可以使用iptables命令或firewalld工具来修改规则。
-
- 仅支持系统管理员登录:
- 修改PAM配置:编辑PAM(Pluggable Authentication Modules)配置文件,限制只有系统管理员帐户可以在维护模式下登录。对于大多数Linux发行版,可以编辑
/etc/pam.d/su
文件,将auth sufficient pam_rootok.so
修改为auth requisite pam_rootok.so
。这将确保只有root用户(系统管理员)可以在维护模式下使用su
命令切换用户【不能做,做了普通用户用工具登录时su不到root】。 - 创建维护账户:创建一个专门的维护账户,仅限该账户在维护模式下登录和执行管理操作。可以使用
useradd
命令创建该账户,并将其添加到适当的组以获得管理员权限。然后,通过修改PAM配置文件,确保该账户在维护模式下可以登录。
-
请注意,上述方法只是一种实现方式,具体步骤可能因操作系统和所使用的工具而有所不同。在执行这些更改之前,强烈建议备份系统和相关配置文件,并确保了解所做更改的影响和潜在的安全风险。为了确保系统安全,建议在完成维护任务后重新启用安全机制,并进行必要的审查和测试。
-
【1. 对CPU的使用:使用CFS调度算法,可通过nice命令调节进程的优先级;可通过cgroup机制限制进程对cpu的使用量;2. 对RAM的使用:可基于/proc/$PID/oom_score杀死进程以腾出内存空间;可通过cgroup机制限制进程对RAM的使用量;】
-
两种方法来管理和限制CPU的使用:
我们这感觉只需要保证有下面两个命令就行了。-
- 使用CFS调度算法和nice命令:
- CFS(Completely Fair Scheduler)是Linux内核的默认调度器,它通过以公平的方式分配CPU时间片来管理进程。每个进程都会收到一个动态调整的优先级,以实现公平的CPU使用。
- 你可以使用
nice
命令来调节进程的优先级。更高的nice值意味着较低的优先级,进程会在其他优先级较高的进程之后获得CPU时间片。可以使用nice
命令将进程的优先级增加或降低。例如,nice -n 10 ./your_process
会将进程的优先级降低。
-
- 使用cgroup机制限制CPU使用量:
- cgroup(Control Group)是Linux内核的一个特性,用于将进程组织成所谓的控制组,并对其资源使用进行限制。你可以使用cgroup设置CPU的使用量限制。
- 首先,需要创建一个cgroup并将要限制CPU使用的进程添加到该cgroup。然后,使用
cgset
命令设置cgroup的CPU限制。例如,cgset -r cpu.cfs_quota_us=500000 -r cpu.cfs_period_us=1000000 /your_cgroup
将限制cgroup中的进程在每个1秒的时间窗口内使用50%的CPU。 - 设置完毕后,cgroup将会强制限制cgroup中的进程在指定的时间窗口内使用的CPU量。
-
这些方法允许你对进程的CPU使用进行管理和限制,以控制其优先级和使用量。请注意,具体操作步骤可能因操作系统版本和设置而有所不同。建议查阅相关文档或使用
man
命令查找具体工具和命令的用法。
-
-
对于RAM的使用,有两种方法可以控制进程的内存消耗。
-
使用
/proc/$PID/oom_score
杀死进程:当系统的内存资源不足时,系统会根据每个进程的oom_score值来选择性地杀死一些进程以腾出内存空间。oom_score值越高的进程,越有可能被杀死。可以通过修改/proc/$PID/oom_score
的值来调整进程的oom_score,并因此影响进程的被杀死的优先级。 -
使用cgroup机制限制进程对RAM的使用量:cgroup(Control Group)是Linux内核提供的一种机制,用于对进程组进行资源控制和限制。可以通过cgroup机制为每个进程组分配一定的资源配额,并限制进程组使用的RAM的数量。这样就可以确保系统的内存资源被合理分配,避免某个进程占用过多的RAM导致系统整体性能下降。
-
这两种方法可以根据需要来选择使用,/proc/$PID/oom_score的方法更加直接,可以根据具体的需求来调整进程的oom_score值;而cgroup机制更加全面,可以通过分配资源配额对进程组进行更细粒度的控制。
-
【1. 对于本地登录(login)和远程登录(sshd),都对用户做身份鉴别,鉴别一般通过PAM完成。比如在文件/etc/pam.d/system-auth和/etc/pam.d/sshd中添加如下行:“account required pam_access.so”】
1. 对于本地登录(login)和远程登录(sshd),都对用户做身份鉴别,鉴别一般通过PAM完成。比如在文件
/etc/pam.d/system-auth和/etc/pam.d/sshd中添加如下行:
"account required pam_access.so"
2. PAM中的pam_access.so模块允许在
/etc/security/access.conf文件中限制本地登录的地址
(tty终端)、远程登录的源IP地址,例如,若禁止root在本地的终端tty5登录:
-:root:tty5
若要禁止用户uuu从主机192.168.137.44登录:
-:uuu:192.168.137.44
在将"account required pam_access.so"添加到/etc/pam.d/system-auth和/etc/pam.d/sshd文件中后,这将启用pam_access模块的功能,并在进行账户验证时进行进一步的访问控制。
在/etc/pam.d/system-auth文件中添加该行后,表示在进行系统级认证时,会使用pam_access模块对用户的访问进行控制。
在/etc/pam.d/sshd文件中添加该行后,表示在使用SSH进行远程连接时,也会使用pam_access模块对用户的访问进行控制。
要注意,具体的访问控制规则需要在pam_access模块的配置文件中进行设置(通常为/etc/security/access.conf),并根据需要定义对用户和组的访问限制。
添加这行配置后,系统会根据pam_access模块的规则来对用户进行访问控制,例如限制某些用户或组登录SSH或执行特定命令的权限。确保在配置之前了解pam_access模块的具体功能和用法,并根据系统的需求进行相应的配置。
- 先配置access.conf文件
如我这允许root、huzeqiu和manager登录
[root@computer07 ~]# tail -n 10 /etc/security/access.conf
# User "john" should get access from ipv6 net/mask
#+ : john : 2001:4ca0:0:101::/64
#
# All other users should be denied to get access from all sources.
#- : ALL : ALL
+ : root : tty1 tty2 tty3 tty4 tty5 tty6
+ : huzeqiu : tty1 tty2
+ : manager : tty1 tty2 tty3 tty4
- : fanbinglong : tty4 tty5 tty6
- : ALL : ALL
[root@computer07 ~]#
- 在文件/etc/pam.d/system-auth和/etc/pam.d/sshd中添加如下行:
“account required pam_access.so” 【做之前先备份文件】
[root@computer07 ~]# cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak0625
[root@computer07 ~]# cat /etc/pam.d/system-auth | grep access
account required pam_access.so
[root@computer07 ~]#
[root@computer07 ~]# cp /etc/pam.d/sshd /etc/pam.d/sshd.bak0625
[root@computer07 ~]# cat /etc/pam.d/sshd | grep access
account required pam_access.so
[root@computer07 ~]#
【3. 可通过iptables命令拒绝(或接受)来自远端某主机某端口的请求。比如:iptables -A INPUT -s 192.168.137.44 -p tcp – dport 1500 -J REJECT或 iptables -A INPUT -s 192.168.1.0/24 -p tcp – sport 1024:65534 --dport ssh -j ACCEPT】
有iptables防火墙阻止策略了的,跳过
【1,对于本地登录:systemd中的getty@.service可以支持在每个本地tty设备上启动一个会话,实际的会话数量可由文件/etc/systemd/logind.conf设定,系统默认为6; 2,对于远程登录:可通过sshd_config中的MaxStartups和MaxSessions配置项进行限制。】
-
说明
-
- 对于本地登录:systemd中的getty@.service可以支持在每个本地tty设备上启动一个会话,实际的会话数量可以在
/etc/systemd/logind.conf
文件中进行配置。在该文件中,有一个名为"NAutoVTs"的配置项,默认值为6。这个值表示可以在每个本地tty设备上启动的会话数量。可以修改该配置项来增加或减少会话的数量。
- 对于本地登录:systemd中的getty@.service可以支持在每个本地tty设备上启动一个会话,实际的会话数量可以在
-
- 对于远程登录:可以通过sshd_config配置文件中的MaxStartups和MaxSessions配置项来限制远程登录的数量。
-
MaxStartups:该配置项指定了同时允许的最大远程登录(SSH)连接数量。它有三个参数,分别表示在指定时间窗口内接受的连接数、达到此数后进一步接收的每个连接所需的时间间隔、以及在此之后拒绝的连接数。例如,MaxStartups 10:30:60表示在10分钟内允许最多10个连接,30分钟内逐渐增加,60分钟后拒绝其他连接。
-
MaxSessions:该配置项指定了每个用户可以同时打开的SSH会话的最大数量。默认情况下,该值为10。可以将MaxSessions配置为一个较小的数值来限制每个用户的并发会话数量。
-
通过调整MaxStartups和MaxSessions这两个配置项,可以根据需求来限制远程登录的数量,防止资源过度占用以及增加系统安全性。在修改sshd_config文件后,需要重新加载或重启SSH服务以使配置生效。
-
-
我们配置如下:
[root@computer07 ~]# cat /etc/systemd/logind.conf | grep NAu
NAutoVTs=10
[root@computer07 ~]# cat /etc/ssh/sshd_config | egrep 'MaxSessions|MaxStartups'
MaxSessions 10
MaxStartups 20:50:100
[root@computer07 ~]#
[root@computer07 ~]# systemctl restart sshd
【3,PAM中的pam_limits.so可以限制某个用户或者用户组的最大登录会话数。比如:/etc/pam.d/sshd,添加一行配置:session required pam_limits.so /etc/security/limits.conf,添加一行配置:testuser - maxlogins 2】
-
PAM中的pam_limits.so模块可以用于限制某个用户或用户组的最大登录会话数。要限制特定用户的会话数,可以按照以下步骤进行配置:
-
- 在/etc/pam.d/sshd文件中添加一行配置,指定会话限制规则:
session required pam_limits.so
这将在用户会话过程中加载pam_limits模块,并应用会话限制规则。
-
- 在/etc/security/limits.conf文件中添加一行配置,指定用户的会话限制:
testuser - maxlogins 2
这将限制名为"testuser"的用户最大的登录会话数为2。你可以将"testuser"替换为你想要限制的特定用户,maxlogins则指定了最大的会话数。
-
确保正确地保存并更新这两个配置文件后,重新加载或重启SSH服务,以使配置生效。
-
这样配置后,用户"testuser"在登录时将只能同时拥有最多2个会话,超过限制的会话将被拒绝。这有助于控制用户并发登录的数量,防止资源滥用和增加系统安全性。
-
-
配置
我这以限制用户fanbinglong用户最大并发数量为5
[root@computer07 ~]# cat /etc/pam.d/sshd | grep limit
account required pam_access.so
[root@computer07 ~]#
[root@computer07 ~]# tail -n2 /etc/security/limits.conf
* hard nofile 65535
fanbinglong - maxlogins 5
[root@computer07 ~]#
【配置脚本/etc/profile.d/system-info.sh可向新登录用户报告所要求的的信息。配置脚本/etc/profile.d/system-info.sh可向新登录用户报告所要求的时间、地址等信息。配置脚本/etc/profile.d/system-info.sh可向新登录用户报告口令的截止日期以及剩余天数。配置脚本/etc/profile.d/system-info.sh可向新登录用户报告登录历史数据:1. 在/var/log/wtmp文件中记录登录成功的时间、次数等信息;2. 在/var/log/btmp文件中记录登录失败的历史,报告失败次数及时间等信息。】
[root@computer07 ~]# cat /etc/profile.d/system-info.sh
#!/bin/bash
# Get system information
time=$(date "+%Y-%m-%d %H:%M:%S")
address=$(hostname -I | awk '{print $1}')
# 获取用户密码的过期日期
expiry_date=$(chage -l $USER | grep "Password expires" | awk -F': ' '{print $2}')
#计算密码过期剩余天数
current_date=$(date +%s)
expiration_date=$(date -d "$expiration_date" +%s)
remaining_days=$(( ($expiration_date - $current_date) / (60 * 60 * 24) ))
hostname=$(hostname)
kernel=$(uname -r)
cpu=$(cat /proc/cpuinfo | grep 'model name' | uniq | awk -F ': ' '{print $2}')
memory=$(free -h | awk '/Mem:/ {print $2}')
disk=$(df -h / | awk '/\// {print $2}')
# 获取最近登录用户的登录历史记录
login_history=$(last $USER | head -n2)
# 获取登录成功的信息
successful_logins=$(cat /var/log/wtmp | last -n5)
# 获取登录失败的信息
failed_logins=$(cat /var/log/btmp | last -n5)
# Print system information
echo "Welcome to $hostname!"
echo "当前系统时间:$time"
echo "IP 地址:$address"
echo "您的密码将于 $expiration_date 过期"
echo "您还剩下 $remaining_days 天密码过期"
echo " - Kernel: $kernel"
echo " - CPU: $cpu"
echo " - Memory: $memory"
echo " - Disk: $disk"
echo " 最近登录用户的登录历史记录:"
echo " $login_history"
echo "成功登录信息:"
echo "$successful_logins"
echo ""
echo "登录失败信息:"
echo "$failed_logins"
[root@computer07 ~]#
[root@computer07 ~]#
[root@computer07 ~]# chmod 777 /etc/profile.d/system-info.sh
[root@computer07 ~]# sh /etc/profile.d/system-info.sh
Welcome to computer07!
当前系统时间:2023-06-26 08:09:59
IP 地址:1.2.198.10
您的密码将于 1687708800 过期
您还剩下 0 天密码过期
- Kernel: 3.10.0-514.26.2.el7.x86_64
- CPU: Intel(R) Xeon(R) CPU E7-4820 v3 @ 1.90GHz
- Memory: 503G
- Disk: 88G
最近登录用户的登录历史记录:
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
root pts/0 1.2.198.1 Wed Mar 22 01:47 - 01:53 (00:05)
成功登录信息:
manager pts/1 1.2.198.1 Mon Jun 26 07:13 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:04 - 07:13 (00:09)
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
manager pts/0 1.2.198.1 Mon Jun 26 06:58 still logged in
manager pts/0 1.2.198.1 Mon Jun 26 06:52 - 06:57 (00:04)
wtmp begins Wed Nov 22 06:15:08 2017
登录失败信息:
manager pts/1 1.2.198.1 Mon Jun 26 07:13 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:04 - 07:13 (00:09)
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
manager pts/0 1.2.198.1 Mon Jun 26 06:58 still logged in
manager pts/0 1.2.198.1 Mon Jun 26 06:52 - 06:57 (00:04)
wtmp begins Wed Nov 22 06:15:08 2017
[root@computer07 ~]#
[root@computer07 ~]#
- 登录测试
- 该脚本会在用户登录时被执行,并在终端上显示系统一系列信息。
- 确保将该脚本保存为可执行文件,并且具有适当的权限(例如,chmod 777 /etc/profile.d/system-info.sh)。当新用户登录时,系统会自动执行该脚本,并将所需的信息显示给用户。
- 请注意,这仅适用于以交互方式登录的用户(例如,通过终端登录)。对于非交互式的会话(例如,通过SSH远程登录和执行命令的情况),该脚本可能不会执行。
[root@controller01 ~]# ssh manager@1.2.198.10
/etc/ssh/ssh_config line 57: Unsupported option "gssapiauthentication"
Authorized users only. All activity may be monitored and reported
manager@1.2.198.10's password:
Last login: Mon Jun 26 07:13:22 2023 from 1.2.198.1
Authorized users only. All activity may be monitored and reported
cat: /var/log/btmp: Permission denied
Welcome to computer07!
当前系统时间:2023-06-26 08:11:50
IP 地址:1.2.198.10
您的密码将于 1687708800 过期
您还剩下 0 天密码过期
- Kernel: 3.10.0-514.26.2.el7.x86_64
- CPU: Intel(R) Xeon(R) CPU E7-4820 v3 @ 1.90GHz
- Memory: 503G
- Disk: 88G
最近登录用户的登录历史记录:
manager pts/0 1.2.198.1 Mon Jun 26 08:11 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:13 still logged in
成功登录信息:
manager pts/0 1.2.198.1 Mon Jun 26 08:11 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:13 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:04 - 07:13 (00:09)
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
manager pts/0 1.2.198.1 Mon Jun 26 06:58 - 08:11 (01:12)
wtmp begins Wed Nov 22 06:15:08 2017
登录失败信息:
manager pts/0 1.2.198.1 Mon Jun 26 08:11 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:13 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:04 - 07:13 (00:09)
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
manager pts/0 1.2.198.1 Mon Jun 26 06:58 - 08:11 (01:12)
wtmp begins Wed Nov 22 06:15:08 2017
[manager@computer07 ~]$
[manager@computer07 ~]$ su -
Password:
Last login: Mon Jun 26 08:11:37 CST 2023 on pts/0
Welcome to computer07!
当前系统时间:2023-06-26 08:11:54
IP 地址:1.2.198.10
您的密码将于 1687708800 过期
您还剩下 0 天密码过期
- Kernel: 3.10.0-514.26.2.el7.x86_64
- CPU: Intel(R) Xeon(R) CPU E7-4820 v3 @ 1.90GHz
- Memory: 503G
- Disk: 88G
最近登录用户的登录历史记录:
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
root pts/0 1.2.198.1 Wed Mar 22 01:47 - 01:53 (00:05)
成功登录信息:
manager pts/0 1.2.198.1 Mon Jun 26 08:11 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:13 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:04 - 07:13 (00:09)
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
manager pts/0 1.2.198.1 Mon Jun 26 06:58 - 08:11 (01:12)
wtmp begins Wed Nov 22 06:15:08 2017
登录失败信息:
manager pts/0 1.2.198.1 Mon Jun 26 08:11 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:13 still logged in
manager pts/1 1.2.198.1 Mon Jun 26 07:04 - 07:13 (00:09)
root tty1 Mon Jun 26 07:01 - 07:06 (00:05)
manager pts/0 1.2.198.1 Mon Jun 26 06:58 - 08:11 (01:12)
wtmp begins Wed Nov 22 06:15:08 2017
[root@computer07 ~]#
【对于执行SHELL的登录会话,/etc/profile文件中设置,TMOUT变量,以指定会话“静默”的时限。】
-
说明
-
在/etc/profile文件中,您可以设置TMOUT变量来指定会话的静默时间限制。静默时间是指在用户没有任何操作的情况下,会话将自动退出的时间。
-
下面是一个示例的/etc/profile文件片段,用于设置TMOUT变量:
#设置会话静默时间限制为300秒(5分钟)
TMOUT=300
export TMOUT
在上述示例中,TMOUT变量被设置为300秒(5分钟),并使用export命令导出为环境变量。 -
将上述内容添加到/etc/profile文件中,并保存更改。当用户登录时,会话将在静默时间超过指定的时间后自动退出。
-
请注意,TMOUT变量的设置仅适用于登录会话的交互式shell。对于非交互式shell或其他会话类型,TMOUT变量可能不会起作用。
-
-
合规中有该内容,跳过
[root@computer07 ~]# tail -n2 /etc/profile
TMOUT=180
export TMOUT
[root@computer07 ~]#
crontab定时任务不能用解决方法
报错说明
- 上面的操作做完以后,定时任务就不能用了。报错如下
[root@computer03 ~]# crontab -l
You (root) are not allowed to access to (crontab) because of pam configuration.
[root@computer03 ~]#
处理方法
- 现在/etc/pam.d/crond的配置内容如下
[root@computer03 ~]# cat /etc/pam.d/crond
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
account required pam_access.so
account include password-auth
session required pam_loginuid.so
session include password-auth
auth include password-auth
[root@computer03 ~]#
- 改为下面内容即可
[root@computer03 ~]# vi /etc/pam.d/crond
#
# The PAM configuration file for the cron daemon
#
#
# No PAM authentication called, auth modules not needed
#account required pam_access.so
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
#auth include password-auth
account sufficient pam_access.so
account include system-auth
session sufficient pam_loginuid.so
session include system-auth
auth sufficient pam_rootok.so
auth required pam_env.so
auth include system-auth
~
- 改完以后,定时任务就正常了
[root@computer03 ~]# crontab -l
* * * * * /usr/sbin/ntpdate controller01 > /dev/null 2>&1
[root@computer03 ~]#
- 上面改的代码解释
-
ccount sufficient pam_access.so
:指示在身份验证成功后,检查用户是否被允许访问系统。pam_access.so模块根据访问控制规则允许或拒绝用户访问。 -
account include system-auth
:包含system-auth文件的账户配置,system-auth文件通常包含一些通用的账户管理规则。 -
session sufficient pam_loginuid.so
:在用户会话开始时记录登录ID(loginuid)。这通常用于审计和跟踪用户活动。 -
session include system-auth
:包含system-auth文件的会话配置,system-auth文件包含一些通用的会话管理规则。 -
auth sufficient pam_rootok.so
:在用户以root身份运行命令时提供免密码的授权。当使用sudo或su命令切换至root用户时,pam_rootok.so模块允许授权而不需要密码。 -
auth required pam_env.so
:在用户身份验证期间读取和设置环境变量。pam_env.so模块用于在用户登录期间加载和设置环境变量。 -
auth include system-auth
:包含system-auth文件的身份验证配置,system-auth文件通常包含一些通用的身份验证规则。文章来源:https://www.toymoban.com/news/detail-512991.html -
这些配置文件的具体含义和行为可能因Linux发行版和系统配置而有所不同。请注意,这只是一个配置片段,可能还有其他的PAM配置行。对于PAM配置文件的完整理解和配置,建议参考您所使用Linux发行版的官方文档和相关资源文章来源地址https://www.toymoban.com/news/detail-512991.html
-
到了这里,关于附件1.服务器操作系统安全加固要求及配置建议【下】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!