Linux运维养成记-服务器安全运维

目录

  • 1. 删除特殊用户和用户组
  • 2. 关闭系统不需要的服务
  • 3. 合理使用 sudo 命令
  • 4. 删减系统登录信息
  • 5. ssh远程登录安全
  • 6. 合理利用 history
  • 7. 防火墙
    • 7.1 iptables
      • 7.1.1 iptables 概述
      • 7.1.2 iptables 语法
    • 7.2 tcp_wrappers
  • 8. 锁定系统重要文件
  • 9. /tmp、/var/tmp、/dev/shm 安全设定
  • 10. 服务器遭受攻击后处理思路

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 (路由后过滤)

防火规则需要用到这些具体的数据链。
下面是关于防火墙过滤的框架:
Linux运维养成记-服务器安全运维_第1张图片

  • 如果外部主机发送数据给防火墙,数据会经过 PREROUTINGINPUT数据链
  • 如果防火墙主机发数据到外部主机,数据会经过OUTPUTPOSTROUTING数据链
  • 如果防火墙作为路由负责转发,数据会经过FORWARDPOSTROUTING数据链

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 相反,删除后的文件系统保留其数据块以便以后恢复

这些参数中经常用到ai,其中 i参数不允许任何用户进行操作,即使 root 也不行。
以下是lsattr命令格式:

lsattr [-adlRvV] 文件或目录

常用参数解释:

参数 解释
-a 列出目录所有文件,包括隐藏文件
-d 显示指定目录属性
-R 递归显示目录及其下面文件和子目录的属性值
-v 显示文件目录版本

对于一些重要的目录和文件可以加上ia属性,例如:

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分区的挂载属性,加上nosuidnoexecnodev三个选项,修改如下:

LABLE=/tmp		/tmp		ext4		rw,nosuid,noexec,nodev		0		0

其中nosuidnoexecnodev选项表示不允许任何 suid 程序,在这个分区也不能执行任何脚本程序,以及不存在设备文件。
设置属性完成后,重新挂载该分区生效。

10. 服务器遭受攻击后处理思路

  • 切断网络
  • 查找攻击源
    通过分析系统日志和登录日志文件,查看可疑信息,同时查看端口打开情况,进程运行情况,分析可疑程序。
  • 分析入侵原因和途径
    分析此次入侵是系统漏洞还是程序漏洞查清攻击途径,找到攻击源
  • 备份用户数据
    服务器遭受攻击后,需要立刻在服务器备份用户数据,同时查看这些数据中有没有攻击源,如果有要彻底删除。
  • 重装系统
    重装系统才是彻底清除攻击源的不错办法

你可能感兴趣的:(Linux运维养成记-服务器安全运维)