0x00 前言


在linux服务器随处可见的网络环境中,网络运维人员保障Linux安全就成了必要条件。当然现在有很多的硬件防火墙以及WAF,但是那不是小资企业可以hold住的,本文从软件以及服务配置方面简单总结Linux安全防护。

0x01 使用软件级别安全防护


1、使用SELinux

SELinux是用来对Linux进行安全加固的,它可以让你指定谁可以增加文件,谁只可以删除文件,或者谁还可以移动文件,从文件的层次上来说,它相当于一个ACL;

配置文件:/etc/selinux/config (centos7系统)

状态:getenforce 与 setenforce命令可以修改

disabled:关闭策略

permissive:启用SELinux但是即使违反了策略它也会让你继续操作;仅仅一个记录功能

enforcing:启用SELinux,违反策略时阻止你的操作

查看文件标签:ls -Z

小议Linux安全防护(一)

在文件所属组的后面就是我们文件的标签,它表示SELinux对这个文件的策略

修改策略:chcon与semanage

小议Linux安全防护(一)

恢复文件标签:restorecon

常见场景分析:

当我们需要配置一个Web目录时,如果Web目录不是默认的目录,访问可能出现403

这个时候,我们需要将我们的Web目录的标签修改为httpd_sys_content_t

小议Linux安全防护(一)

2、使用iptables

Iptables是一个应用框架,它允许用户为自己系统建立一个强大的防火墙。它是用来设置、维护和检查Linux内核中IP包过滤规则的。

配置文件:/etc/sysconfig/iptables-config (centos7系统)

这里贴出一个在博客园的关于iptables的使用:
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html

3、使用firewall

在centos7中,防火墙具备很强的软件防护功能,在默认程度上:

小议Linux安全防护(一)

默认开启了dhcpv6客户端以及ssh防火墙功能;

防火墙具备很多功能,同时他具备图形界面与命令行界面两种模式,对于基本的防火墙配置,个人推荐使用命令行模式,当我们需要配置一些负责的规则策略时,就可以使用我们的图形界面:

小议Linux安全防护(一)

4、使用入侵检测系统

IDS:入侵检测系统,在linux中有针对它的开源的入侵检测系统:Snort;

0x02 安全配置服务


1、SSH访问控制

尽可能的取消telnet登录,采用ssh进行登录;

ssh配置文件:/etc/ssh/sshd_config

修改默认端口:Port 10512

不允许使用空密码:PermitEmptyPasswords no

不允许root用户登录:PermitRootLogin no

不允许输入密码登录:PasswordAuthentication no (可以很好的防止爆破,但是如果密钥文件泄漏则会出现安全问题,当然可以通过其他方式来进行防御)

重新生成密钥:KeyRegenerationInterval 1h (如果我们使用密钥进行登陆,可以设置多少时间后密钥重新生成)

密钥加密方式:RSAAuthentication yes (是否使用RSA进行加密)

2、禁用不必要的服务及用户

在我们的Linux系统中有很多用户不需要的服务和应用,然而这些服务还是会运行,这样会导致攻击者利用这些服务的漏洞来进行攻击,最好的办法就是停止这些服务。

比如我们的Linux服务器只是一台Web服务器,那么就不需要ftp、smtp等服务我们就可以关闭;当然我们也可以让服务不允许通过防火墙,这样通过防火墙来保护我们的服务器也可以。

任务 旧指令 新指令
使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service
使某服务不自动启动 chkconfig --level 3 httpd off systemctl disable httpd.service
检查服务状态 service httpd status systemctl status httpd.service(服务详细信息) systemctl is-active httpd.service(仅显示是否 Active)
显示所有已启动的服务 chkconfig --list systemctl list-units --type=service
启动某服务 service httpd start systemctl start httpd.service
停止某服务 service httpd stop systemctl stop httpd.service
重启某服务 service httpd restart systemctl restart httpd.service

在linux系统中,系统运行所必须的服务

服务名称 说明
acpid 用于电源管理,对于笔记本和台式电脑很重要
apmd 高级电源能源管理服务,可用于监控电脑
kudzu 检测硬件是否变化的服务
crond 为Linux下自动安排的进程提供运行服务
iptables/firewall Linux内置的防火墙
xinetd 支持多种网络服务的核心守护进程
syslog 记录系统的日志服务
network 网络服务,要用网必须启动这个服务

同时,一台新的Linux操作系统中有很多我们用不到的角色用户,我们同样可以删除这些用户,或者将这些用户设置为不能登录系统;

小议Linux安全防护(一)

可被删除的用户:adm、lp、sync、shutdown、halt、operator、games

userdel adm

groupdel adm

小议Linux安全防护(一)

可被删除的用户组:adm、lp、games、dip等;

当然具体的需要还是要根据用户的选择,同时我们也可以修改用户的bash文件禁止用户登录系统也是防护方式的一种。

 #!bash
 usermod -s /sbin/nologin username

3、使用全盘加密

加密的数据更难被窃取,在安装Linux系统的时候我们可以对整个系统进行加密,采用这种方式,即使有人进入了我们的系统,也不能得到我们的数据;

4、Web应用配置

提供Web服务时,需要更新我们组件的补丁,防止利用已知漏洞来进行攻击;

严格限制权限,防止得到Web Shell以后直接得到系统权限;

限制Web用户只能访问Web目录,不能访问其他目录;

严格控制提供上传点的文件类型

等等

5、系统安全

使用su 与 sudo命令时:

su:切换用户

sudo:提升权限,所以sudo是su的特定一种形态

这里是指定可以使用su命令的用户

小议Linux安全防护(一)

注意红色圈起来的一行,就是启用pam_shell认证,这个时候没有加入wheel的用户就不能使用su命令了!

小议Linux安全防护(一)

对于sudo的一些配置vim /etc/sudoers在centos7中,如果你不想修改原来的配置文件,你可以将这一行includedir /etc/sudoers.d的注释去掉,然后在/etc/sudoers.d/目录下写我们的配置文件

小议Linux安全防护(一)

删除提示信息

在linux的4个文件中存在提示系统的一些信息:

/etc/issue,/etc/issue.net:这两个文件记录了操作系统的名称及版本号,用户通过本地终端就会显示/etc/issue文件中内容,通过ssh或telnet登录就会显示/etc/issue.net的文件内容;

/etc/redhat-release:这个文件也记录了操作系统名称和版本号;

/etc/motd:这个文件是系统的公告信息,每次用户登录后就会显示在终端上;


0x00 文件安全


文件的s、t、i、a权限

首先说一下关于文件的命令:ls more cat less head touch rm rmdir cd mkdir等等 对于一些文件我们希望它只有特定的用户可以访问,其他用户不可以访问,或者一个文件只能拥有着可以操作其他用户就不能操作这个时候我们应该怎么办?在linux系统中,对于文件和文件夹有一个s、t、i、a的权限,可以帮助我们做到这些;

小议Linux安全防护(二)

例如这里的passwd命令,它的拥有者有一个s的权限,这个权限是什么意思呢!它代表普通用户在执行passwd这个命令时暂时拥有这个文件本身所属用户的权限。

小议Linux安全防护(二)

我这里解释一下SUID 与 SGID

SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。这是因为shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。当然,SUID对目录是无效的。这点要特别注意。

SGID进一步而言,如果s的权限是在用户组,那么就是Set GID,简称为SGID。

文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组(effective group)将会变成该程序的用户组所有者(group id)。

目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。

上面介绍了关于s与t权限的一些东西,这里再说一下a与i权限,在linux中还有chattr这个命令,与他对应的还有一个lsattr命令

chattr这个命令常用于锁定文件的

chattr:

参数 说明
-a 只能向文件中添加数据,不能删除,修改
-i 设定文件不能被删除,修改,重命名
-c 设定文件是否经过压缩再存储,读取时需要经过解压缩
-s 安全地删除文件或目录,文件删除后全部收回硬盘空间(不可恢复)
-u 与-s参数相反,系统会保留数据块,以便方便回收

所以作为一个网络安全运维人员,我们必须对文件进行严格的配置,这里只是一些针对文件本身是安全设置,不同的文件具有不同的读写执行等权限,接下来我们就针对不同用户对不同文件的读写执行来做一个描述;

文件的ACL

针对文件以及文件夹我们在新建的时候,通常会有一个默认的权限:

小议Linux安全防护(二)

我们会发现文件夹是755,而我们的文件是644,这是为什么呢,原因就是在linux中默认的umask权限,这个umask一般在我们的/etc/profile

小议Linux安全防护(二)

umask值:022代表什么意思呢,umask其实是权限的补码,就是在777权限上减去的值,所以我们文件夹的权限是7-0/7-2/7-2=755,那为什么我们文件的是644呢,因为创建文件的时候还需要减去一个默认的执行权限1,所以文件的权限就是7-1/7-3/7-3=644

平时我们修改文件权限的常用命令有这些:chmod、chown、chattr等,但是对于文件还有一个ACL(访问控制列表)机制,下面就以Centos7中来介绍一下文件的访问控制,对于ACL常见的命令有3个:setfacl、getfacl、chacl

小议Linux安全防护(二)

通过上图我们可以发现对文件的描述是一样的,文件名、拥有着、所属组、以及他们对应的权限;对于getfacl获取文件的权限没有什么可说的,这里详细说一下对文件权限的设置:

首先是参数:

<pre class="prettyprint linenums prettyprinted" style="">

  1. #!bash
  2. setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...

  3. -b:删除所有的acl参数
  4. -k:删除预设的acl参数
  5. -n:不重新判断是否有效
  6. -d:设置预设的acl参数(只针对目录,在目录中的新建文件同样使用此acl)
  7. -R: 递归设置后面的acl参数
  8. -x:删除后面指定的acl参数
  9. -m:设置后面指定的acl参数

</pre>

针对acl参数:

<pre class="prettyprint linenums prettyprinted" style="">

  1. #!bash
  2. [u/g/o]:[username/groupname/空]:[rwx] filename

</pre>

下面看实例:

小议Linux安全防护(二)

我们再设置一个对其他用户完全没有权限的acl

小议Linux安全防护(二)

这里再添加一个可以读可执行却没有写权限的用户acl,

小议Linux安全防护(二)

这就是文件访问控制的魅力,你希望这个文件对那些用户有什么权限都可以通过这样来进行设置;

文件的共享

提供文件共享的服务Samba、NFS、Ftp等等,这些都可以作为Linux中文件的共享功能;提供服务时需要注意目录的权限控制,这里我们将一下Linux中与cp命令相对应的一个命令scp,它可以远程来传输文件,并且基于ssh登录是一个安全的文件传输通道;常常用于我们的两台服务器之间的文件传输,比如我们的备份日志(通过crontab来实现)

小议Linux安全防护(二)

传一个文件到我们的远程服务器上面:

小议Linux安全防护(二)

从远程服务器上面获取一个文件:

小议Linux安全防护(二)

如果我们不想在每次获取文件或者传输文件的时候输入密码,我们可以使用ssh建立密钥认证来进行传输,一般在我们备份日志文件中也是通过这样的方式来进行备份;

小议Linux安全防护(二)

制定一个定时任务crontab -e每2分钟向服务器发送一个test.txt的文件

小议Linux安全防护(二)

我们这么做的目的或者说这么做了对服务器有什么安全性嘛,其实scp命令就是一个通过ssh的传输功能,我们可以在ssh结合firewall做一些限制,比如只允许哪些IP或IP段访问我们的服务器,这样我们就可以控制哪些可信的pc或服务器访问;

同时我们也可以通过SSH定时更新我们的密钥文件来防止我们的密钥文件泄漏;

这么做比我们使用ftp、samba等来传输文件更加安全可靠;

命令记录功能

在Linux系统中,有一个很重要的命令可以帮助我们曾经使用过的命令记录,但是也许有的时候我们并不需要这个功能,或者某些用户需要某些用户不需要,这个时候我们可以都配置文件进行配置:

配置文件:/etc/bashrc

在里面加入这4行

 #!bash
 HISTFILESIZE=1000 #保存命令的记录总数
 HISTSIZE=1000 #history命令输出的命令总数
 HISTTIMEFORMAT='%F %T' #定义时间显示格式
 export HISTTIMEFORMAT #载入

 HISTFILE=/root/test #里面命令保存目录
 export HISTFILE #载入,重新登陆用户生效
 export HISTCONTROL #忽略重复的命令
 export HISTIGNORE="[ ]*:&amp;:bg:fg:exit" #忽略冒号分割这些命令

我们如果不想使用保存命令将记录总数设置为0就可以了;

这里提供一个“高性能构建Linux服务器”中提到的一个使用history记录用户的操作,在/etc/profile文件中添加如下代码:

#!bash
#history
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'` #这句话就是先获取用户及IP信息,将标准错误输出到黑洞当中,然后使用awk命令获取最后一组参数,再通过sed将()替换掉;
HISTDIR=/usr/share/.history
#判断IP
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}
chmod 300 $HISTDIR/${LOGNAME}
fi
export HISTSIZE=4000
DT=`date +%Y%m%d_%H%M%S`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null

小议Linux安全防护(二)

如果我们是想给不同的用户设置history配置,我们就可以在相对应的账户家目录中的.bash_profile文件中进行编辑,然后重新登录系统就修改成功;

当然在Linux系统中其实还有一个命令可以帮助我们记录我们所操作过的命令:script

小议Linux安全防护(二)

小议Linux安全防护(二)

script这个命令不但可以记录我们执行的命令,还可以记录我们执行命令后的返回结果,但是随着命令的执行这个文件会越来越大,所以这个命令使用的很少;

0x01 用户密码安全


密码策略

在禁用不必要的服务及用户中,我们已经说过关于删除一些无用的用户(http://drops.wooyun.org/tips/11801),但是linux作为一个多用户的系统,我们还是不可避免的会去新增很多用户,我们不能保证每一个用户具有很好的安全意识,所以只能在用户的密码以及用户的远程访问上做一些限制,我们先介绍Linux用户密码策略;

关于密码策略,我这里只从简单的配置文件说,对于Centos系列中使用pam认证机制不是本文的讨论范围;

配置文件:vim /etc/login.defs

#!bash
MAIL_DIR        /var/spool/mail         #邮件目录

PASS_MAX_DAYS   99999                   #密码过期最大时间,99999代表永久有效
PASS_MIN_DAYS   0                       #是否可修改密码,0代表可修改,非0代表多少天后修改
PASS_MIN_LEN    5                       #密码最小长度,使用pam_creacklib module,这个参数不生效
PASS_WARN_AGE   7                       #密码失效前多少天在用户登录时通知用户修改密码

UID_MIN                  1000           #UID的最小值
UID_MAX                 60000           #UID的最大值
SYS_UID_MIN               201           #系统UID的最小值
SYS_UID_MAX               999           #系统UID的最大值

GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999

CREATE_HOME     yes                     #是否创建家目录

UMASK           077                     #umask的值

USERGROUPS_ENAB yes                     #当值为yes,没有-g参数自动创建名称和用户名相同的组

ENCRYPT_METHOD SHA512                   #加密方式

这个就是我们的用户密码策略,我们可以通过修改配置文件来对用户密码策略进行修改,也可以通过命令来进行修改:chage

chage:

参数 说明
-m 密码可更改的最小天数,为0代表任何时候都可以修改
-M 密码保持有效的最大天数
-w 用户密码到期前,提前受到警告信息的天数
-E 账号到期的日期,超过这个时间,账号就不能使用
-d 上一次更改的日期
-i 停滞时间,如果密码已过期多少天,账号不能使用
-l 列出当前设置

原文地址