目录
1. 删除特殊用户和用户组
在安装系统完成后,系统默认会设置一些不必要的用户和用户组,如果某些用户及用户组是我们不需要的,应立即删除,因为用户越多,系统就越不安全,黑客可能利用这些账户威胁服务器。
Linux 系统中可以删除的默认用户和用户组大致如下:
- 可删用户:adm、lp、sync、shutdown、halt、news、uucp、operator、games 等
- 可删用户组:adm、lp、news、uucp、games、dip等
删除用户用命令userdel
,删除用户组用命令groupdel
。
此外,如果某些用户不需要登录功能,我们需要禁止此用户登录功能:
usermod -s /sbin/nologin 用户
2. 关闭系统不需要的服务
对服务器来说,服务越多越不安全,因此我们可以关闭不需要的服务来提高服务器的安全性能。
关闭服务可以通过chkconfig
命令实现,例如:
chkconfig --level 345 apach off #重启服务器后生效,关闭 apach 服务
为了系统能够正常运行,建议启动如下表中的服务:
服务名称 | 服务内容 |
---|---|
acpid | 用于电源管理,建议开启 |
apmd | 高级电源管理,可监控电池性能 |
kudzu | 检测硬件是否发生变化 |
crond | 定时任务 |
atd | 一次性的定时任务 |
keytables | 用于装载镜像键盘,可选择启动 |
iptables | 防火墙,必须启动 |
xinetd | 支持网络服务的核心守护进程 |
xfs | 使用 X Window 桌面系统必须启动 |
network | 启动网络服务,必须启动 |
sshd | 提供 ssh 远程管理 |
syslog | 记录系统日志服务,必须启动 |
3. 合理使用 sudo 命令
sudo
命令可以分配给普通用户一些合理的权限,让普通用户可以执行一些 root 用户执行的权限,比如重启系统,添加用户,配置系统文件等,正因如此,我们应合理使用sudo
命令,并对sudo
要进行授权。要对sudo
进行授权需要用到/etc/sudoers
文件,在文件中添加相关配置参数即可。
例如:
#例 1 普通用户 Bob 只能在 Server1 这台主机上执行 reboot,shutdown 命令
Bob Server1=/usr/sbin/reboot,/usr/sbin/shutdown
#例 2 普通用户 Bob 能在 任何主机上执行 reboot,shutdown 命令
Bob ALL=/usr/sbin/reboot,/usr/sbin/shutdown
#例 2 Bob 可以在任何主机上执行所有命令,且不需要密码登录,还能切到root用户下(sudo su-)
Bob ALL=(ALL) NOPASSWD: ALL
#Bob 可以在任何主机上提权到 root 下执行chown 命令,不用密码,但执行 useradd 要密码
Bob ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
#例 3 user 用户组的用户以 root 权限修改其他用户密码,这里表示组要用百分号%
%users ALL=(root) /usr/bin/passwd
4. 删减系统登录信息
系统中有 4 个文件,/etc/issue
、/etc/issue.net
、/etc/redhat-release
和/etc/motd
,它们都记录了系统的版本号相关的一些信息,我们可以通过删除或更改来保证系统版本信息安全.
当用户通过本地终端或本地虚拟控制台登录系统时会显示/etc/issue
里的内容,当用户通过 ssh
远程登录系统时,会显示/etc/issue.net
内容,默认情况issue.net
不会显示,如果要显示可以在/etc/ssh/sshd_config
文件中加入以下代码:
Banner /etc/issue.net
/etc/redhat-release
文件同样记录了系统名称及版本号,建议删除。
/etc/motd
文件是系统公告信息,用户每次登录后,/etc/motd
文件内容就会显示,利用这个文件可以发布一些有关软件,硬件升级信息以及系统维护信息。
5. ssh远程登录安全
有关 ssh
对应的配置文件是/etc/ssh/sshd_config
,下面介绍几个有关安全方面的配置。
- Port 22 :用来设置监听端口,为了安全,我们通常会更改默认 22 端口
- Protocol 2 :设置使用版本为 SSH2,因为 SSH1 版本有缺陷,这里用Protocol 2
- KeyRegenerationInterval 1h :如果使用密钥登录,此设置为多久后自动生成密钥防止盗用
- PermitRootLogin no :设置 root 用户不能 ssh 登录,root 远程登录是很危险的
- PrintMotd yes :用来设置显示
/etc/motd
内信息 - MaxStartups 5 :同时允许 5 个尚未登入的联机,连上 ssh 但未输入密码属于联机
- MaxAuthTries 3 :允许最大登录失败重试的次数为 3 次
- AllowUsers <用户名> :指定通过远程访问的用户,多个用户用空格分开
- AllowGroups<组名> :指定通过远程访问的用户组,多用户组用空格分开
- DenyUsers<用户名> :指定禁止访问的用户,多个用户用空格分开
- DenyGroups<用户组> :指定禁止访问的用户组,多个用户组用空格分开
6. 合理利用 history
通过history
命令我们可以查看用户的历史操作,shell 命令操作记录保存在.hash_history
文件中,但黑客攻击服务器后会将此文件删除,导致无法进行审计,因此,我们需要合理保护备份该文件,下面为history
日志文件的安全配置方法。
默认 history
命令只能查看操作记录,并未记录操作时间,因此需要编辑/etc/bashrc
文件:
HISTFILESIZE=4000 #定义在.bash_history文件保留命令的记录总数
HISTSIZE=4000 #定义 history 命令输出的记录总数
HISTTIMEFORMAT='%F %T' #定义时间格式,与命令 date +%F %T 输出一样
export HISTTIMEFORMAT
为防止黑客删除.bash_history
文件,我们可以将用户的历史记录保存在一个安全的地方,以供系统审计,将以下代码加到/etc/profile
文件中,当用户登录时可实现此功能。
USER_IP=`who am i 2>/dev/null |awk -F"[()]" '{print $2}'`
HISTDIR=/usr/share/.history
if [ -z $USER_IP ]
then
USER_IP=`hostname`
fi
if [ ! -d $HISTDIR ]
then
mkdir -p $HISTDIR
chmod 777 $HISTDIR
fi
if [ ! -d $HISTDIR/$LOGNAME ]
then
mkdir -p $HISTDIR/$LOGNAME
fi
export HISTSIZE=4000
DT=`date +%Y%m%d_%H%M`
export HISTFILE="$HISTDIR/$LOGNAME/$USER_IP.history.$DT"
export HISTFORMAT=“[%Y.%m.%d %H:%M:%S]”
chmod 600 $HISTDIR/$LOGNAME/*.history* 2>/dev/null
此代码将每个用户的 shell 命令历史保存在/usr/share/.history
目录中,每个用户一个文件夹,并且文件夹记录着登录 IP以及shell操作时间。
7. 防火墙
Linux 本身有 2 道防火墙,通过 IP 过滤机制的iptables
实现第一层防护,iptables
通过监视系统运行状况,阻挡网络中的一些恶意攻击,保护系统。通过第一层防护后就是tcp_wrappers
防护层了,tcp_wrappers
可以实现对系统中提供某些服务的开放或关闭,从而保护系统。
7.1 iptables
7.1.1 iptables 概述
默认iptables
规则表有:
- fileter 表(过滤规则表)
- nat 表(地址转换规则表)
- mangle 表(修改数据标记位规则表)
- raw 表(跟踪数据表规则表)
每个规则表中包含多个数据链:
- INPUT (入站数据过滤)
- OUTPUT(出站数据过滤)
- FORWARD (转发数据过滤)
- PREROUTING (路由前过滤)
- POSTROUTING (路由后过滤)
防火规则需要用到这些具体的数据链。
下面是关于防火墙过滤的框架:
- 如果外部主机发送数据给防火墙,数据会经过
PREROUTING
和INPUT
数据链 - 如果防火墙主机发数据到外部主机,数据会经过
OUTPUT
和POSTROUTING
数据链 - 如果防火墙作为路由负责转发,数据会经过
FORWARD
和POSTROUTING
数据链
7.1.2 iptables 语法
用法:iptables [-t 表名] {-A | -D | -I | -F | -L | -Z | -P} 链名 rule-specification
选项 | 解释 |
---|---|
-t | 指定规则表,不加-t 默认使用 fileter 表 |
-A | 追加防火墙规则 |
-D | 删除防火墙规则 |
-I | 插入防火墙规则 |
-F | 清空防火墙规则 |
-L | 列出防火墙规则 |
-R | 替换防火墙规则 |
-Z | 清空防火墙数据表统计信息 |
-P | 设置链默认规则 |
匹配参数如下:
参数 | 解释 |
---|---|
[!] -p | 匹配协议,!表示取反 |
[!] -s | 匹配源地址 |
[!] -d | 匹配目标地址 |
[!] -i | 匹配如站网卡接口 |
[!] -o | 匹配出站网卡接口 |
[!] --sport | 匹配源端口 |
[!] --dport | 匹配目标端口 |
[!] --src-range | 匹配源地址范围 |
[!] --dst-range | 匹配目标地址范围 |
[!] --Mac-source | 匹配 mac 地址 |
[!] --state | 匹配状态(INVALID、ESTABLISHED、NEW、RELATED) |
触发动作如下:
动作 | 解释 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 丢弃数据包 |
REJECT | 拒绝数据包通过 |
LOG | 将数据包信息记录 syslog 日志 |
DNAT | 目标地址转换 |
SNAT | 源地址转换 |
iptables
具体使用示例如下:
#查看fileter表的所有规则
iptables -nL
#查看 nat 表所有规则
iptables -t nat -nL
#清空 fileter 表中所有规则
iptables -F
#往 fileter 表中添加新规则,丢弃 192.168.1.1 发来的数据包
iptables -A INPUT -s 192.168.1.1 -j DROP
#往 fileter 表中插入规则,拒绝 192.168.1.1ping 防火墙本机
iptables -A INPUT -s 192.168.1.1 -p icmp -j REJECT
#查看 fileter 表中规则编号
iptables -nL --line-number
#删除 filter 表中INPUt 链第一条规则
iptables -D INPUT 1
#将 192.168.1.1 主机发给防火墙本机 22端口的数据包信息记录到 messages 日志
iptables -I INPUT -s 192.168.1.1 -p tcp --dport 22 -j LOG
在 Linux 系统中我们可以在/etc/services
文件中找到各个服务与对应的标准端口号。
防火墙规则默认保存在/etc/sysconfig/iptables
文件下。
7.2 tcp_wrappers
Linux中某个服务是否可以使用 tcp_wrappers
防火墙,取决于服务是否应用了 libwrapped 库文件,如果应用则可以使用。系统中一些服务默认可以使用的有:sshd、vsftpd、tcpd、xinetd、sendmail 等。
tcp_wrapper
防火墙的实现是通过/etc/hosts.allow
和/etc/hosts.deny
两个文件完成的,使用格式如下:
service:host [:action]
参数含义:
- service:服务名,如 sshd、vsftpd 等
- host:主机名或 IP 地址,可以是多个
- action:复合条件采取的动作
配置文件常用关键字:
- ALL:所有服务或所有 IP
- ALL EXCEPT:所有服务或 IP 除了这项指定的
例:
ALL:ALL EXCEPT 192.168.1.1 #除了 192.168.1.1 其余主机可以使用所有服务
针对/etc/hosts.allow
和/etc/hosts.deny
两个文件,Linux 会先判断/etc/hosts.allow
后判断/etc/hosts.deny
,前者满足则不会在去判断后者。如果想要sshd
服务只能在某些主机使用则可以用以下配置:
#etc/hosts.allow文件中写入
sshd: 172.20.190.51
sshd: 172.20.190.52
sshd: www.pdca.net
#/etc/hosts.deny文件写入
sshd: ALL
8. 锁定系统重要文件
Linux 系统中通过chattr
命令可以修改文件或目录的属性,此文件要 root 用户执行,从而提高安全性,通过lsattr
命令可以查看文件的属性,下面是对这两个命令的详解。
chattr
命令格式如下:
chattr [-RV] [-v version] [mode] 文件或目录
主要参数解释:
- -R:递归修改所有文件及其子目录
- -V:详细显示修改内容,打印输出
以下是chattr
命令常用参数,用来控制文件属性
参数 | 解释 |
---|---|
+ | 在原有参数基础上追加参数 |
- | 在原有参数基础上移除参数 |
= | 更新为指定参数 |
a | 设定此参数,只能向文件中添加数据,而不能删除,常用于服务器日志文件安全 |
c | 即 compress,设定文件是否压缩后存储,读取时需要经过自动解压操作 |
i | 即 immutable,设定文件不能修改,删除,重命名,设连接 |
s | 安全的删除文件或目录,即删除后的文件后,收回硬盘空间 |
u | 与 s 相反,删除后的文件系统保留其数据块以便以后恢复 |
这些参数中经常用到a
,i
,其中 i
参数不允许任何用户进行操作,即使 root 也不行。
以下是lsattr
命令格式:
lsattr [-adlRvV] 文件或目录
常用参数解释:
参数 | 解释 |
---|---|
-a | 列出目录所有文件,包括隐藏文件 |
-d | 显示指定目录属性 |
-R | 递归显示目录及其下面文件和子目录的属性值 |
-v | 显示文件目录版本 |
对于一些重要的目录和文件可以加上i
,a
属性,例如:
chattr -R -i /bin /boot /lib /sbin
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/hosts
chattr +i /etc/resolv.conf
chattr +i /etc/fstab
chattr +i /etc/sudoers
chattr +a /var/log/messages
9. /tmp、/var/tmp、/dev/shm 安全设定
一些攻击者会利用/tmp
、/var/tmp
目录植入木马,由于此目录会影响系统上一些程序的正常运行,我们不能修改目录的读写执行权限,/dev/shm
是一个共享内存设备,如果黑客通过此文件直接操作系统内存后果不堪设想。
对于/tmp
是一个独立的磁盘分区时,我们可以修改/etc/fstab
文件中/tmp
分区的挂载属性,加上nosuid
、noexec
、nodev
三个选项,修改如下:
LABLE=/tmp /tmp ext4 rw,nosuid,noexec,nodev 0 0
其中nosuid
、noexec
、nodev
选项表示不允许任何 suid 程序,在这个分区也不能执行任何脚本程序,以及不存在设备文件。
设置属性完成后,重新挂载该分区生效。
10. 服务器遭受攻击后处理思路
- 切断网络
- 查找攻击源
通过分析系统日志和登录日志文件,查看可疑信息,同时查看端口打开情况,进程运行情况,分析可疑程序。 - 分析入侵原因和途径
分析此次入侵是系统漏洞还是程序漏洞查清攻击途径,找到攻击源 - 备份用户数据
服务器遭受攻击后,需要立刻在服务器备份用户数据,同时查看这些数据中有没有攻击源,如果有要彻底删除。 - 重装系统
重装系统才是彻底清除攻击源的不错办法