基线检查(1)Linux主机

167 阅读6分钟

一 账号口令

1 删除无关用户

2 锁定指定系统用户

  1. 检查指定用户是否被锁定
awk -F':' '
    $1=="adm" || $1=="lp" || $1=="mail" || $1=="uucp" || $1=="operator" || $1=="games" || $1=="gopher" || $1=="ftp" || $1=="nobody" || $1=="nobody4" || $1=="noaccess" || $1=="listen" || $1=="webservd" || $1=="rpm" || $1=="dbus" || $1=="avahi" || $1=="mailnull" || $1=="smmsp" || $1=="nscd" || $1=="vcsa" || $1=="rpc" || $1=="rpcuser" || $1=="nfsnobody" || $1=="sshd" || $1=="pcap" || $1=="ntp" || $1=="haldaemon" || $1=="distcache" || $1=="apache" || $1=="webalizer" || $1=="squid" || $1=="xfs" || $1=="gdm" || $1=="sabayon" || $1=="named" {
        if ($2 !~ /^(\\*|!)$/) flag++
    }
    END { 
        if (flag == 0) print "ok"; else print "no" 
    }' /etc/shadow
  1. 锁定指定用户
sudo usermod -L adm
sudo usermod -L lp
sudo usermod -L mail
sudo usermod -L uucp
sudo usermod -L operator
sudo usermod -L games
sudo usermod -L gopher
sudo usermod -L ftp
sudo usermod -L nobody
sudo usermod -L nobody4
sudo usermod -L noaccess
sudo usermod -L listen
sudo usermod -L webservd
sudo usermod -L rpm
sudo usermod -L dbus
sudo usermod -L avahi
sudo usermod -L mailnull
sudo usermod -L smmsp
sudo usermod -L nscd
sudo usermod -L vcsa
sudo usermod -L rpc
sudo usermod -L rpcuser
sudo usermod -L nfsnobody
sudo usermod -L sshd
sudo usermod -L pcap
sudo usermod -L ntp
sudo usermod -L haldaemon
sudo usermod -L distcache
sudo usermod -L apache
sudo usermod -L webalizer
sudo usermod -L squid
sudo usermod -L xfs
sudo usermod -L gdm
sudo usermod -L sabayon
sudo usermod -L named

3 禁止设置除root用户之外uid为0的用户

4 应为系统账号设置密码

5 应配置密码复杂度

6 应配置密码长度最小值

7 应配置密码最长使用期限

8 应配置密码过期前警告天数

9 应配置密码更改最小间隔天数

10 应配置密码重复使用次数限制

11 应配置账号锁定策略

二 认证授权

1 应配置账号锁定策略

编辑文件 /etc/pam.d/sshd 文件,在下方添加

auth       required     pam_tally2.so onerr=fail deny=10 unlock_time=1800 even_deny_root root_unlock_time=1800
account    required     pam_tally2.so

参数说明: deny #连续认证失败次数超过的次数 unlock_time #锁定的时间,单位是秒

2 应配置用户目录缺省访问权限

编辑 /etc/login.defs ,设置文件中umask 027或UMASK 027 umask解释: 用全部权限777去减这个数值

一。022表示默认创建新文件权限为755 也就是 rxwr-xr-x(所有者全部权限,属组读写,其它人读写) 

二。027表示默认创建新文件权限为750 也就是rxwr-x---(所有者全部权限,属组读写,其它人无)

下表列出了一些umask值及它们所对应的目录和文件权限

常用的umask值及对应的文件和目录权限

umask值       目录        文件

022             755         644

027             750         640

002             775         664

006             771         660

007             770         660

3 应配置重要文件属性

4 应配置重要目录或文件权限

/etc/rc.d/init.d/ 小于等于 750 /etc/xinetd.d 小于等于600 /ete/seeurity 小于等于 600 /ete/passwd 小于等于 644 /ete/services 小手等于 644 /etc/group 小于等于 644 /tmp 小于等于750 /etc/shadow 小于等于600 以/etc/shadow 为例,执行 chmod6400 /etc/shadow 进行设置。

#!/bin/bash

# 定义需要设置权限的文件及其权限
declare -A permissions=(
    ["/etc/rc.d/init.d/"]="750"
    ["/etc/xinetd.d"]="600"
    ["/etc/security"]="600"
    ["/etc/passwd"]="644"
    ["/etc/services"]="644"
    ["/etc/group"]="644"
    ["/tmp"]="750"
    ["/etc/shadow"]="600"
)

# 遍历文件列表并设置权限
for file in "${!permissions[@]}"; do
    permission="${permissions[$file]}"
    echo "Setting permissions $permission on $file"
    sudo chmod "$permission" "$file"
done

# 检查权限设置是否成功
for file in "${!permissions[@]}"; do
    current_permission=$(stat -c "%a" "$file")
    expected_permission="${permissions[$file]}"
    if [[ "$current_permission" == "$expected_permission" ]]; then
        echo "Permissions set correctly for $file: $current_permission"
    else
        echo "Failed to set permissions for $file: Expected $expected_permission, got $current_permission"
    fi
done

三 日志审计

1 应开启日志功能

#查看日志进行
ps -ef|grep syslogd
# 开启日志功能
service rsyslog start
chkconfig rsyslog on

2 应对登录进行日志记录

登录日志文件为 /var/log/wtmp /var/log/utmp 这两个文件中记录着所有登录过得主机的用户、时间、来源等内容,这个文件不具有可读性,可以用last命令来看。

last |grep "logged"

3 应配置开启安全事件日志

配置rsyslog 开启安全事件日志,编辑 /etc/rsyslog.conf 配置

*.err;kern.debug;daemon.notice                          /var/adm/message

其中/var/adm/messages 为日志文件。 如果该文件不存在,则创建该文件,命名为: 并修改权限为666,命令为

touch /var/adm/messages
chmod 666 /var/adm/messages

重启日志服务:

service rsyslog restart

4 应记录用户对设备的操作

参考配置: 通过设置日志文件可以对每个用户的每一条命令进行记录,这一功能默认是不开放的,为了打开它,需要安装pacct工具,并执行以下命令:

yum install psacct
touch /var/log/pacct
accton /var/log/pacct
# 执行读取命令
lastcomm [username] -f /var/log/pacct

5 应配置su命令使用情况记录

  1. 编辑/etc/rsyslog.conf,配置:
authpriv.* /var/log/secure
  1. 创建/var/log/secure文件
touch /var/log/secure
  1. 重启syslog服务
service rsyslog restart

6 应启用cron行为日志功能

编辑/etc/rsyslog.conf文件,配置:

cron.* /var/log/cron

其中,/var/log/cron为日志文件,如果该文件不存在,则创建该文件,并赋予755权限

touch /var/log/cron
chmod 755 /var/log/cron

7 应禁止日志文件全局可写

配置日志文件权限,要求如下: /var/log/maillog 小于等于775 /var/log/messages 小于等于755 /var/log/localmessages 小于等于775 /var/log/spooler 小于等于 775 /var/log/boot.log 小于等于775 /var/log/mail小于等于775 /var/log/cron小于等于775 /var/log/secure 小于等于775 以/var/log/maillog 为例,执行chmod 775 /var/log/maillog进行设置。

#!/bin/bash

# 定义需要设置权限的文件及其权限
declare -A permissions=(
    ["/var/log/maillog"]="775"
    ["/var/log/messages"]="755"
    ["/var/log/localmessages"]="775"
    ["/var/log/spooler"]="775"
    ["/var/log/boot.log"]="775"
    ["/var/log/mail"]="775"
    ["/var/log/cron"]="775"
    ["/var/log/secure"]="775"
)

# 遍历文件列表并设置权限
for file in "${!permissions[@]}"; do
    permission="${permissions[$file]}"
    echo "Setting permissions $permission on $file"
    sudo chmod "$permission" "$file"
done

# 检查权限设置是否成功
for file in "${!permissions[@]}"; do
    current_permission=$(stat -c "%a" "$file")
    expected_permission="${permissions[$file]}"
    if [[ "$current_permission" == "$expected_permission" ]]; then
        echo "Permissions set correctly for $file: $current_permission"
    else
        echo "Failed to set permissions for $file: Expected $expected_permission, got $current_permission"
    fi
done

四 访问控制

1 应禁止root用户远程登录

修改/etc/ssh/sshd_config 文件,配置PermitRootLogin no。重启服务

service sshd restart

2 应禁止匿名用户登录FTP

以vsftp为例,编辑/etc/vsftpd.conf,设置: anonymous_enable NO

vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO

3 应配置使用ssh协议进行远程维护

4 应修改SNMP默认团体字

编辑 /etc/snmp/snmpd.conf,修改private、public默认团体字为用户自定义团体字。

5 应禁止root用户登录FTP

6 应禁用OpenSSH不安全配置

  1. 确保/etc/ssh/sshd_config或/etc/ssh2/ssh2_config文件存在。如果不存在,则忽略下面配置。
  2. 在/etc/ssh/sshd_config或/etc/ssh2/ssh2_config配置: Protocol 2 PermitRootLogin no

五 其他安全

1 应安装操作系统补丁

2 应安装防病毒软件

3 应使用PAM认证模块禁止wheel组之外的用户su为root

vi /etc/pam.d/su
# 确保文件开头有以下
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid

4 应设置命令行界面超时退出

5 应删除潜在危险文件

6 应关闭core dump

vi /etc/security/limits.conf
# 确保有以下
soft core 0
hard core 0

7 应配置历史命令保存数量

配置/etc/profile文件设置HISTFILESIZE=5

8 应配置/usr/bin/目录下可执行文件的拥有者属性

找出系统中所有含有“s”属性的文件,把不必要的“s”属性去掉,或者把不用的直接删掉。

find /usr/bin -type f \( -perm -4000 -o -perm -2000 \)

chmod a-s filename
chmod a-s /usr/bin/gpasswd
chmod a-s /usr/bin/chage
chmod a-s /usr/bin/chsh
chmod a-s /usr/bin/write
chmod a-s /usr/bin/umount
chmod a-s /usr/bin/pkexec
chmod a-s /usr/bin/mount
chmod a-s /usr/bin/lockfile
chmod a-s /usr/bin/passwd
chmod a-s /usr/bin/su
chmod a-s /usr/bin/chfn
chmod a-s /usr/bin/ssh-agent
chmod a-s /usr/bin/sudo
chmod a-s /usr/bin/crontab
chmod a-s /usr/bin/wall
chmod a-s /usr/bin/newgrp

9 应配置SSH登录前警告Banner

  1. 执行如下命令创建ssh banner信息文件:
touch /etc/ssh_banner
chown bin:bin /etc/ssh_banner
chmod 644 /etc/ssh_banner
echo "Authorized only. All activity will be monitored and reported " > /etc/ssh_banner
  1. 修改/etc/ssh/sshd_config文件,添加如下行:
vi /etc/ssh/sshd_config
Bannner /etc/ssh_banner
  1. 重启sshd服务:
service sshd restart

10 应配置SSH成功登录后Banner

  1. 修改文件/etc/motd,如果没有则创建。
echo "Login success !!!" > /etc/motd

内容可根据实际需要修改

11 应限制FTP用户登录后能访问的目录

vi /etc/vsftpd/vsfptd.conf
# 确保以下行没被注释掉
chroot_local_user=YES

12 应限制远程登录IP范围

编辑/etc/hosts.allow文件,增加一行,允许访问的IP。

all:192.168.1.1:allow #允许单个IP
sshd:192.168.1.:allow #允许整个网段的PC通过ssh访问本机

13 应使用NTP保持时间同步

  1. 先装ntp服务。
  2. 开启ntp服务。
  3. 编辑ntp的配置文件,配置ntp服务的IP地址
vi /etc/ntp.conf
server 192.168.1.1

14 应关闭不必要的服务、端口

需要关闭的不必要的端口如下: discard服务 kshell服务 daytime 服务 echo服务 sendmail服务 ntalk服务 ident服务 printer服务 bootps服务 time服务 nfslock服务 Ipd服务 nfs服务 chargen服务 ypbind服务 tfip服务 klogin服务 以配置关闭discard服务为例, chkconfig [--level levels] discard off chkconfig [--level levels] discard-udp off 注:levels为运行级别,需要重启机器 判定条件: 对应服务状态值不为“开启”、“启用”和 “on”. 检测操作: 以查询discard服务状态为例 chkconfig --list 2> /dev/null | grep "^discard