Linux安全策略加固(01)

ssh服务配置

SSH单次连接最大认证次数

如果MaxAuthTries不是大于0且小于等于4,则编辑/etc/ssh/sshd_config文件,设置 MaxAuthTries 参数为4:

MaxAuthTries  3

 

禁用基于主机的认证方式

编辑/etc/ssh/sshd_config文件,添加或修改:

HostbasedAuthentication  no

 

禁止root通过ssh直接登录

建议:

编辑/etc/ssh/sshd_config文件,添加或修改:PermitRootLogin  no

 

禁用空口令登录

编辑/etc/ssh/sshd_config文件,添加或修改:PermitEmptyPasswords  no

 

禁用root用户通过SSH设置环境变量

编辑/etc/ssh/sshd_config文件,添加或修改:PermitUserEnvironment  no

 

检查加密算法

[注意事项]执行了该加固项后,可能会导致部分低版本的远程连接工具不能连接主机。目前经过测试可以使用的远程连接工具和版本有:putty 0.6、putty 0.63、SecureCRT 6.5.0和SecureCRT 7.0.0

编辑/etc/ssh/sshd_config和/etc/ssh/ssh_config文件,添加或修改:

Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr

(其中aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr为可配置参数)

 

会话闲置超时间隔

[注意事项]红线问题,要求ssh和sftp具有超时断开连接功能,该项加固ClientAliveCountMax参数必须设置为0,且ClientAliveInterval设置为大于0,才能达到ssh和sftp超时断开连接效果,其中300指定超时时间为300秒

编辑/etc/ssh/sshd_config文件,添加或修改:

ClientAliveInterval  300

ClientAliveCountMax  0

预加固:

ClientAliveInterval  1800

 

SSH服务用户访问控制

编辑/etc/ssh/sshd_config文件,设置一个或多个以下参数:

AllowUsers <userlist>

AllowGroups <grouplist>

DenyUsers <userlist>

DenyGroups <grouplist>

其中<userlist>  <grouplist>  <userlist> <grouplist>为可配置参数,且list中的user或者group以空格分隔

 

最大并行认证连接数

[注意事项]到达限制后,将不再接受新连接,除非先前的连接认证成功或超出 LoginGraceTime 的限制

编辑/etc/ssh/sshd_config文件:

MaxStartups 10:5:20

 

 

 

最大并行认证连接数

编辑/etc/ssh/sshd_config文件:

MaxStartups 5

 

口令尝试失败锁定账户

编辑

/etc/pam.d/login文件

/etc/pam.d/vsftpd文件

/etc/pam.d/su文件

/etc/pam.d/su-l文件

/etc/pam.d/sudo文件,

添加:

auth required pam_tally2.so onerr=fail audit silent deny=10 unlock_time=900 even_deny_root serialize

 

编辑/etc/pam.d/sshd文件,添加:

auth required pam_tally2.so onerr=fail audit silent deny=10 unlock_time=900 even_deny_root serialize

account required pam_tally2.so serialize

 

其中:

deny从参数AUTH_deny获取

unlock_time从参数AUTH_unlock_time获取

 

密码HASH算法

编辑/etc/login.defs文件,设置:

ENCRYPT_METHOD  sha512

PAM设置

口令策略

[注意事项]加固该项后,用户输入口令失败一定次数(由AUTH_deny指定)后,会将该用户锁定一段时间(由AUTH_unlock_time指定),一段时间过后将自动解锁(这种锁定不能通过passwd -u或者usermod -U来解锁,必须通过 pam_tally2命令将用户的失败登录次数清零才可解锁)

1) 检查/etc/pam.d/system-auth和/etc/pam.d/password-auth文件内容,是否包含以下参数:

password    requisite     pam_cracklib.so try_first_pass retry=3 minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 maxsequence=5 difok=5 minclass=4 enforce_for_root reject_username

password    required      pam_pwhistory.so use_authtok remember=5 enforce_for_root

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok

 

2)检查/etc/pam.d/system-auth和/etc/pam.d/password-auth文件内容,是否包含以下参数:

auth        required      pam_faillock.so preauth audit deny=10 even_deny_root unlock_time=900

auth        sufficient    pam_unix.so nullok try_first_pass

auth        [default=die] pam_faillock.so authfail audit deny=10 even_deny_root unlock_time=900

auth        sufficient    pam_faillock.so authsucc audit deny=10 even_deny_root unlock_time=900

 

默认密码规则。

minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1

minlen=N:N为大于0的整数。表示密码中最少包含N个字符。

lcredit=N:如果N为大于0的整数,表示密码中最多包含N个小写字母。如果N为小于或等于0的整数,表示最少包含“-N”个小写字母。

ucredit=N:如果N为大于0的整数,表示密码中最多包含N个大写字母。如果N为小于或等于0的整数,表示最少包含“-N”个大写字母。

dcredit=N:如果N为大于0的整数,表示密码中最多包含N个数字。如果N为小于或等于0的整数,表示最少包含“-N”个数字。

ocredit=N:如果N为大于0的整数,表示密码中最多包含N个特殊字符。如果N为小于或等于0的整数,表示最少包含“-N”个特殊字符。

 

限制root登录系统控制台

[注意事项]The file /etc/securetty contains a list of valid terminals that may be logged in directly as root.

执行:

# echo "" > /etc/securetty

for sectty in `echo "$SECURETTY" | awk -F,`;do

echo $sectty >> /etc/securetty

done

SECURETTY从配置参数中获取

 

限制普通用户su到root

[注意事项]加固之后只有SU_GROUP组内的用户可以su到root

加固前先检查SU_GROUP组内是否存在非root用户,

如果SU_GROUP组内没有非root用户且SU_USERS内也没有非root用户,则该项不加固,直接返回加固失败,并提示用户设置SU_USERS参数

 

1.编辑/etc/pam.d/su文件,添加下面一行内容:

auth required pam_wheel.so use_uid root_only group=SU_GROUP

2.将SU_USERS里的用户添加到SU_GROUP组内

for suusers in `echo "$SU_USERS" | awk -F,`;do

usermod -a -G $SU_GROUP $suusers

done

 

用户账号与环境

口令有效期

[注意事项]口令失效之后,用户依然可以登录系统,只是在登录系统时需要修改口令才能登录

加固时,必须设置MAX_APPLICATION_USERS或MAX_MAINTENANCE_USERS参数,该项才会加固

 

1.编辑/etc/login.defs文件,修改PASS_MAX_DAYS的值为90(或更小,但要大于等于0)

PASS_MAX_DAYS 90

(此处90为PASS_MAX_DAYS_newuser参数)

2.修改系统内业务用户的最大修改口令期

# chage -d `date +%G-%m-%d` --maxdays 90  <application_user>

(此处90为PASS_MAX_DAYS_appuser参数,application_user为MAX_APPLICATION_USERS参数中指定的每个用户)

3.修改系统内维护用户的最大修改口令期限

# chage -d `date +%G-%m-%d` --maxdays 90  <maintenance_user>

(此处90为PASS_MAX_DAYS_mtcuser参数,maintenance_user为MAX_MAINTENANCE_USERS参数中指定的每个用户)

4.设置root用户口令有效期

# chage -d `date +%G-%m-%d` --maxdays 90  root

(此处90为PASS_MAX_DAYS_root参数)

 

口令修改最小时间间隔

[注意事项]修改口令成功后必须经过一段的时间才能再次修改

1.编辑/etc/login.defs文件,修改PASS_MIN_DAYS的值为7(或更大,但要小于PASS_MAX_DAYS)

PASS_MIN_DAYS 7

(此处7为PASS_MIN_DAYS_newuser参数)

2.修改系统内业务用户修改口令的最小时间间隔

# chage --mindays 7 <application_user>

(此处7为PASS_MIN_DAYS_appuser参数,application_user为MIN_APPLICATION_USERS参数中指定的每个用户)

3.修改系统内维护用户修改口令的最小时间间隔

# chage --mindays 7 <maintenance_user>

(此处7为PASS_MIN_DAYS_mtcuser参数,maintenance_user为MIN_MAINTENANCE_USERS参数中指定的每个用户)

4.设置root用户修改口令的最小时间间隔为7

# chage --mindays 7  root

(此处7为PASS_MIN_DAYS_root参数)

 

口令过期前提醒

1.编辑/etc/login.defs文件,修改PASS_WARN_AGE的值为7(或更大但要小于PASS_MAX_DAYS的值)

PASS_WARN_AGE 7

(此处7为PASS_WARN_AGE_newuser参数)

2.修改系统内业务用户修改口令的最小时间间隔

# chage --warndays 7 <application_user>

(此处7为PASS_WARN_AGE_appuser参数,application_user为WARN_APPLICATION_USERS参数中指定的每个用户)

3.修改系统内维护用户修改口令的最小时间间隔

# chage --warndays 7 <maintenance_user>

(此处7为PASS_WARN_AGE_mtcuser参数,maintenance_user为WARN_MAINTENANCE_USERS参数中指定的每个用户)

4.设置root用户提醒口令过期的时间为7

# chage --warndays 7  root

(此处7为PASS_WARN_AGE_root参数)

 

禁用系统功能账户

[注意事项]加固该项后uid<500系统账户将无法登录系统(root,oracle,grid除外)

1.排除IGNORE_ACCOUNTS参数中的用户

cp /etc/passwd /etc/passwd.secbak

for TMPUSR in `echo $IGNORE_ACCOUNTS | sed 's/,/ /g'`;do

sed -i "/^$TMPUSR:.*$/d" /etc/passwd.secbak

done

2.确保系统账户不能被访问,执行:

for user in `awk -F: '($3 < 500) {print $1 }' /etc/passwd.secbak`; do

if [ $user != "root" -a $user != "oracle" -a $user != "grid" ];then

/usr/sbin/usermod -L $user

if [ $user != "sync" -a $user != "shutdown" -a $user != "halt" ];then

/usr/sbin/usermod -s /sbin/nologin $user

fi

fi

done

 

rm -f /etc/passwd.secbak

 

root账户默认组

执行:

# usermod -g 0 root

 

 

锁定长期不活动的用户(对新建用户生效)

[注意事项]加固后,用户不能无限制的修改口令;如果设置了口令有效期,同时加固了该项,则用户口令失效天数达到INACTIVE指定的参数,则该用户将不可用;该加固只对加固后新建的用户生效

执行:

useradd -D -f 35

(35从参数INACTIVE_DAYS处获取)

 

设置单次登录最大认证次数(login方式)

编辑/etc/login.defs文件,添加或修改:

LOGIN_RETRIES 4

 

检查认证超时时间(login方式)

编辑/etc/login.defs文件,添加或修改:

LOGIN_TIMEOUT 60

 

检查是否关闭未知用户登录失败记录(login方式)

编辑/etc/login.defs文件,添加或修改:

LOG_UNKFAIL_ENAB no

 

检查会话超时时间

[注意事项]请输入会话超时时间(单位:秒)。在设定的时间之内没有响应则超时。置空则不做任何设置。

设定会话超时时间,增加(或修改)/etc/profile和/etc/bash.bashrc文件中(对Bash/mksh有效)

TMOUT=1800

设定会话超时时间,增加(或修改)/etc/csh.cshrc文件中(仅对Csh有效,文件不存在则跳过)

set autologout=30

 

其中:

Bash/mksh中的TMOUT=1800表示用户1800秒无操作则断开连接。测试验证时需要断开当前连接,重新登录超时设置有效。

Csh中的autologout=30表示用户1800秒(即30分钟)无操作则断开连接。测试验证时需要断开当前连接,重新登录超时设置有效。

 

禁用nobody用户

执行:

usermod -L nobody

usermod -s /bin/false nobody

 

sudo认证超时时间

[注意事项]设置sudo认证超时时间,避免用户长时间不输入密码

编辑/etc/sudoers文件,设置:

Defaults passwd_timeout = 1

 

参数值从SUDO_PASSWD_TIMEOUT获取

 

显示上次登录信息(login方式)

编辑/etc/login.defs文件,添加或修改:

LASTLOG_ENAB yes

 

记录失败登录信息(login方式)

编辑/etc/login.defs文件,添加或修改:

FAILLOG_ENAB yes

 

禁止通过键盘(CTRL+ALT+DEL)重启系统

执行:

systemctl mask ctrl-alt-del.target

 

关闭上下键查询操作命令

[注意事项]输入history或使用上下键可以查询到历史命令,存在安全风险

1、设定会话超时时间,编辑/etc/profile文件,添加或修改:

export HISTSIZE=0

2、执行如下命令使修改后的文件生效。

source /etc/profile

 

THE END