现象:据项目需要,要对系统进行安全加固,使用了安全加固脚本后,再修改root密码会无法进入系统的现象

初始加固脚本内容如下

#!/bin/bash
sed '4c greeter-show-manual-login=true' /usr/share/lightdm/lightdm.conf.d/60-kylin.conf
sed -i 's/^mesg.*$/tty -s \&\& mesg n/g' /root/.profile
echo "pulseaudio --start --log-target=syslog"  >> /root/.profile
#cd /home/kylin/桌面
pwd=`pwd`
mkdir /opt/anquan/
cd "$pwd"
cp cracklib.tar.gz /opt/anquan/
cp netfilter-persistent.tar.gz /opt/anquan/
cd /opt/anquan/
tar -xf cracklib.tar.gz
dpkg -i libcrack2_2.9.2-1build2kord0k3_amd64.deb
dpkg -i wamerican_7.1-1kord_all.deb
dpkg -i cracklib-runtime_2.9.2-1build2kord0k3_amd64.deb
dpkg -i libpam-cracklib_1.1.8-3.2kord3k44_amd64.deb
sed -i "s/pam_cracklib.so/pam_cracklib.so minlen=8 minclass=3/g" /etc/pam.d/common-password
sed -i "1,/99999/{s/99999/15/}" /etc/login.defs
echo "请修改root密码"
#read -p "请输入密码" one
#read -p "请再次输入密码" two
#echo $one |passwd --stdin root >&
#if [ $? -eq 0 ];then
#   echo "root的密码已经修改为$one"
#   else
#       echo "root的密码未修改成功"
#fi
mv /etc/ld.so.conf.d/JinCEarth.conf /opt/
/sbin/ldconfig
sed -i '15i auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/common-auth
chmod 600 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /var/log/syslog
mv /etc/init.d/install_cnts.properties /opt
mv /etc/init.d/ZzTimerS /opt
tar -xf netfilter-persistent.tar.gz
dpkg -i netfilter-persistent_1.0.4kord_all.deb
dpkg -i iptables-persistent_1.0.4kord_all.deb
mv /opt/install_cnts.properties /etc/init.d/
mv /opt/ZzTimerS /etc/init.d/
iptables -A INPUT -p tcp --dport 135 -j DROP
iptables -A INPUT -p tcp --dport 139 -j DROP
iptables -A INPUT -p tcp --dport 445 -j DROP
iptables -A INPUT -p tcp --dport 5800 -j DROP
iptables -A INPUT -p tcp --dport 539 -j DROP
iptables -A INPUT -p tcp --dport 593 -j DROP
iptables -A INPUT -p udp --dport 137 -j DROP
iptables -A INPUT -p udp --dport 138 -j DROP
iptables -A INPUT -p udp --dport 69 -j DROP
iptables -A INPUT -p udp --dport 1434 -j DROP
iptables -A INPUT -p udp --dport 539 -j DROP
/usr/sbin/netfilter-persistent save
iptables -L -n
echo "#!/bin/bash" >/etc/network/if-pre-up.d/iptables.sh
echo "/sbin/iptables-restore < /etc/iptables/rules.v4" >>/etc/network/if-pre-up.d/iptables.sh
sed -i '13i bash /etc/network/if-pre-up.d/iptables.sh' /etc/rc.local

以上脚本跑完之后,然后修改一下root密码,就会偶发无法登入系统的现象,不管你怎么输密码都会提示密码错误,该现象偶发,一旦发生重启系统也不可行

为什么我多跑了几次脚本呢?

因为28所软件的环境变量配的和这个安全加固的配置冲突了,导致开机后指纹验证等的几个画面出不来,所以就需要再跑一下脚本重新配置一下)

经过多次复现、回忆操作细节以及挂盘进小系统排查,最后查出来是重复配置产生的影响。脚本里边使用sed添加策略的时候没考虑多次执行所可能带来的改变,所以多次运行脚本后,有的配置文件会添加重复的配置,其中有两个配置文件(/etc/pam.d/common-auth和/etc/pam.d/common-password)由重复的策略配置改为仅配置一次,便可重新登入系统,为什么重复配置会导致无法登入系统暂不清楚,但改回确实可以解决

如果有的生产环境已经出现了root账户密码输对了始终无法进入,那么可以修改一下配置文件,把策略改回去

下面是我针对以上问题对脚本做的修改,以下脚本中一些配置前面加了判断

#!/bin/bash
# 脚本说明:该脚本已在Kylin-4.0.2-desktop-sp2-XYD.J1-18052209-x86_64版本上验证过可用,其他版本未知# 定义一个函数判断文本是否已经在文件中存在
function is_in_file(){# 接收第一个参数“内容”,接收第二个参数“文件路径”num=`cat $2 | grep "$1" | wc -l`if [ $num == 1 ]thenreturn 0elsereturn 1fi
}# 修改root可登录系统
sed -i '4c greeter-show-manual-login=true' /usr/share/lightdm/lightdm.conf.d/60-kylin.conf# 解决"弹窗提示/root/.profile读取报错问题"
sed -i 's/^mesg.*$/tty -s \&\& mesg n/g' /root/.profile
is_in_file "pulseaudio --start --log-target=syslog" /root/.profile
if [ $? == 1 ]
thenecho "pulseaudio --start --log-target=syslog"  >> /root/.profile
fi# 修改特殊文件权限,提高安全性
chmod 600 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /var/log/syslog# 解压tar包到临时目录并安装deb
mkdir /opt/anquan/
cp cracklib.tar.gz /opt/anquan/
cp netfilter-persistent.tar.gz /opt/anquan/
cd /opt/anquan/
# 安全策略相关
tar -xf cracklib.tar.gz
dpkg -i libcrack2_2.9.2-1build2kord0k3_amd64.deb
dpkg -i wamerican_7.1-1kord_all.deb
dpkg -i cracklib-runtime_2.9.2-1build2kord0k3_amd64.deb
dpkg -i libpam-cracklib_1.1.8-3.2kord3k44_amd64.deb
# iptables相关
tar -xf netfilter-persistent.tar.gz
mv /etc/init.d/install_cnts.properties /opt/    # 避免安装netfilter-persistent时报错
mv /etc/init.d/ZzTimerS /opt/
dpkg -i netfilter-persistent_1.0.4kord_all.deb
dpkg -i iptables-persistent_1.0.4kord_all.deb
mv /opt/install_cnts.properties /etc/init.d/    # 为避免安装出错移走的文件移回原处
mv /opt/ZzTimerS /etc/init.d/# 移除28s软件部分冲突配置,避免开机"指纹登录等画面"不显示
mv /etc/ld.so.conf.d/JinCEarth.conf /opt/
/sbin/ldconfig# 设置密码复杂度含有"大写字母、小写字母、数字、特殊字符"其中的三种
# 设置密码使用期限不超过15天
# 设置无效次数过多锁定、锁定时间30分
is_in_file "pam_cracklib.so minlen=8 minclass=3" /etc/pam.d/common-password
if [ $? == 1 ]
thensed -i "s/pam_cracklib.so/pam_cracklib.so minlen=8 minclass=3/g" /etc/pam.d/common-password
fi
sed -i "1,/99999/{s/99999/15/}" /etc/login.defs
is_in_file 'auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/common-auth
if [ $? == 1 ]
thensed -i '15i auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/common-auth
fi# 设置iptables规则
rules=`iptables -L -n | grep DROP | grep 135 | wc -l`   # 如果查询有135端口DROP的策略,则视作以下所有策略均已做过,不再进行添加
if [ $rules == 0 ]
theniptables -A INPUT -p tcp --dport 135 -j DROPiptables -A INPUT -p tcp --dport 139 -j DROPiptables -A INPUT -p tcp --dport 445 -j DROPiptables -A INPUT -p tcp --dport 5800 -j DROPiptables -A INPUT -p tcp --dport 539 -j DROPiptables -A INPUT -p tcp --dport 593 -j DROPiptables -A INPUT -p udp --dport 137 -j DROPiptables -A INPUT -p udp --dport 138 -j DROPiptables -A INPUT -p udp --dport 69 -j DROPiptables -A INPUT -p udp --dport 1434 -j DROPiptables -A INPUT -p udp --dport 539 -j DROP
fi
/usr/sbin/netfilter-persistent save
iptables -L -n# 创建iptables脚本,并配置rc.local使该脚本开机运行
echo "#!/bin/bash" > /etc/network/if-pre-up.d/iptables.sh
echo "/sbin/iptables-restore < /etc/iptables/rules.v4" >> /etc/network/if-pre-up.d/iptables.sh
is_in_file 'bash /etc/network/if-pre-up.d/iptables.sh' /etc/rc.local
if [ $? == 1 ]
thensed -i '13i bash /etc/network/if-pre-up.d/iptables.sh' /etc/rc.local
fi# 修改root密码
#read -p "请输入root密码" one
#read -p "请再次确认密码" two
#[ $one == $two ] && echo $one | passwd --stdin root >& /dev/null
#if [ $? -eq 0 ]
#then
#       echo "root的密码已经修改为$one"
#       else
#               echo "root的密码未修改成功"
#fi

相应地,也对服务器系统的安全加固脚本做了修改,如下:

#!/bin/bash
# 脚本说明:该脚本已在Kylin-4.0.2-server-sp2-19121012.J1-x86_64、Kylin-4.0.2-server-sp4-20092117.J1-x86_64两个版本上验证过可用,其他版本未知# 定义一个函数判断文本是否已经在文件中存在
function is_in_file(){# 接收第一个参数“内容”,接收第二个参数“文件路径”num=`cat $2 | grep "$1" | wc -l`if [ $num == 1 ]thenreturn 0elsereturn 1fi
}# 修改root可登录系统
sed -i '4c greeter-show-manual-login=true' /usr/share/lightdm/lightdm.conf.d/60-kylin.conf# 解决"弹窗提示/root/.profile读取报错问题"
sed -i 's/^mesg.*$/tty -s \&\& mesg n/g' /root/.profile
is_in_file "pulseaudio --start --log-target=syslog" /root/.profile
if [ $? == 1 ]
thenecho "pulseaudio --start --log-target=syslog"  >> /root/.profile
fi# 修改特殊文件权限,提高安全性
chmod 600 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /var/log/syslog# 解压tar包到临时目录并安装deb
mkdir /opt/anquan/
cp cracklib.tar.gz /opt/anquan/
cp netfilter-persistent.tar.gz /opt/anquan/
cd /opt/anquan/
# 安全策略相关
tar -xf cracklib.tar.gz
dpkg -i libcrack2_2.9.2-1build2kord0k3_amd64.deb
dpkg -i wamerican_7.1-1kord_all.deb
dpkg -i cracklib-runtime_2.9.2-1build2kord0k3_amd64.deb
dpkg -i libpam-cracklib_1.1.8-3.2kord3k44_amd64.deb
# iptables相关
tar -xf netfilter-persistent.tar.gz
dpkg -i netfilter-persistent_1.0.4kord_all.deb
dpkg -i iptables-persistent_1.0.4kord_all.deb# 设置密码复杂度含有"大写字母、小写字母、数字、特殊字符"其中的三种
# 设置密码使用期限不超过15天
# 设置无效次数过多锁定、锁定时间30分
sed -i "s/retry=3 minlen=8 difok=3/minlen=8 minclass=3/g" /etc/pam.d/common-password
sed -i "1,/99999/{s/99999/15/}" /etc/login.defs
is_in_file 'auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/common-auth
if [ $? == 1 ]
thensed -i '15i auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/common-auth
fi# 设置iptables规则
rules=`iptables -L -n | grep DROP | grep 135 | wc -l`   # 如果查询有135端口DROP的策略,则视作以下所有策略均已做过,不再进行添加
if [ $rules == 0 ]
theniptables -Fiptables -A INPUT -p tcp --dport 135 -j DROPiptables -A INPUT -p tcp --dport 139 -j DROPiptables -A INPUT -p tcp --dport 445 -j DROPiptables -A INPUT -p tcp --dport 5800 -j DROPiptables -A INPUT -p tcp --dport 539 -j DROPiptables -A INPUT -p tcp --dport 593 -j DROPiptables -A INPUT -p udp --dport 137 -j DROPiptables -A INPUT -p udp --dport 138 -j DROPiptables -A INPUT -p udp --dport 69 -j DROPiptables -A INPUT -p udp --dport 1434 -j DROPiptables -A INPUT -p udp --dport 539 -j DROP
fi
/usr/sbin/netfilter-persistent save
iptables -L -n# 创建iptables脚本,并配置rc.local使该脚本开机运行
echo "#!/bin/bash" > /etc/network/if-pre-up.d/iptables.sh
echo "/sbin/iptables-restore < /etc/iptables/rules.v4" >> /etc/network/if-pre-up.d/iptables.sh
is_in_file 'bash /etc/network/if-pre-up.d/iptables.sh' /etc/rc.local
if [ $? == 1 ]
thensed -i '13i bash /etc/network/if-pre-up.d/iptables.sh' /etc/rc.local
fi# 修改root密码
#read -p "请输入root密码" one
#read -p "请再次确认密码" two
#[ $one == $two ] && echo $one | passwd --stdin root >& /dev/null
#if [ $? -eq 0 ]
#then
#       echo "root的密码已经修改为$one"
#       else
#               echo "root的密码未修改成功"
#fi

编写shell脚本时,涉及到修改配置文件的操作,一定要注意对配置文件的影响,脚本通常会运行多次,那么sed、awk等的操作很可能会在配置文件中留下多次痕迹,所以需要做一下特别的判断和处理

安全加固脚本+修改root密码->出现root始终无法登录问题相关推荐

  1. NVIDIA Jetson TK1学习与开发(十一):TK1新装ubuntu如何修改用户密码和root密码

    NVIDIA Jetson TK1学习与开发(十一):TK1新装ubuntu如何修改用户密码和root密码 1.修改用户密码 进入系统打开一个新终端 $passwd ubuntu $输入默认密码ubu ...

  2. MySQL初始化root密码以及root密码忘记解决方法

    MySQL初始化root密码以及root密码忘记解决方法 参考文章: (1)MySQL初始化root密码以及root密码忘记解决方法 (2)https://www.cnblogs.com/liuyu2 ...

  3. SQL Server以windows验证登录之后,修改sa密码,不能用sa登录的解决方案

    2019独角兽企业重金招聘Python工程师标准>>> SQL Server以windows验证登录之后,修改sa密码,不能用sa登录的解决方案 问题:SQL Server Mana ...

  4. 华为服务器修改root密码,服务器root密码修改

    服务器root密码修改 内容精选 换一换 由于root用户拥有最高权限,直接使用root用户登录服务器可能会存在安全风险.建议您使用普通用户登录服务器后切换为root用户,再执行后续安装操作,并建议您 ...

  5. 如何修改服务器root密码,服务器root密码修改

    服务器root密码修改 内容精选 换一换 本节操作介绍Linux云服务器切换密钥登录为密码登录的操作步骤.使用密钥登录Linux云服务器,设置root密码.sudo passwd root若密钥文件丢 ...

  6. 【Linux】通过 Shell 脚本修改用户密码

    1. Linux 中修改用户密码   Linux 中要修改一个用户的密码通常是使用 passwd 命令来完成,命令格式如下. #一般使用格式 passwd [username] [注]:若其后不加任何 ...

  7. mysql忘记root密码与root帐号被删除处理方法

    windows服务器如果使用西部数码的管理助手,重置方法请参考:管理助手重置mysql的root密码 -西部数码帮助中心 linux服务器如果使用WDCP系统,wdcp修改mysql密码.wdcp后台 ...

  8. MYSQL5.7 忘记ROOT密码/初始化ROOT密码

    编辑my.cnf允许空密码登录 1 [root@7Core ~]# vi /etc/my.cnf 2 #在[mysqld]下加入一行 3 skip-grant-tables=1 重新启动Mysql服务 ...

  9. iis mysql密码_mysql忘记root密码与root帐号被删除处理方法

    说明:请根据自己主机系统及问题选择对应步骤. 1.查找修改配置文件 修改my.ini(windows系统)或my.cnf(linux系统)文件, windows系统:my.ini在mysql的安装目录 ...

最新文章

  1. python高级网络编程_python高级编程——网络编程(二)
  2. canvas之三:绘制弧和圆
  3. java 枚举抽象方法_Java枚举抽象方法实战
  4. C++ Primer plus 第12章类和动态内存分配复习题参考答案
  5. Asp.Net_Mvc_IgnoreRoute
  6. JavaScript之自定义对象
  7. Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(
  8. 基于.NET的系统开发需要注意的问题总结
  9. django 视图-----视图函数
  10. (34)System Verilog引用包中定义的类(失败)
  11. linux flush 磁盘,linux 磁盘IO栈和优化思路
  12. 网站通用 敏感词列表
  13. link标签的real属性理解
  14. Qt导航栏 QListWidget
  15. 【总结】1298- 如何用油猴提升前端开发效率
  16. NOT EXISTS真的不走索引么?如何优化NOT EXISTS!
  17. 兼职跑网约车能赚钱吗?
  18. Java中相等的判断
  19. 软考前该怎样复习才能一次通过?
  20. 深入浅出 | 图像分类之数据增强全梳理

热门文章

  1. Android控件人生第一站,小红书任意拖拽标签控件
  2. 为什么要发布新闻稿?新闻稿发布的9大优势
  3. 微信群群名:每天写一题经典算法
  4. 苹果手机如何批量删除联系人
  5. esp32-cam拍照上传,app inventor 制作安卓app实时显示
  6. 大话西游辅助,刷日常的方法
  7. 2、计算机网络之应用层笔记(基于中科院郑老师和计算机网络自顶向下方法)
  8. CSS阴影的那些事儿
  9. gdb调试时的问题Missing separate debuginfos use debuginfo-install
  10. html5小米618,小米放大招!迎战618 终于等到了!