Linux基本防护措施
1)禁止普通用户使用reboot、halt、poweroff程序
2)修改用户zhangsan的账号属性,设置为2015-12-31日失效(禁止登录)
3)锁定用户lisi的账户,使其无法登录,验证效果后解除锁定
4)锁定文件/etc/resolv.conf、/etc/hosts,以防止其内容被无意中修改
https://blog.csdn.net/ice_bird/article/details/89177236
1、针对端口进行渗透
2、odly漏洞
3、擅长密码破解
4、针对DDOS攻击
1、检查系统用户是否存在异常账号若存在清除异常账户
cat /etc/passwd
无异常账户
2. 检查ssh日志是否存在短时间内大量的尝试登陆行为,从而判断这个登录成功的账户是正常登陆还是异常登陆
查看secure日志文件判断是否存在大量的Invalid user 字眼
cat /var/log/secure | grep "Invalid user"
cat /var/log/secure | grep “Accepted password for victim from 192.168.171.130″ 记录登陆成功的时间点然后判断是否跟暴力破解的时间段一致,如果一致则表示该账户是被爆破成功登陆。或者直接找管理员确认登陆信息是否正常。
跟上面的secure日志中的时间点做匹配可以看到该账户是被暴力破解出来的。
3,检查定时任务是否存在异常情况
1)crontab -l查看当前用户的定时任务信息
2)sudo crontab -u root -l 查看root账户的定时任务信息
3)查看/etc/cron.d/文件夹中是否存在文件
能够看到cron.d文件夹中存在定时任务但是内容不含攻击行为。
4)查看/etc/cron.daily/ /etc/cron.weekly/ /etc/cron.hourly/ /etc/cron.monthly/ 这些文件夹下面是否存在定时任务
修复方案
分别执行passwd victim 和passwd root命令修改victim和root账户密码。
删除.ssh/目录下的authorized_keys文件。
rm -rf .ssh/authorized_keys
3,清除定时任务
如果存在定时任务直接删除定时任务文件或者进入到定时任务文件中删除所在行信息即可。
4,增加ssh登陆失败次数限制
编辑sshd_config配置文件修改MaxAuthTries记录。
保存退出后重启sshd服务。
再次尝试登陆且输入密码超过2次后会出现如下信息。
再次使用hydra尝试爆破ssh用户名密码。
查看secure日志:
需要通过pam来锁定超过登陆次数的账户编辑/etc/pam.d/sshd文件:
vim /etc/pam.d/sshd
增加如上所示一条记录该条记录,表示登陆失败超过三次后就锁定300秒,root账户如果三次尝试后也不行将被锁定1200秒。
字段解释:
deny表示的是设置的最大失败次数
unlock_time 表示的是锁定多长时间单位是秒
deny_root 表示root账户也封锁
root_unlock_time 表示的是root账户的锁定时间
注:
如果限制ssh登陆则编辑sshd文件
如果限制终端登陆则编辑login文件
再次尝试hydra爆破
发现无法成功爆破查看secure日志:
日志中显示victim账户已经被锁定。
查看锁定的账户和登陆失败的次数:
sudo pam_tally2 --user victim
这时候尝试输入正确密码尝试登陆:
依然无法登陆。那怎么解除封锁呢?
只需要将pam中的记录清除掉即可。
sudo pam_tally2 --user victim --reset
5. 限制只允许特定ip地址访问ssh
通过编辑/etc/hosts.allow和/etc/hosts.deny这两个文件来控制访问源ip地址范围。当两个文件同时存在策略的时候allow文件的优先级大于deny文件。
这里我们限制victim主机只允许171.1访问其他全阻断。
1)vim /etc/hosts.allow 增加如下记录
sshd:192.168.171.1:allow
2)vim /etc/hosts.deny 增加如下记录sshd:ALL
然后测试从171.130 ssh访问171.121主机如下所示可以看到通过171.130无法登陆。
查看171.1主机仍然处于登陆状态。
6. 限制只允许特定用户访问ssh
通过编辑sshd配置文件增加AllowUsers和DenyUsers配置选项来控制允许登陆的用户。
sudo vim /etc/ssh/sshd_config在文件中追加如下配置,如果记录存在直接修改记录即可,如果记录不存在需要在文件末尾追加。
AllowUsers victim
DenyUsers root
配置完毕后重启sshd服务然后分别尝试以vicitm和root账户登陆victim主机。
可以看到victim账户可以直接登陆root账户则无法直接登陆。
这样我们可以通过控制ip和账户信息来实现完美控制限制只允许从某台主机使用某个账户登陆。
但是这样有点麻烦需要编辑hosts.allow、hosts.deny和sshd_config文件,其实我们可以直接编辑sshd_config文件增加如下记录:
AllowUsers victim@192.168.171.1
这样我们就可以限制只允许171.1通过victim账户登陆victim主机了。
我们在其他主机尝试用victim账户登陆如下图所示可以看到无法登陆。
7. 修改对外提供ssh服务的端口号
1)编辑sshd_config文件增加如下配置
port 22
port 3389
增加另外一个ssh端口号3389避免修改失败连接不上主机了
2)向防火墙添加修改的端口号
sudo firewall-cmd --zone=public --add-port=3389/tcp --permanent
重载防火
sudo firewall-cmd --reload
查看端口号是否添加成功
sudo firewall-cmd --zone=public --query-port=3389/tcp
3)向selinux中添加修改的端口号
3.1)首先要安装selinux的管理工具semanage
sudo yum provides semanage
sudo yum install policycoreutils-python #安装依赖包
3.2)安装完成后可以使用semanage命令查看ssh服务端口
sudo semanage port -l | grep ssh
sudo semanage port -a -t ssh_port_t -p tcp 3389
验证ssh端口是否添加成功
sudo semanage port -l | grep ssh
systemctl restart sshd
4)删除22端口号
4.1)编辑sshd_config文件注释掉22端口
4.2)firewall_cmd删除22端口
firewall-cmd --zone=public --remove-port=22/tcp --permanent
重载防火墙
sudo firewall-cmd --reload
4.3)selinux不用删除22端口或者说你也删除不了,但是不影响我们的需求
4.4)重启sshd服务然后尝试用22端口连接victim主机发现是无法连接的使用3389端口是可以的
策略正常生效
到此加固工作已经完成。
检测需求如下:
1. 能够检测到尝试登陆行为
2. 能够检测到登陆成功行为
3. 能够检测到登陆成功账户
4. 收集用户字典
5. 记录登录失败的用户名/次数、登录失败用户正确的次数、登录成功的用户名/次数、登陆成功的攻击源IP地址/尝试次数、登录失败的攻击源IP地址/尝试次数(自己可以罗列更详细需求)
https://www.freebuf.com/articles/system/194775.html
需要做的检测策略如下:
1. 能够检测到尝试登陆行为
1)这里我们设定10秒钟内发现5条存在 invalid user 或者password check failed语句的记录则表示存在尝试登陆行为(规则可自定义:包括时间和记录数)
2. 能够检测到登陆成功行为
1)检索所有日志发现存在 accepted password for 语句的记录则判定存在登陆成功情况
3. 能够检测到登陆成功账户
1)提取日志中匹配到accepted password for关键词语句后面的一个字段
4. 收集用户字典
1)提取日志中匹配到Invalid user关键词语句后面的一个字段
5. 记录登录失败的用户名/次数、登录失败用户正确的次数、登录成功的用户名/次数、登陆成功的攻击源IP地址/尝试次数、登录失败的攻击源IP地址/尝试次数
1)通过各种计算方法来统计如上信息
检查脚本如下:
#!/usr/bin/python
#coding:utf-8
from collections import Counter
#定义关键词信息
username_error='Invalid user'
username_correct='password check failed'
username_password_correct='Accepted password for'
user_quit='Received disconnect from'
user_forcequit='Connection closed'
#打开日志文件
f=open('secure','r')
#定义检测方法
def attack_detect():
#用户名错误的请求次数
failed_account=0
#用户名正确且密码错误的请求次数
correct_user_account=0
#用户名正确且密码正确的请求次数
correct_pass_account=0
#记录错误的用户名
failed_user=[]
#记录用户名正确且密码错误的用户名
correct_user=[]
#记录用户名正确且密码正确的用户名
correct_pass=[]
#记录登录失败的ip地址
failed_ipaddr=[]
#记录登录失败&用户名正确的ip地址
correct_ipaddr=[]
#记录登录成功的ip地址
correct_pass_ipaddr=[]
#标志位
alert=True
for i in f:
if username_error in i:
failed_account += 1
failed_user.append(i.split(': ')[1].split()[2])
failed_ipaddr.append(i.split(': ')[1].split()[4])
if username_correct in i:
correct_user_account += 1
correct_user.append(i.split(': ')[1].split('(')[1].strip(')'))
if username_password_correct in i:
correct_pass_account += 1
correct_pass.append(i.split(': ')[1].split()[3])
correct_pass_ipaddr.append(i.split(': ')[1].split()[5])
if failed_account > 30 and alert:
print 'exists ssh enumrate'
alert=False
#记录登陆失败攻击源IP地址和尝试次数
failed_ipaddr_count=Counter(failed_ipaddr)
failed_ipaddr_dict=dict(failed_ipaddr_count)
#记录登陆成功攻击源IP地址和尝试次数
correct_pass_ipaddr_count=Counter(correct_pass_ipaddr)
correct_pass_ipaddr_dict=dict(correct_pass_ipaddr_count)
#记录登陆失败用户名和次数
failed_user_count=Counter(failed_user)
failed_user_dict=dict(failed_user_count)
#记录登陆失败用户名正确和次数
correct_user_count=Counter(correct_user)
correct_user_dict=dict(correct_user_count)
#记录登陆成功用户名和次数
correct_pass_count=Counter(correct_pass)
correct_pass_dict=dict(correct_pass_count)
#记录所有尝试次数
all_account=failed_account+correct_user_account+correct_pass_account
return all_account,failed_account,correct_user_account,correct_pass_account,failed_user_dict,correct_user_dict,correct_pass_dict,failed_ipaddr_dict,correct_pass_ipaddr_dict
然后执行该脚本可以得出如下结果:
image.png从结果中可以看出该脚本能够满足我们的需求,但是我们需要考虑如何把这段脚本加入到spark streaming中。
限制终端方式登录:
vim vim /etc/pam.d/login
#%PAM-1.0
#添加如下一行
auth required pam_tally2.so deny=3 unlock_time=100 even_deny_root root_unlock_time=300
deny: 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
unlock_time: 设定普通用户锁定后,多少时间后解锁,单位是秒
root_unlock_time: 设定root用户锁定后,多少时间后解锁,单位是秒
编辑文件 /etc/pam.d/sshd
限制ssh方式登录:
vim /etc/pam.d/sshd
#%PAM-1.0
#添加如下一行
auth required pam_tally2.so deny=3 unlock_time=100 even_deny_root root_unlock_time=300
注:
由于openssh版本区别,有些版本在/etc/pam.d/sshd添加是不生效的,需要修改ssh配置文件开启PAM模块
vim /etc/ssh/sshd_config
#修改并取消注释
UsePAM yes
重启服务
systemctl restart sshd.service
vim /etc/pam.d/sshd
#%PAM-1.0
#添加如下两行
auth required pam_tally2.so deny=3 unlock_time=100 even_deny_root root_unlock_time=300
#登录成功后重置次数
account required pam_tally2.so
查看用户登录失败的次数:
pam_tally2 -u user
解锁aihuidi用户
pam_tally2 -r -u user
一、服务器
1,禁用ROOT
2,用户名和密码尽量复杂
3,修改ssh的默认22端口
4,安装DenyHosts防暴力破解软件
5,禁用密码登录,使用RSA公钥登录
二、redis
1,禁用公网IP监听,包括0.0.0.0
2,使用密码限制访问redis
3,使用较低权限帐号运行redis
三、SSH安全
新建用户,设置密码
useradd eason
passwd eason
不允许root直接登陆
修改配置文件
vi /etc/ssh/sshd_config
禁止root登录
查找“#PermitRootLogin yes”,将前面的“#”去掉,短尾“yes”改为“no”,并保存文件。
修改默认端口号
找到#Port 22字段删掉#,将22改为其他不被使用的端口
服务器端口最大可以开到65536
配置普通用户超级权限
vim /etc/sudoers
重启SSH服务
systemctl restart firewalld
/etc/init.d/sshd restart
service restart sshd
SSH登录格式
ssh -p 34567 user@ip
第一步 :修改/etc/ssh/sshd_config文件
[root@centos7 ~]# vi /etc/ssh/sshd_config
找到以下内容并修改它:
ClientAliveInterval 0
ClientAliveCountMax 3
并将注释符号("#")去掉,
将ClientAliveInterval对应的0改成60,
修改/etc/ssh/sshd_config文件
ClientAliveInterval指定了服务器端向客户端请求消息 的时间间隔, 默认是0, 不发送.
ClientAliveInterval 60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了.
ClientAliveCountMax, 使用默认值3即可.
ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开.
正常情况下, 客户端不会不响应.
重起sshd服务:
CentOS6:
[root@centos6 ~]# service sshd restart
CentOS7:
[root@centos7 ~]# systemctl restart sshd
第二步:修改环境变量文件/etc/profile
为了增强Linux系统的安全性,我们需要在用户输入空闲一段时间后自动断开,这个操作可以由设置TMOUT值来实现。将以下字段加入到/etc/profile 中即可(对所有用户生效)。
用以下命令判断是否是否设置了该参数
[root@centos7 ~]# echo $TMOUT
如果输出空或0表示不超时,大于0的数字n表示n秒没有收入则超时
修改方法
[root@centos7 ~]# vi /etc/profile
添加以下内容:
export TMOUT=0
将以上修改为0就是设置不超时
修改/etc/profile文件
立即生效:
[root@centos7 ~]# source /etc/profile
四、防止攻击
1、禁用ping,vi /etc/rc.d/rc.local下添加一行:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all,0表示运行,1表示禁用
2、防止DOS攻击,所有用户设置资源限制,vi /security/limits.conf添加以下几行,hard core 0,hard rss 5000,hard nproc 50,禁止调试文件;检查/etc/pam.d/login文件,必须存在session required /lib/security/pam_limits.so
五、禁止使用Ctrl+Alt+Del快捷键重启服务器
vi /etc/inittab #注释这一行
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
六、使用yum update更新系统时不升级内核,只更新软件包
由于系统与硬件的兼容性问题,有可能升级内核后导致服务器不能正常启动,这是非常可怕的,没有特别的需要,建议不要随意升级内核。
cp /etc/yum.conf /etc/yum.confbak
1、修改yum的配置文件 vi /etc/yum.conf 在[main]的最后添加 exclude=kernel*
2、直接在yum的命令后面加上如下的参数:
yum --exclude=kernel* update
查看系统版本 cat /etc/issue
查看内核版本 uname -a
七、关闭自动更新
chkconfig --list yum-updatesd #显示当前系统状态
service yum-updatesd stop #关闭 开启参数为start
chkconfig --level 35 yum-updatesd off #禁止开启启动)
chkconfig yum-updatesd off #禁止开启启动(所有启动模式全部禁止)
chkconfig --list yum-updatesd #显示当前系统状态
八、隐藏系统信息
在缺省情况下,当你登陆到linux系统,会显示linux发行版的名称、版本、内核版本、服务器的名称。这些信息不能泄露,需隐藏起来。
修改下面两文件的命名。
mv /etc/issue /etc/issuebak
mv /etc/issue.net /etc/issue.netbak
九、限制文件的权限
700权限表示只有属主才能去操作
chmod 700 /usr/bin
恢复文件权限命令:chmod 755 对应文件
十、关闭多余的虚拟控制台
系统默认定义了 6 个虚拟控制台,关闭多余的控制台,只留一个控制台,可以节省内存,防止从不同的控制台登录,修改如下:
vi /etc/inittab
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
系统用户
超级管理员 uid=0
系统默认用户 系统程序使用,从不登录
新建普通用户 uid大于500
/etc/passwd
/etc/shadow
chmod 目录权限
chown更改属主
** chgrp**
mask值为0022所对应的默认文件和文件夹创建的缺省权限分别为644和755
文件夹其权限规则为:777-022-755
文件其权限规则为:777-111-022=644(因为文件默认没有执行权限)
修改UMASK值:
1、直接在命令行下 umask xxx(重启后消失)
2、修改/etc/profile中设定的umask值
检查shadow中空口令账号检查方法:
检查方法:
# awk -F ":" '($2== "!!") {print $1}' /etc/shadow
使用命令passwd -l <用户名> 锁定不必要的账号
使用命令passwd -u <用户名>解锁需要恢复的账号
使用命令passwd <用户名> 为用户设置密码
设置系统密码策略
执行命令查看密码策略设置
[root@localhost ~]# cat /etc/login.defs | grep PASS
加固方法:
** passwd -l <用户名>**
限制能够su为root的用户
查看是否有auth required /libsecurity/pam_whell.so这样的配置条目
限制能够su为root的用户
查看是否有auth required /libsecurity/pam_whell.so这样的配置条目
[root@localhost ~]# cat /etc/pam.d/su
加固方法:
重要文件加上不可改变属性
把重要文件加上不可改变属性
Umask安全
十二、SSH安全
禁止root用户进行远程登陆
检查方法:
加固方法:
更改服务端口:
屏蔽SSH登陆banner信息
仅允许SSH协议版本2
防止误使用Ctrl+Alt+Del重启系统
检查方法:
加固方法:
设置账号锁定登录失败锁定次数、锁定时间
检查方法:
加固方法:
解锁用户:
修改账号TMOUT值,设置自动注销时间
检查方法:
cat /etc/profile | grep TMOUT
加固方法:
vim /etc/profile
增加
TMOUT=600 无操作600秒后自动退出
设置BASH保留历史命令的条目
检查方法:
cat /etc/profile | grep HISTSIZE
加固方法:
vim /etc/profile
修改HISTSIZE=5即保留最新执行的5条命令
设置注销时删除命令记录
检查方法:
cat /etc/skel/.bash_logout 增加如下行
rm -f $HOME/.bash_history
这样,系统中的所有用户注销时都会删除其命令记录,如果只需要针对某个特定用户,,如root用户进行设置,则可只在该用户的主目录下修改/$HOME/.bash_history文件增加相同的一行即可。
设置系统日志策略配置文件
日志的主要用途是 系统审计 、监测追踪和分析。为了保证 Linux 系 统正常运行、准确解决遇到的各种样统问题,认真地读取日志文件是管理员的一项非常重要任务。
UNIX/ Linux 采用了syslog 工具来实现此功能,如果配置正确的 话,所有在主机上发生的事情都会被记录下来不管是好还是坏的 。
检查方法:
cat /etc/profile | grep HISTSIZE
确定syslog服务是否启用
查看syslogd的配置,并确认日志文件是否存在
阻止系统响应任何从外部/内部来的ping请求
十三、关闭自动更新
chkconfig --list yum-updatesd #显示当前系统状态
service yum-updatesd stop #关闭 开启参数为start
chkconfig --level 35 yum-updatesd off #禁止开启启动)
chkconfig yum-updatesd off #禁止开启启动(所有启动模式全部禁止)
chkconfig --list yum-updatesd #显示当前系统状态
隐藏系统信息
在缺省情况下,当你登陆到linux系统,会显示linux发行版的名称、版本、内核版本、服务器的名称。这些信息不能泄露,需隐藏起来。
修改下面两文件的命名。
mv /etc/issue /etc/issuebak
mv /etc/issue.net /etc/issue.netbak
关闭系统不需要的服务
service acpid stop chkconfig acpid off #停止服务,取消开机启动
service autofs stop chkconfig autofs off #停用自动挂载档案系统与周边装置
service bluetooth stop chkconfig bluetooth off #停用Bluetooth蓝牙
service cpuspeed stop chkconfig cpuspeed off #停用控制CPU速度主要用来省电
service cups stop chkconfig cups off #停用Common UNIX Printing System 使系统支援印表机
service ip6tables stop chkconfig ip6tables off #禁止IPv6
关闭多余的虚拟控制台
系统默认定义了 6 个虚拟控制台,关闭多余的控制台,只留一个控制台,可以节省内存,防止从不同的控制台登录,修改如下:
vi /etc/inittab
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
优化内核参数
vi /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 10024 65535 #(表示用于向外连接的端口范围。缺省情况下很小:32768到61000 注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口! )
十四、Linux主机安全加固
加固目录
密码策略
升级openssh版本
设置终端超时
删除无效定时任务
删除无效一次性任务
进程管理
SSH安全配置
无效服务管理
防火墙策略
设置历史记录条数:
设置系统日志保留时间
锁定不必要用户
加固内容及方法
##################################################################################
#### 以下部分操作属于高危操作,在未得到用户充分授权的情况下,请勿擅自修改 #####
##################################################################################
##################################################################################
# 1、系统登陆密码复杂度:
### 密码有效期控制 ###
vim /etc/login.defs
## 修改如下行 ##
PASS_MAX_DAYS 180 #密码最长过期天数
PASS_MIN_DAYS 30 #密码最小过期天数
PASS_MIN_LEN 12 #密码最小长度
PASS_WARN_AGE 20 #密码过期警告天数
###备份###
cp /etc/login.defs /etc/login.defs.xu.bak
sed -i 's/PASS_MAX_DAYS 99999/PASS_MAX_DAYS 180/g' /etc/login.defs
sed -i 's/PASS_MIN_DAYS 0/PASS_MIN_DAYS 30/g' /etc/login.defs
sed -i 's/PASS_MIN_LEN 5/PASS_MIN_LEN 12/g' /etc/login.defs
sed -i 's/PASS_WARN_AGE 7/PASS_WARN_AGE 20/g' /etc/login.defs
### 密码复杂度控制 ###
vim /etc/pam.d/system-auth
### 找到 password requisite pam_cracklib.so 替换成如下:###
password requisite pam_cracklib.so retry=5 difok=3 minlen=10 ucredit=-1 lcredit=-3 dcredit=-3 dictpath=/usr/share/cracklib/pw_dict
##################################################################################
##################################################################################
# 2、升级openssh版本;
### 按需做,这里暂且不对这项进行整改 ###
##################################################################################
##################################################################################
# 3、设置终端超时:
##后续优化对于已经存在配置的判断,一下方法暂用,不会影响整改结果##
echo 'export TMOUT=1800'>>/etc/profile
echo 'readonly TMOUT' >>/etc/profile
source /etc/profile
##################################################################################
##################################################################################
# 4、检查定时任务(防止病毒感染):
### 定时任务 ###
crontab -l
### 一次性任务检查 ###
at -l
##################################################################################
##################################################################################
# 5、检查异常进程(防止挖矿病毒,占用内存或者CPU):
### 检查cpu占用前10 ###
ps aux|sort -rn -k +3|head
### 检查内存占用前10 ###
ps aux|sort -rn -k +4|head
##################################################################################
##################################################################################
# 6、root用户远程登陆:
### 由于没有业务用户,修改此项会影响用户正常使用,所以在非必要情况下不进行配置 ###
vim /etc/ssh/sshd_config
# 设置如下行
PermitRootLogin yes
PermitRootLogin prohibit-password
## 可以修改默认端口保证安全性,按需 ##
Port 22
### 修改完配置之后记得重启服务生效 ###
service sshd restart
##################################################################################
##################################################################################
# 7、关闭无效的服务及端口:
##邮箱##
service postfix status
chkconfig --del postfix
chkconfig postfix off
##cups##
service cups status
chkconfig --del cups
chkconfig cups off
## 其他服务请手动检查 ##
##################################################################################
##################################################################################
# 8、设置防火墙策略:
####检查IPTABLES状态###
service iptables status
echo '请根据用户实际业务端口占用等情况进行设置!'
## 例如:vim /etc/sysconfig/iptables ,添加如下策略 ##
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 8080 -j ACCEPT
## 重启防火墙 ##
service iptabels restart
##################################################################################
##################################################################################
# 9、设置历史记录数量:
###备份###
cp /etc/profile /etc/profile_xu_bak
###修改###
sed -i s/'HISTSIZE=1000'/'HISTSIZE=5000'/g /etc/profile
###检查###
cat /etc/profile |grep HISTSIZE|grep -v export
##################################################################################
##################################################################################
# 10、日志保留半年以上:
###备份###
cp /etc/logrotate.conf /etc/logrotate.conf_xu_bak
###修改###
sed -i s/'rotate 4'/'rotate 12'/g /etc/logrotate.conf
###重启####
service syslog restart
###检查###
cat /etc/logrotate.conf |grep -v '#' |grep rotate
##################################################################################
##################################################################################
# 11、锁定不必要的用户:
###备份###
cp -p /etc/passwd /etc/passwd_xu_bak
cp -p /etc/shadow /etc/shadow_xu_bak
###锁定不必要的用户###
### bin, sys,adm,uucp,lp, nuucp,hpdb, www, daemon ###
passwd -l bin
passwd -l sys
passwd -l adm
passwd -l uucp
passwd -l lp
passwd -l nuucp
passwd -l hpdb
passwd -l www
passwd -l daemon
##################################################################################
### 连续6次输错密码禁用一段时间,建议配置成300秒 ###
##################################################################################
### 配置系统超时自动退出,建议配置成300秒 ###
##################################################################################
linux服务器安全加固shell脚本
#!/bin/sh
# desc: setup linux system security
# author:skykws
# powered by www.16safe.com
# version 0.1.2 written by 2014.10.28
#account setup
passwd -l xfs
passwd -l news
passwd -l nscd
passwd -l dbus
passwd -l vcsa
passwd -l games
passwd -l nobody
passwd -l avahi
passwd -l haldaemon
passwd -l gopher
passwd -l ftp
passwd -l mailnull
passwd -l pcap
passwd -l mail
passwd -l shutdown
passwd -l halt
passwd -l uucp
passwd -l operator
passwd -l sync
passwd -l adm
passwd -l lp
# chattr /etc/passwd /etc/shadow
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow
# add continue input failure 3 ,passwd unlock time 5 minite
sed -i 's#auth required pam_env.so#auth required pam_env.so\nauth required pam_tally.so onerr=fail deny=3 unlock_time=300\nauth required /lib/security/$ISA/pam_tally.so nerr=fail deny=3 unlock_time=300#' /etc/pam.d/system-auth
# system timeout 5 minite auto logout
echo "TMOUT=300" >>/etc/profile
# will system save history command list to 10
sed -i "s/HISTSIZE=1000/HISTSIZE=10/" /etc/profile
# enable /etc/profile go!
source /etc/profile
# add syncookie enable /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
sysctl -p # exec sysctl.conf enable
# optimizer sshd_config
sed -i "s/#MaxAuthTries 6/MaxAuthTries 6/" /etc/ssh/sshd_config
sed -i "s/#UseDNS yes/UseDNS no/" /etc/ssh/sshd_config
# limit chmod important commands
chmod 700 /bin/ping
chmod 700 /usr/bin/finger
chmod 700 /usr/bin/who
chmod 700 /usr/bin/w
chmod 700 /usr/bin/locate
chmod 700 /usr/bin/whereis
chmod 700 /sbin/ifconfig
chmod 700 /usr/bin/pico
chmod 700 /bin/vi
chmod 700 /usr/bin/which
chmod 700 /usr/bin/gcc
chmod 700 /usr/bin/make
chmod 700 /bin/rpm
# history security
chattr +a /root/.bash_history
chattr +i /root/.bash_history
# write important command md5
cat > list << "EOF" &&
/bin/ping
/bin/finger
/usr/bin/who
/usr/bin/w
/usr/bin/locate
/usr/bin/whereis
/sbin/ifconfig
/bin/pico
/bin/vi
/usr/bin/vim
/usr/bin/which
/usr/bin/gcc
/usr/bin/make
/bin/rpm
EOF
for i in `cat list`
do
if [ ! -x $i ];then
echo "$i not found,no md5sum!"
else
md5sum $i >> /var/log/`hostname`.log
fi
done
rm -f list
linux系统安全加固脚本
#!/bin/bash
#备份所需要配置的文件
cp /etc/login.defs /etc/login.defs.bak
cp /etc/profile /etc/profile.bak
cp /etc/pam.d/common-password /etc/pam.d/common-password.bak
sed -i -e '/^PASS_MAX_DAYS/'d /etc/login.defs
sed -i -e '/^PASS_MIN_DAYS/'d /etc/login.defs
sed -i -e '/^PASS_WARN_AGE/'d /etc/login.defs
#禁止组合键关机
sed -i -e '/^ca\:\:ctrlaltdel/'d /etc/inittab
#新建用户口令生存期
echo PASS_MAX_DAYS 90 >> /etc/login.defs
#新建用户口令更改最小间隔天数
echo PASS_MIN_DAYS 5 >> /etc/login.defs
#口令过期前警告天数
echo PASS_WARN_AGE 7 >> /etc/login.defs
#口令最小长度
echo PASS_MIN_LEN 8 >> /etc/login.defs
#无操作300秒后自动退出
echo TMOUT=300 >> /etc/profile
#保留最新执行的5条命令
echo HISTFILESIZE=5 >> /etc/profile
echo HISTSIZE=5 >> /etc/profile
#新建文件及文件夹默认权限
#echo umask 027 >> /etc/profile
#echo alias rm='rm -i' >> /etc/profile
#echo alias ls='ls -aol' >> /etc/profile
#密码复杂性要求
echo password required pam_cracklib.so use_authtok minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 >> /etc/pam.d/common-password
#设置为密码连续错误5次锁定,锁定时间300秒
echo auth required pam_tally2.so deny=5 onerr=fail no_magic_root unlock_time=300 >> /etc/pam.d/common-password
#口令历史策略
echo password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember=5 >> /etc/pam.d/common-password
#禁止ping
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#禁止IP伪装
echo nospoof on >> /etc/host.conf
#创建新的用户
useradd osadmin
echo password | passwd --stdin osadmin >> /dev/null
#配置ssh使用协议2版本
echo Protocol 2 >> /etc/ssh/sshd_config
#禁止root使用ssh远程登陆
echo PermitRootLogin no >> /etc/ssh/sshd_config
十五、查找是否有后门
cat /etc/crontab
ls /var/spool/cron/
cat /etc/rc.d/rc.local
ls /etc/rc.d
ls /etc/rc3.d
find / -type f -perm 4000
十六、对用户的登录次数进行限制
有一些攻击性的软件是专门采用暴力破解密码的形式反复进行登录尝试,对于这种情况,我们可以调整用户登录次数限制,使其密码输入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
pam_tally2 查看被锁定的用户
pam_tally2 --reset -u username 将被锁定的用户解锁
#! /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
linux限制用户密码尝试次数
设置方式:
vi /etc/pam.d/system-auth
auth required /lib/security/$ISA/pam_tally.so onerr=fail no_magic_root
account required /lib/security/$ISA/pam_tally.so deny=5 no_magic_root reset
#说明
deny=5 : Deny access if tally for this user exceeds 3 times.
lock_time=180 : Always deny for 180 seconds after failed attempt. There is also unlock_time=n option. It allow access after n seconds after failed attempt. If this option is used the user will be locked out for the specified amount of time after he exceeded his maximum allowed attempts. Otherwise the account is locked until the lock is removed by a manual intervention of the system administrator.
magic_root : If the module is invoked by a user with uid=0 the counter is not incremented. The sys-admin should use this for user launched services, like su, otherwise this argument should be omitted.
no_magic_root : Avoid root account locking, if the module is invoked by a user with uid=0
会有日志记录被锁定的用户
/var/log/faillog
清除被锁定的用户
crontab -l
*/30 * * * * /sbin/pam_tally –reset
或者
*/30 * * * * faillog -r
一、身份识别:
https://mp.weixin.qq.com/s/nZRIlcEHeX0RfgpNppHAUQ
账号登陆限制
限制登陆次数,锁定账户,主要为了防止暴力破解用户密码
1.修改PAM配置
限制终端方式登录:
vim vim /etc/pam.d/login
#%PAM-1.0
#添加如下一行
auth required pam_tally2.so deny=3 unlock_time=100 even_deny_root root_unlock_time=300
deny: 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
unlock_time: 设定普通用户锁定后,多少时间后解锁,单位是秒
root_unlock_time: 设定root用户锁定后,多少时间后解锁,单位是秒
限制ssh方式登录:
vim /etc/pam.d/sshd
#%PAM-1.0
#添加如下一行
auth required pam_tally2.so deny=3 unlock_time=100 even_deny_root root_unlock_time=300
注:
由于openssh版本区别,有些版本在/etc/pam.d/sshd添加是不生效的,需要修改ssh配置文件开启PAM模块
vim /etc/ssh/sshd_config
#修改并取消注释
UsePAM yes
重启服务
systemctl restart sshd.service
#登录成功后重置次数
account required pam_tally2.so
PAM命令扩展
查看用户登录失败的次数:
pam_tally2 -u user
解锁aihuidi用户
pam_tally2 -r -u user
空口令账户设置
禁止SSH空密码用户登录
加固方法:
编辑文件/etc/ssh/sshd_config,将PermitEmptyPasswords配置为no:
删除除root外UID为0的账户
理论依据:
任何UID为0的帐户都具有系统上的超级用户特权,只有root账号的uid才能为0
配置要求:
除root之外的其他账号UID不能为0
检查步骤
执行以下命令查看系统中uid为0的账号
#/bin/cat /etc/passwd | /bin/awk -F: ‘($3 == 0) { print $1 }’
设置密码过期期限
vi /etc/login.defs
PASSMAXDAYS 99999 #密码的最大有效期, 99999:永久有期
PASSMINDAYS 0 #是否可修改密码,0可修改,非0修改密码后下一次修改需间隔多少天后可修改
PASS_MIN_LEN 5 #密码最小长度,使用pam_cracklib module,该参数不再有效
PASSWARNAGE 7 #密码失效前多少天在用户登录时通知用户修改密码
为了更进一步加强系统的安全性,有必要建立一个管理员的 组,只允许这个组的用户来执行“su -”命令登录为root用户,而让其他组的用户即使执行“su -”、输入了正确的root密码,也无法登录为root用户。在UNIX和Linux下,这个组的名称通常为“wheel”
禁止非whell组用户切换到root
1、 修改/etc/pam.d/su配置
vi/etc/pam.d/su
auth required pam_wheel.so group=wheel --将auth改行没有注释掉普通用户就没办法切换到root
#auth required pam_wheel.so group=wheel --将#auth改行注释掉普通用户就可以切换到root
2、修改/etc/login.defs文件
echo “SU_WHEEL_ONLY yes” >> /etc/login.defs ← 添加语句到行末以上操作完成后,可以再建立一个新用户,然后用这个新建的用户测试会发现,没有加入到wheel组的用户,执行“su -”命令,即使输入了正确的root密码,也无法登录为root用户
3、通过shiran用户登录尝试切换到root
su - root 即使密码输入正确也无法切换
4: 把root用户加入wheel组再尝试切换,可以切换
usermod -G wheel shiran ← 将普通用户woo加在管理员组wheel组中 su - shiran
su - root ← 这时候我们看到是可以切换了
使用yum update更新系统时不升级内核,只更新软件包
由于系统与硬件的兼容性问题,有可能升级内核后导致服务器不能正常启动,这是非常可怕的,没有特别的需要,建议不要随意升级内核。
cp /etc/yum.conf /etc/yum.confbak
1、修改yum的配置文件 vi /etc/yum.conf 在[main]的最后添加 exclude=kernel*
2、直接在yum的命令后面加上如下的参数:
yum --exclude=kernel* update
查看系统版本 cat /etc/issue
查看内核版本 uname -a
关闭Centos自动更新
chkconfig --list yum-updatesd #显示当前系统状态
service yum-updatesd stop
service yum-updatesd status #查看是否关闭
chkconfig --level 35 yum-updatesd off #禁止开启启动(系统模式为3、5)
chkconfig yum-updatesd off #禁止开启启动(所有启动模式全部禁止)
chkconfig --list yum-updatesd #显示当前系统状态
优化Linux内核参数
cp /etc/sysctl.conf /etc/sysctl.confbak
vi /etc/sysctl.conf #在文件末尾添加以下内容
net.ipv4.ip_forward = 1 #修改为1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.netfilter.ip_conntrack_max = 131072
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.route.gc_timeout = 20
net.ipv4.ip_conntrack_max = 819200
net.ipv4.ip_local_port_range = 10024 65535
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_wmem = 8192 131072 16777216
net.ipv4.tcp_rmem = 32768 131072 16777216
net.ipv4.tcp_mem = 94500000 915000000 927000000
/sbin/sysctl -p #使配置立即生效
CentOS 系统优化
cp /etc/profile /etc/profilebak2
vi /etc/profile #在文件末尾添加以下内容
ulimit -c unlimited
ulimit -s unlimited
ulimit -SHn 65535
ulimit -S -c 0
export LC_ALL=C
source /etc/profile #使配置立即生效
ulimit -a #显示当前的各种用户进程限制
https://mp.weixin.qq.com/s/A2NNAc3A1DRhGbYAtggK1A
安全守则
参考链接 :
服务器预防攻击 :https://www.jianshu.com/p/95676f03bf2d
Linux服务器安全加固 :https://blog.csdn.net/qq_36119192/article/details/82906799
系统加固之Linux安全加固https://www.jianshu.com/p/b1f2f0292293
CentOS7.0系统安全加固手册 : https://www.jianshu.com/p/501346ec6b26
Linux 加固(centos7) :https://blog.csdn.net/niexinming/article/details/52261842
Linux主机安全加固 : https://blog.csdn.net/qq_31457413/article/details/102317837
https://blog.csdn.net/linkboy2004/article/details/1513495
SSH安全 : https://www.jianshu.com/p/d1fdf497a59a
Linux基本防护措施 : https://blog.csdn.net/S_XYY/article/details/90415059
linux 服务器安全配置最详解 :https://blog.csdn.net/u013050593/article/details/76605978
Linux系统安全配置(CentOS 7):https://blog.csdn.net/IChameleon/article/details/81773918
Cenos安全配置之身份识别相关 :https://mp.weixin.qq.com/s/nZRIlcEHeX0RfgpNppHAUQ
Cenos安全配置之身份识别相关https://mp.weixin.qq.com/s/nZRIlcEHeX0RfgpNppHAUQ
Linux用户登录次数限制 https://blog.csdn.net/weixin_42789427/article/details/102747457