写在前面:
当你获得了一台服务器,千万别着急着部署应用,安全是首要任务。如果整理一下顺序,Linux系统可以通过以下几个步骤来进行安全加固。本文主要针对企业常用的CentOS系统,Ubuntu系统略有差异可百度查询。
1.系统用户优化
2.系统服务优化
3.ssh访问策略
4.防火墙配置
1.系统用户优化
注意:在我们进行系统用户优化时,所做的每一步操作都需要和使用这台服务器的开发及管理人员进行沟通确认,确保不出现误操作。
用户是Linux中安全加固的第一关,如果系统中本身就存在有安全隐患的用户,那么再安全策略也无法起到加固的效果。
在Linux系统中可以使用下面的命令查看系统中的用户信息
cat /etc/passwd
这样的显示并不能让我们直观的看到系统中存在的安全隐患,所以我们可以用下面命令来有针对性的查看:
cat /etc/passwd | awk -F: '$3==0' //列出具有超级权限的用户 cat /etc/passwd | grep '/bin/bash' //列出具有登录shell的用户
如果除了root还有其他的超级用户,那就要非常小心了。一般情况下,新的系统是不会出现这种情况,但是小心驶得万年船,如果不是系统管理的特殊要求,系统中的超级用户最好只能是root。
在列出有登录shell的用户的列表中,这些用户都是可以使用终端登录系统,并进行操作的,即使这些用户可能只有普通权限,但仍然要小心。删除过期或者无用的用户。
2.系统服务优化
注意:同样,所做的每一步操作都需要和使用这台服务器的开发及管理人员进行沟通确认,确保不出现误操作。
一般情况下,系统可能会自动的运行一些不必要的服务,我们可以使用下面的命令查看当前默认开启运行的系统服务:
chkconfig --list | grep "3:on"
如果我们只是提供web服务,那么对于sendmail、nfs、postfix、ftp等不需要的服务就可以关闭了,关闭的命令是:
chkconfigoff
对于关键的服务,我们需要保证它们的运行,比如:iptables、sshd、syslog、httpd、nginx、mysql、php-fpm等。
3.ssh访问策略
不论是运维还是开发人员,ssh的访问都是我们日常工作中几乎唯一的控制系统的手段。所以ssh的安全性非常重要,一般来说较高的ssh安全策略秉承以下几个原则。
a.禁止root用户ssh登录。
b.禁止口令的方式验证。
c.只允许一个用户拥有sodu的完整权限。
d.除非是堡垒机,系统中不允许存放私钥文件。
e.使用一个随机端口来代替22端口。
但在做这些安全加固之前我们必须要做的意见就是:
新建一个普通用户,使这个用户可以通过证书的方式登入系统,并赋予sudo的完全权限。
证书验证的方法请参考:http://bbs.aliyun.com/read/252222.html?spm=5176.7189909.0.0.gKfLSI
加入sudo权限请进行如下操作(需要root权限):
编辑vim /etc/sudoers,加入一条:
test ALL=(ALL) NOPASSWD: ALL
这里的例子表示:将test赋予完全的sudo权限,并在sudo提权时不需要验证密码。
切记:在保证你能够通过test这个用户的证书方式登入系统并能够使用sudo su提权到root后,再进行下面的操作。
a.禁止root用户ssh登录。(需要root权限)
编辑/etc/ssh/sshd_config文件,将PermitRootLogin yes修改为
PermitRootLogin no
如果你很懒,直接执行下面的命令也可:
sed -i 's/\(PermitRootLogin\) yes/\1 no/' /etc/ssh/sshd_config
b.禁止口令,使用证书
编辑/etc/ssh/sshd_config文件,将PasswordAuthentication yes修改为
PasswordAuthentication no
当然也有懒人专用方法:
sed -i 's/\(PasswordAuthentication\) yes/\1 no/' /etc/ssh/sshd_config
c.sudo 的权限可以有很多种,但建议只给一个专门的运维用户赋予完全权限。且你要习惯在普通用户下使用sudo来进行临时提权。
d.服务器上只可以存放pub公钥文件,但私钥文件是绝对不允许存在的,除非这台服务器是堡垒机。
e.修改sshd的监听端口
编辑/etc/ssh/sshd_config文件,将
#Port 22
修改为
Port 28536
当然你可以指定任意一个没有被占用的自定义端口。
在完成了sshd的相关配置后,记得重启sshd服务
service sshd restart
以后我们使用ssh时就要指定端口为28536。
现在我们来看ssh的访问效果:
(1)所有用户不能使用密码验证登录。
(2)root用户不可直接登录的,即使拥有root密码,唯一获得root的方法是使用test用户提权。
(3)test用户只可以使用证书登录。
(4)ssh不再使用默认的22端口
4.防火墙策略
Linux的防火墙那肯定是iptables。
最高的防火墙策略是:全部关闭,逐个开启。
但这对于大多数人来说太复杂了,所以一般情况下我们只需要关注INPUT链即可。
(1)首先,清除原有的iptables规则。
在保证iptables所有链的默认规则为ACCEPT的前提下,使用以下命令:
iptables -F iptables -X iptabels -Z
(2)配置INPUT链规则
iptables -A INPUT -p tcp -m tcp --dport 28536 -j ACCEPT//允许ssh的端口通过 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT//允许已建立的和服务器发起的数据包通过 iptables -P INPUT DROP //丢弃所有未允许通过的数据包
效果:除了28536也就是ssh,任何访问服务器的数据包都将被拒绝。
注意:
在你配置了上述3条命令后,尝试从一个新的ssh连接登录服务器,如果登录成功。可以保存iptables规则:
service iptables save
如果出现任何意外你还可以通过重启服务器来返回iptables原来的状态,所以在测试iptables可以正确满足需求后再保存是一个好习惯。
最后:保证所有必须的服务器是开机自启的
chkconfig sshd on chkconfig iptables on