目录
1.文件锁定管理
2.设置用户账户有效期
3.查看并清除命令历史记录
4.设置用户超时登出时间
5.用户切换
6.用户提权
7.禁用重启热键Ctrl+Alt+Del
8.设置单用户模式密码
9.调整BIOS引导设置
10.禁止root用户从本地登录:
11.禁止root用户通过sshd登录:
12.禁止普通用户以本地及ssh登录:
13.检查系统中特权用户及是否存在空口令用户
14.弱口令检测
15.sshd服务防止暴力破解
1.文件锁定管理
Linux chattr命令用于改变文件属性。
-R 递归处理,将指定目录下的所有文件及子目录一并处理。
+<属性> 开启文件或目录的该项属性。
-<属性> 关闭文件或目录的该项属性。
=<属性> 指定文件或目录的该项属性。
属性:
a:只能给文件添加内容,但是不能删除。
i:不得任意更改文件或目录。
# chattr +i /etc/passwd //锁定用户文件
# chattr +i /etc/shadow //锁定密码文件
# chattr +a /var/log/messages //设置不能清除日志文件
# lsattr /etc/shadow /etc/passwd //查看锁定状态,权限中有i 表示已锁定
----i--------e- /etc/shadow
----i--------e- /etc/passwd
# useradd zhangsan //在已锁定状态下创建用户将会报错。
useradd: cannot open /etc/passwd
2.设置用户账户有效期
对于即将要新添加的用户设置有效期时间,可在配置文件中修改时间,在创建用户时将会生效
# vim /etc/login.defs //打开用户账户策略配置文件
PASS_MAX_DAYS 30 //将此项参数修改为30天
关于defs配置文件中其他选项的作用
PASS_MAX_DAYS 99999 //密码最大有效期
PASS_MIN_DAYS 0 //两次修改密码的最小间隔时间
PASS_MIN_LEN 5 //密码最小长度,对于root无效
PASS_WARN_AGE 7 //密码过期前多少天开始提示
UID_MIN 500 //创建用户开始的第一个UID
UID_MAX 60000 //最大的用户UID
GID_MIN 500 //创建组的第一个GID
GID_MAX 60000 //最大的组GID
CREATE_HOME yes //是否创建用户的宿主目录
对于已添加的用户设置有效期
# chage -M 30 zhangsan //设置用户张三的有效期为30天,passwd shadow文件必须为解锁状态才可执行此命令
通过以下命令设置用户张三下次登录系统时需要修改密码,
# chage -d 0 zhangsan //设置张三用户下次登录系统时需要修改密码
3.查看并清除命令历史记录
查看系统所执行的命令记录
# history
# history -c //清空所有命令历史记录,也可将此命令添加至用户的.bash_logout,文件中,用户注销后将会自动清除历史记录
# rm -rf ~/.bash_history
history中默认记录1000条记录,可在配置文件中修改记录条数
# vim /etc/profile
HISTSIZE=1000 //默认为1000条,可修改为其他值
4.设置用户超时登出时间
# vim /etc/profile
export TMOUT=600 //加入此行,定义变量,600表示秒数,
经过以上设置后,在用户登录系统后十分钟为操作,将会退出登录
5.用户切换
# su
默认情况下所有用户均可使用su 进行切换,为了安全,可以设置个别用户才能使用su
设置用户张三能够使用su命令:
# gpasswd -a zhangsan wheel //将用户zhangsan加入wheel组
# vim /etc/pam.d/su
auth required pam_wheel.so use_uid //去掉此行的开的#,使此行生效
以上配置设置完成后,使用用户zhangsan进行使用su可以进行切换,但使用其他普通用户将无法使用su进行切换,将会提示密码不正确
6.用户提权
# sudo //用户提权
对于普通用户要提升的权限可在配置文件/etc/sudoers中配置
例如,普通用户无法使用ifconfig命令进行修改主机IP地址,
如果有需求普通用户修改主机IP地址,则可为普通用户授权使用ifconfig命令进行修改IP地址
注意:命令路径必须写绝对路径,不可写相对路径
# visudo
第一列为用户账号,第二列的ALL意思是登录来源,如localhost,第三列等号右边小括号中的ALL是代表可以切换的身份,第四列ALL是可执行的命令。
zhangsan ALL=(ALL) /sbin/ifconfig //添加此行
%wheel ALL=(ALL) NOPASSWD: ALL //wheel组在任何终端登录都不需要密码即可执行所有命令
关于wheel组需要注意,一旦将用户加入了wheel组,则默认表示该用户拥有执行所有命令的权限,因为在visudo中默认有以下配置:
%wheel ALL=(ALL) ALL
# visudo
zhangsan ALL=(ALL) /sbin/ifconfig,/sbin/route //表示张三除了sbin下的ifconfig、route能执行以外,其他所用命令均不可执行
# visudo
Defaults logfile = "/var/log/secure" //添加此项,表示记录sudo使用日志,默认该功能已生效。
对于已授权用户进行执行命令的方法:
$ sudo ifconfig ens33 1.1.1.1/24 //回车后需要输入当前用户密码进行验证,验证通过即可执行命令
$ sudo -l //查看当前用户的授权信息
# cat /var/log/secure //root用查看sudo执行记录
当使用相同授权的用户过多,或者授权的命令较多可使用别名方式进行定义:
# visudo
User_Alias USER=zhangsan,lisi //定义用户张三李四给别名 USER
Host_Alias HOST=localhost //定义主机给HOST
Cmnd_Alias CMND=/bin/cat,/bin/cp //定义命令给CMND
USER HOST=CMND //代表用户zhangsan lisi能够在 本地主机上执行 cat cp命令
7.禁用重启热键Ctrl+Alt+Del
避免因用户误操作导致重启
CentOS 7:
# mv /usr/lib/systemd/system/ctrl-alt-del.target{,.back}
CentOS 6:
# vim /etc/init/control-alt-delete.conf
#start on control-alt-delete //注释
#exec /sbin/shutdown -r now "Control-Alt-Delete pressed" //注释
8.设置单用户模式密码
实现用户从单用户模式进入系统时需密码验证:
CentOS 7:
# grub2-mkpasswd-pbkdf2
# vim /etc/grub.d/00_header //末尾新增行增加以下内容: "cat<<EOF也必须增加"
cat <<EOF
set superusers='root'
password_pbkdf2 root grub.pbkdf2.sha512.10000.15699E16E86D79C3084AA969626337FB3A8000B84FC03D9DAB9FDBA6F95DB69A14EB85F100A221D6C396AD465820FF5FD8726E4CC8D5151433D7CC437B5440C5.797A64272FE6F595D07496730DEA2C304670322FA7473DC3BA18DD4C55533B9166E7023B619E8114C04B93590405DBFCD82774B7334D8CF450270B8E497C628E
EOF
# grub2-mkconfig -o /boot/grub2/grub.cfg //重新配置文件
也可以直接设置明文密码:
cat <<EOF
set superusers='root'
password root 123456
EOF
# grub2-mkconfig -o /boot/grub2/grub.cfg //重新配置文件
CentOS 6:
# grub-md5-crypt //生成加密密码字符串
Password:
Retype password:
$1$Kndw50$wRW2w1v/jbZ8n5q2fON4y/
# vim /boot/grub/grub.conf
splashimage=(hd0,0)/grub/splash.xpm.gz //在此项下加入以下行,保存退出
password --md5 $1$Kndw50$wRW2w1v/jbZ8n5q2fON4y/ //添加此行,表示设置密码
9.调整BIOS引导设置
将第一引导设备设为当前系统所在硬盘
禁止从其他设备(光盘、U盘、网络)引导系统
将安全级别设为setup,并设置管理员密码
10.禁止root用户从本地登录:
# vim /etc/securetty //只对root生效
#tty1 //注释登录终端
#tty2
....
11.禁止root用户通过sshd登录:
# vim /etc/ssh/sshd_config
PermitRootLogin no //将此项#号去掉,并修改参数为no,
# systemctl restart sshd //重启生效
12.禁止普通用户以本地及ssh登录:
touch /etc/nologin
允许普通用户登录:
rm -rf /etc/nologin
13.检查系统中特权用户及是否存在空口令用户
查看是否存在特权用户
通过判断uid是否为0来查找系统是否存在特权用户,使用命令awk即可:
# awk -F: '$3==0 {print $1}' /etc/passwd
查看是否存在空口令用户
安全起见,在/etc/passwd中用户的密码是被保护的状态,即使用了*号来隐藏。而实际的密码内容是加密后,保存在/etc/shadow文件中,我们确认是否存在空口令的用户就确认该文件中密码对应字段的长度是否为0,如果为0则证明该用户密码为空。
新建用户并且将用户密码设置为空:
# useradd lisi
# passwd -d lisi
shadows文件的结构:
"root:"后面的即为加密后的密码内容,新建用户由于密码未设置则会出现“!!”,且无法登录系统,密码字段为“*”为系统用户,也无法登录系统。
通过命令来查找是否存在该字段长度为0的用户
# awk -F: 'length($2)==0 {print $1}' /etc/shadow
14.弱口令检测
# cd
# tar zxf john-1.8.0.tar.gz
# cd john-1.8.0/src
# make clean linux-x86-64 //32位 Intel平台
# cp /etc/shadow /root/shadow.txt
# cd /root/john-1.8.0/run/
# ./john /root/shadow.txt //执行暴力破解
Press 'q' or Ctrl-C to abort, almost any other key for status
123456 (root) //已破解用户root 密码为123456
按CTRL+C可终止破解
查看已破解的账户列表:
# ./john --show /root/shadow.txt
通过其他字典进行破解
# :>john.pot //清空破解信息
# ./john --wordlist=./password.lst /root/shadow.txt //指定其他字典进行破解
15.sshd服务防止暴力破解
防止暴力破解的两种方法:
方法一、配置安全的sshd服务
- 密码足够的复杂,密码的长度要大于8位最好大于20位。密码的复杂度是密码要尽可能有数字、大小写字母和特殊符号混合组成
- 修改默认端口号
- 不允许root账号直接登陆,添加普通账号,授予root的权限
是否可以禁止root身份登录?
不行,因为有些程序需要使用root身份登录并运行。另外判断一个用户是不是超级管理员,看的是用户的ID是否为0。
4、不允许密码登陆,只能通过认证的秘钥来登陆系统
方法二:通过防护软件来避免暴力破解
简单、灵活、功能强大
技术1、fail2ban
实战背景:
最近公网网站一直被别人暴力破解sshd服务密码。虽然没有成功,但会导致系统负载很高,原因是在暴力破解的时候,系统会不断地认证用户,从而增加了系统资源额外开销,导致访问公司网站速度很慢。
fail2ban可以监视你的系统用户登录日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员,很好、很实用、很强大!
#ban (bæn)禁令
简单来说其功能就是防止暴力破解。工作的原理是通过分析一定时间内的相关服务日志,将满足动作的相关IP利用iptables加入到dorp列表一定时间。
注:重启iptables服务的话,所有DORP将重置。
下载软件包:
http://www.fail2ban.org/wiki/index.php/Downloads
安装:
解压查看readme文件
# tar -zxf fail2ban-0.8.14.tar.gz
# cd fail2ban-0.8.14
# vim README.md #查看以下内容
需要安装python开发环境,并且版本要大于2.4
查看当前系统中python的版本:
# python -V
安装:
# cd fail2ban-0.8.14
# python setup.py install
相关主要文件说明:
/etc/fail2ban/action.d //动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf //定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d //条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf //主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
生成服务启动脚本:
# pwd
/root/fail2ban-0.8.14
# cp files/redhat-initd /etc/rc.d/init.d/fail2ban
# chkconfig --add fail2ban //开机自动启动
怎么知道要复制这个文件? 一个新的软件包,后期怎么可以知道哪个文件是启动脚本文件?
这就要找服务器启动脚本文件中有什么特点,然后过滤出来对应的文件名。
# grep chkconfig ./* -R --color
./files/redhat-initd:# chkconfig: - 92 08
启动脚本里都包含chkconfig 字段
应用实例
设置条件:ssh远程登录5分钟内3次密码验证失败,禁止用户IP访问主机1小时,1小时该限制自动解除,用户可重新登录。
因为动作文件(action.d/iptables.conf)以及日志匹配条件文件(filter.d/sshd.conf )安装后是默认存在的。基本不用做任何修改。所有主要需要设置的就只有jail.conf文件。启用sshd服务的日志分析,指定动作阀值即可。
实例文件/etc/fail2ban/jail.conf及说明如下:
# vim /etc/fail2ban/jail.conf
[DEFAULT] #全局设置
ignoreip = 127.0.0.1/8 #忽略的IP列表,不受设置限制
bantime = 600 #屏蔽时间,单位:秒
findtime = 600 #这个时间段内超过规定次数会被ban掉
maxretry = 3 #最大尝试次数
backend = auto #日志修改检测机制(gamin、polling和auto这三种)
[ssh-iptables] #单个服务检查设置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置。
enabled = true #是否激活此项(true/false)修改成 true
filter = sshd #过滤规则filter的名字,对应filter.d目录下的sshd.conf
action = iptables[name=SSH, port=ssh, protocol=tcp] #动作的相关参数,对应action.d/iptables.conf文件
sendmail-whois[name=SSH, dest=you@example.com, sender=fail2ban@example.c
om, sendername="Fail2Ban"]#触发报警的收件人
logpath = /var/log/secure #检测的系统的登陆日志文件。这里要写sshd服务日志文件。 默认为logpath = /var/log/sshd.log
#5分钟内3次密码验证失败,禁止用户IP访问主机1小时。 配置如下
bantime = 3600 #禁止用户IP访问主机1小时
findtime = 300 #在5分钟内内出现规定次数就开始工作
maxretry = 3 #3次密码验证失败
启动服务:
# systemctl start fail2ban
# systemctl enable fail2ban
测试:
# > /var/log/secure #清日志。 从现在开始
# systemctl restart fail2ban
Stopping fail2ban: [ OK ]
Starting fail2ban: [ OK ]
# iptables -L -n
会多生成一个规则链。
测试:故意输入错误密码3次,再进行登录时,会拒绝登录
# ssh 192.168.1.63
root@192.168.1.63's password:
Permission denied, please try again.
root@192.168.1.63's password:
Permission denied, please try again.
root@192.168.1.63's password:
Permission denied (publickey,password).
# ssh 192.168.1.63
ssh: connect to host 192.168.1.63 port 22: Connection refused
# iptables -L |tail -4
Chain fail2ban-SSH (1 references)
target prot opt source destination
DROP all -- 192.168.7.142 anywhere
RETURN all -- anywhere anywhere
# fail2ban-client status#配置好之后我们检测下fail2ban是否工作。
Status
|- Number of jail: 1
`- Jail list: ssh-iptables
#具体看某一项的状态也可以看,如果显示被ban的ip和数目就表示成功了,如果都是0,说明没有成功。
# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure
| |- Currently failed: 0
| `- Total failed: 3
`- action
|- Currently banned: 1
| `- IP list: 192.168.1.64
`- Total banned: 1
#查看fail2ban的日志能够看到相关的信息
# tail /var/log/fail2ban.log
2019-08-03 19:40:00,233 fail2ban.actions[12111]: WARNING [ssh-iptables] Ban 192.168.1.64
需要注意:
1、如果做错了,想清空一下记录,还原:
# > /var/log/secure
# systemctl restart fail2ban
2、另外如果后期需要把iptables清空后或iptables重启后,也需要把fail2ban重启一下。
技术2、通过pam 模块来防止暴力破解ssh
# vim /etc/pam.d/sshd
在第一行下面添加一行:
auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=1200
说明:尝试登陆失败超过3次,普通用户600秒解锁,root用户1200秒解锁
手动解除锁定:
例如,查看work用户的错误登陆次数:
pam_tally2 --user work
例如,清空 work 用户的错误登陆次数,
pam_tally2 --user work --reset
技术3、通过shell脚本来防止暴力破解ssh
通过自定义的shell脚本来防护安全
技术4、denyhosts 软件防护
当我们的服务器对外提供服务的时候,难免的会受到其他用户的扫描和试图登录的操作,以侵入服务器,这样不仅会浪费系统的资源,有可能还会被其他用户进行N多次尝试后登录系统,对系统造成破坏影响业务系统的正常运行。DenyHosts是一个使用python编写的脚本文件,通过运行这个脚本(可以通过命令行运行、计划任务或者是作为服务运行)可以有效的阻止对SSH服务器的攻击。DenyHosts具有如下特性:
1. 对/var/log/secure日志文件进行分析,查找所有的登录尝试,并且过滤出失败和成功的尝试。
2.记录下所有失败的登录尝试的用户名和主机,如果超过阀值,则记录主机。
3.保持对每一个登录失败的用户(存在系统中或不存在系统中的用户)的跟踪
4.对每一个可疑的登录进行跟踪。(虽然登录成功,但是有很多次登录失败的记录)
5.将可疑地址的主机加入到/etc/hosts.deny文件中。