2018-12-28 Linux服务器安全加固

对未经过安全认证的RPM包进行安全检查

rpm -qp xxx.rpm --scripts 查看rpm包中的脚本信息

设定密码策略

修改 /etc/login.defs 配置文件
PASS_MAX_DAYS 90 密码最长有效期
PASS_MIN_DAYS 10 密码修改之间最小的天数
PASS_MIN_LEN 8 密码长度
PASS_WARN_AGE 7 口令失效前多少天开始通知用户修改密码

设置密码策略

脚本实现设定密码策略

#! /bin/bash
# Function: 实现对用户密码策略的设定,如密码最长有效期等
read -p  "设置密码最多可多少天不修改:" A
read -p  "设置密码修改之间最小的天数:" B
read -p  "设置密码最短的长度:" C
read -p  "设置密码失效前多少天通知用户:" D
sed -i '/^PASS_MAX_DAYS/c\PASS_MAX_DAYS   '$A'' /etc/login.defs
sed -i '/^PASS_MIN_DAYS/c\PASS_MIN_DAYS   '$B'' /etc/login.defs
sed -i '/^PASS_MIN_LEN/c\PASS_MIN_LEN     '$C'' /etc/login.defs
sed -i '/^PASS_WARN_AGE/c\PASS_WARN_AGE   '$D'' /etc/login.defs
echo "已设置好密码策略......"
脚本实现设定密码策略

对用户密码强度的设定

打开 /etc/pam.d/sysetm-auth 文件 ,修改如下。我们设置新密码不能和旧密码相同,同时新密码至少8位,还要同时包含大字母、小写字母和数字
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1

对用户密码强度的设定

  • difok= :此选项用来定义新密码中必须要有几个字符和旧密码不同
  • minlen=:此选项用来设置新密码的最小长度
  • ucredit= :此选项用来设定新密码中可以包含的大写字母的最大数目。-1 至少一个
  • lcredit=:此选项用来设定新密码中可以包含的小写字母的最大数目
  • dcredit=:此选项用来设定新密码中可以包含的数字的最大数目
    注意:这个密码强度的设定只对普通用户有限制作用,root用户无论修改自己的密码还是修改普通用户的时候,不符合强度设置依然可以设置成功
image.png

脚本实现对用户密码强度的设定

#! /bin/bash
# Function: 对用户密码强度的设定,新密码不能和旧密码相同,同时新密码至少8位,还要同时包含大字母、小写字母和数字
sed -i '/pam_pwquality.so/c\password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=  difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1' /etc/pam.d/system-auth

对用户的登录次数进行限制

有一些攻击性的软件是专门采用暴力破解密码的形式反复进行登录尝试,对于这种情况,我们可以调整用户登录次数限制,使其密码输入3次后自动锁定,并且设置锁定时间,在锁定时间内即使密码输入正确也无法登录
打开 /etc/pam.d/sshd 文件,在 #%PAM-1.0 的下面,加入下面的内容,表示当密码输入错误达到3次,就锁定用户150秒,如果root用户输入密码错误达到3次,锁定300秒。锁定的意思是即使密码正确了也登录不了
auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300

对用户的登录次数进行限制

当输入3次密码错误时

image.png

pam_tally2 查看被锁定的用户
pam_tally2 --reset -u username 将被锁定的用户解锁

image.png

脚本设置对用户的登录次数做限制

#! /bin/bash
# Function: 对用户登录输入错误密码次数做限制
n=`cat /etc/pam.d/sshd | grep "auth required pam_tally2.so "|wc -l`
if [ $n -eq 0 ];then
sed -i '/%PAM-1.0/a\auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300' /etc/pam.d/sshd
fi

禁止ROOT用户远程登录

禁止ROOT用户远程登录 。打开 /etc/ssh/sshd_config

禁止ROOT用户远程登录

脚本设置禁止ROOT用户远程登录

#! /bin/bash
# Function: 禁止ROOT用户远程登录
sed -i '/PermitRootLogin/c\PermitRootLogin no'  /etc/ssh/sshd_config

设置历史命令保存条数和账户超时时间

设置账户保存历史命令条数,超时时间 。打开 /etc/profile ,修改如下

image.png

设置只有指定用户组才能使用su命令切换到root用户

在linux中,有一个默认的管理组 wheel。在实际生产环境中,即使我们有系统管理员root的权限,也不推荐用root用户登录。一般情况下用普通用户登录就可以了,在需要root权限执行一些操作时,再su登录成为root用户。但是,任何人只要知道了root的密码,就都可以通过su命令来登录为root用户,这无疑为系统带来了安全隐患。所以,将普通用户加入到wheel组,被加入的这个普通用户就成了管理员组内的用户。然后设置只有wheel组内的成员可以使用su命令切换到root用户。
比如,我们将普通用户xie加入wheel组。 usermod -G wheel xie
然后,我们修改配置文件 /etc/pam.d/su ,将这行的注释给去掉

image.png

然后去 /etc/login.defs 末尾加入 SU_WHEEL_ONLY yes 即可。

image.png

当 tom 用户使用su命令切换到root用户时,会提示拒绝权限

image.png

使用脚本设置配置文件

#! /bin/bash
# Function: 修改配置文件,使得只有wheel组的用户可以使用 su 权限
sed -i '/pam_wheel.so use_uid/c\auth            required        pam_wheel.so use_uid ' /etc/pam.d/su
n=`cat /etc/login.defs | grep SU_WHEEL_ONLY | wc -l`
if [ $n -eq 0 ];then
echo SU_WHEEL_ONLY yes >> /etc/login.defs
fi

对Linux账户进行管理

  • 使用命令 userdel -r 用户名 删除不必要的账号
  • 使用命令 passwd -l 用户名 锁定不必要的账号
  • 使用命令 awk -F: '($7=="/bin/bash"){print $1}' /etc/passwd 查看具有登录权限的用户
  • 使用命令 awk -F: '($3==0)' /etc/passwd 查看UID为0的账号,UID为0的用户会自- 动切换到root用户,所以危害很大
  • 使用命令 awk -F: '($2=="")' /etc/shadow 查看空口令账号,如果存在空口令用户的话必须设置密码
    使用脚本对账户进行管理
#! /bin/bash
# Function: 对系统中的用户做检查,加固系统
echo "系统中有登录权限的用户有:"
awk -F: '($7=="/bin/bash"){print $1}' /etc/passwd
echo "********************************************"
echo "系统中UID=0的用户有:"
awk -F: '($3=="0"){print $1}' /etc/passwd
echo "********************************************"
N=`awk -F: '($2==""){print $1}' /etc/shadow|wc -l`
echo "系统中空密码用户有:$N"
if [ $N -eq 0 ];then
 echo "恭喜你,系统中无空密码用户!!"
 echo "********************************************"
else
 i=1
 while [ $N -gt 0 ]
 do
    None=`awk -F: '($2==""){print $1}' /etc/shadow|awk 'NR=='$i'{print}'`
    echo "------------------------"
    echo $None
    echo "必须为空用户设置密码!!"
    passwd $None
    let N--
 done
 M=`awk -F: '($2==""){print $1}' /etc/shadow|wc -l`
 if [ $M -eq 0 ];then
  echo "恭喜,系统中已经没有空密码用户了!"
 else
echo "系统中还存在空密码用户:$M"
 fi
fi

对重要的文件进行锁定,即使ROOT用户也无法删除

chattr 改变文件或目录的扩展属性
lsattr 查看文件目录的扩展属性
chattr +i /etc/passwd /etc/shadow //增加属性
chattr -i /etc/passwd /etc/shadow //移除属性
lsattr /etc/passwd /etc/shadow

image.png

使用脚本对重要文件进行锁定

#! /bin/bash
# Function: 锁定创建用户和组的文件,使之无法对用户和组进行操作!
read -p "警告:此脚本运行后将无法添加删除用户和组!!确定输入Y,取消输入N;Y/N:" i
case $i in
      [Y,y])
            chattr +i /etc/passwd
            chattr +i /etc/shadow
            chattr +i /etc/group
            chattr +i /etc/gshadow
            echo "锁定成功!"
;;
      [N,n])
            chattr -i /etc/passwd
            chattr -i /etc/shadow
            chattr -i /etc/group
            chattr -i /etc/gshadow
            echo "取消锁定成功!!"
;;
       *)
            echo "请输入Y/y or  N/n"
esac

一个脚本对上面所有的合并了

#! /bin/bash
# Function:对账户的密码的一些加固
read -p  "设置密码最多可多少天不修改:" A
read -p  "设置密码修改之间最小的天数:" B
read -p  "设置密码最短的长度:" C
read -p  "设置密码失效前多少天通知用户:" D
sed -i '/^PASS_MAX_DAYS/c\PASS_MAX_DAYS   '$A'' /etc/login.defs
sed -i '/^PASS_MIN_DAYS/c\PASS_MIN_DAYS   '$B'' /etc/login.defs
sed -i '/^PASS_MIN_LEN/c\PASS_MIN_LEN     '$C'' /etc/login.defs
sed -i '/^PASS_WARN_AGE/c\PASS_WARN_AGE    '$D'' /etc/login.defs
 
echo "已对密码进行加固,新密码不得和旧密码相同,且新密码必须同时包含数字、小写字母,大写字母!!"
sed -i '/pam_pwquality.so/c\password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=  difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1' /etc/pam.d/system-auth
 
echo "已对密码进行加固,如果输入错误密码超过3次,则锁定账户!!"
n=`cat /etc/pam.d/sshd | grep "auth required pam_tally2.so "|wc -l`
if [ $n -eq 0 ];then
sed -i '/%PAM-1.0/a\auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300' /etc/pam.d/sshd
fi
 
echo  "已设置禁止root用户远程登录!!"
sed -i '/PermitRootLogin/c\PermitRootLogin no'  /etc/ssh/sshd_config
 
read -p "设置历史命令保存条数:" E
read -p "设置账户自动注销时间:" F
sed -i '/^HISTSIZE/c\HISTSIZE='$E'' /etc/profile
sed -i '/^HISTSIZE/a\TMOUT='$F'' /etc/profile
 
echo "已设置只允许wheel组的用户可以使用su命令切换到root用户!"
sed -i '/pam_wheel.so use_uid/c\auth            required        pam_wheel.so use_uid ' /etc/pam.d/su
n=`cat /etc/login.defs | grep SU_WHEEL_ONLY | wc -l`
if [ $n -eq 0 ];then
echo SU_WHEEL_ONLY yes >> /etc/login.defs
fi
 
echo "即将对系统中的账户进行检查...."
echo "系统中有登录权限的用户有:"
awk -F: '($7=="/bin/bash"){print $1}' /etc/passwd
echo "********************************************"
echo "系统中UID=0的用户有:"
awk -F: '($3=="0"){print $1}' /etc/passwd
echo "********************************************"
N=`awk -F: '($2==""){print $1}' /etc/shadow|wc -l`
echo "系统中空密码用户有:$N"
if [ $N -eq 0 ];then
 echo "恭喜你,系统中无空密码用户!!"
 echo "********************************************"
else
 i=1
 while [ $N -gt 0 ]
 do
    None=`awk -F: '($2==""){print $1}' /etc/shadow|awk 'NR=='$i'{print}'`
    echo "------------------------"
    echo $None
    echo "必须为空用户设置密码!!"
    passwd $None
    let N--
 done
 M=`awk -F: '($2==""){print $1}' /etc/shadow|wc -l`
 if [ $M -eq 0 ];then
  echo "恭喜,系统中已经没有空密码用户了!"
 else
echo "系统中还存在空密码用户:$M"
 fi
fi
 
echo "即将对系统中重要文件进行锁定,锁定后将无法添加删除用户和组"
read -p "警告:此脚本运行后将无法添加删除用户和组!!确定输入Y,取消输入N;Y/N:" i
case $i in
      [Y,y])
            chattr +i /etc/passwd
            chattr +i /etc/shadow
            chattr +i /etc/group
            chattr +i /etc/gshadow
            echo "锁定成功!"
;;
      [N,n])
            chattr -i /etc/passwd
            chattr -i /etc/shadow
            chattr -i /etc/group
            chattr -i /etc/gshadow
            echo "取消锁定成功!!"
;;
       *)
            echo "请输入Y/y or  N/n"
esac
image.png

建立日志服务器

日志服务器的好处在于,每个工作服务器将自己的日志信息发送给日志服务器进行集中管理,即使有人入侵了服务器并将自己的登录信息悄悄删除,但由于日志信息实时与日志服务器同步,保证了日志的完整性。以备工作人员根据日志服务器信息对服务器安全进行评测。


建立日志服务器
  • 客户端的配置:
    打开 /etc/rsyslog.conf 配置文件
    你想把哪种类型的日志文件发送给服务端,你就把他原来的对应的目录改成: @192.168.10.20
客户端配置

如果你想吧所有的日志文件都发送给服务器的话,你可以在文件最后加上: . @@192.168.10.20:514

image.png

然后重启rsyslog服务: systemctl restart rsyslog

  • 服务器端的配置:
    打开 /etc/rsyslog.conf 配置文件,将这里的注释给去掉
服务器端配置

然后重启rsyslog服务:systemctl restart rsyslog
开启防火墙: firewall-cmd --add-port=514/tcp
这样客户端的相应的日志文件就会保存在服务器端的相应的文件中。

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容