在linux服务器随处可见的网络环境中,网络运维人员保障Linux安全就成了必要条件。固然如今有不少的硬件防火墙以及WAF,可是那不是小资企业能够hold住的,本文从软件以及服务配置方面简单总结Linux安全防御。html
SELinux是用来对Linux进行安全加固的,它可让你指定谁能够增长文件,谁只能够删除文件,或者谁还能够移动文件,从文件的层次上来讲,它至关于一个ACL;linux
配置文件:/etc/selinux/config (centos7系统)shell
状态:getenforce 与 setenforce命令能够修改vim
disabled:关闭策略centos
permissive:启用SELinux可是即便违反了策略它也会让你继续操做;仅仅一个记录功能安全
enforcing:启用SELinux,违反策略时阻止你的操做bash
查看文件标签:ls -Z服务器
在文件所属组的后面就是咱们文件的标签,它表示SELinux对这个文件的策略网络
修改策略:chcon与semanage框架
恢复文件标签:restorecon
常见场景分析:
当咱们须要配置一个Web目录时,若是Web目录不是默认的目录,访问可能出现403
这个时候,咱们须要将咱们的Web目录的标签修改成httpd_sys_content_t
Iptables是一个应用框架,它容许用户为本身系统创建一个强大的防火墙。它是用来设置、维护和检查Linux内核中IP包过滤规则的。
配置文件:/etc/sysconfig/iptables-config (centos7系统)
这里贴出一个在博客园的关于iptables的使用:
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
在centos7中,防火墙具有很强的软件防御功能,在默认程度上:
默认开启了dhcpv6客户端以及ssh防火墙功能;
防火墙具有不少功能,同时他具有图形界面与命令行界面两种模式,对于基本的防火墙配置,我的推荐使用命令行模式,当咱们须要配置一些负责的规则策略时,就可使用咱们的图形界面:
IDS:***检测系统,在linux中有针对它的开源的***检测系统:Snort;
尽量的取消telnet登陆,采用ssh进行登陆;
ssh配置文件:/etc/ssh/sshd_config
修改默认端口:Port 10512
不容许使用空密码:PermitEmptyPasswords no
不容许root用户登陆:PermitRootLogin no
不容许输入密码登陆:PasswordAuthentication no (能够很好的防止爆破,可是若是密钥文件泄漏则会出现安全问题,固然能够经过其余方式来进行防护)
从新生成密钥:KeyRegenerationInterval 1h (若是咱们使用密钥进行登录,能够设置多少时间后密钥从新生成)
密钥加密方式:RSAAuthentication yes (是否使用RSA进行加密)
在咱们的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操做系统中有不少咱们用不到的角色用户,咱们一样能够删除这些用户,或者将这些用户设置为不能登陆系统;
可被删除的用户:adm、lp、sync、shutdown、halt、operator、games
userdel adm
groupdel adm
可被删除的用户组:adm、lp、games、dip等;
固然具体的须要仍是要根据用户的选择,同时咱们也能够修改用户的bash文件禁止用户登陆系统也是防御方式的一种。
#!bash usermod -s /sbin/nologin username
加密的数据更难被窃取,在安装Linux系统的时候咱们能够对整个系统进行加密,采用这种方式,即便有人进入了咱们的系统,也不能获得咱们的数据;
提供Web服务时,须要更新咱们组件的补丁,防止利用已知漏洞来进行***;
严格限制权限,防止获得Web Shell之后直接获得系统权限;
限制Web用户只能访问Web目录,不能访问其余目录;
严格控制提供上传点的文件类型
等等
使用su 与 sudo命令时:
su:切换用户
sudo:提高权限,因此sudo是su的特定一种形态
这里是指定可使用su命令的用户
注意红色圈起来的一行,就是启用pam_shell认证,这个时候没有加入wheel的用户就不能使用su命令了!
对于sudo的一些配置vim /etc/sudoers在centos7中,若是你不想修改原来的配置文件,你能够将这一行includedir /etc/sudoers.d的注释去掉,而后在/etc/sudoers.d/目录下写咱们的配置文件
删除提示信息
在linux的4个文件中存在提示系统的一些信息:
/etc/issue,/etc/issue.net:这两个文件记录了操做系统的名称及版本号,用户经过本地终端就会显示/etc/issue文件中内容,经过ssh或telnet登陆就会显示/etc/issue.net的文件内容;
/etc/redhat-release:这个文件也记录了操做系统名称和版本号;
/etc/motd:这个文件是系统的公告信息,每次用户登陆后就会显示在终端上;
首先说一下关于文件的命令:ls more cat less head touch rm rmdir cd mkdir等等 对于一些文件咱们但愿它只有特定的用户能够访问,其余用户不能够访问,或者一个文件只能拥有着能够操做其余用户就不能操做这个时候咱们应该怎么办?在linux系统中,对于文件和文件夹有一个s、t、i、a的权限,能够帮助咱们作到这些;
例如这里的passwd命令,它的拥有者有一个s的权限,这个权限是什么意思呢!它表明普通用户在执行passwd这个命令时暂时拥有这个文件自己所属用户的权限。
我这里解释一下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参数相反,系统会保留数据块,以便方便回收 |
因此做为一个网络安全运维人员,咱们必须对文件进行严格的配置,这里只是一些针对文件自己是安全设置,不一样的文件具备不一样的读写执行等权限,接下来咱们就针对不一样用户对不一样文件的读写执行来作一个描述;
针对文件以及文件夹咱们在新建的时候,一般会有一个默认的权限:
咱们会发现文件夹是755,而咱们的文件是644,这是为何呢,缘由就是在linux中默认的umask权限,这个umask通常在咱们的/etc/profile
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
经过上图咱们能够发现对文件的描述是同样的,文件名、拥有着、所属组、以及他们对应的权限;对于getfacl获取文件的权限没有什么可说的,这里详细说一下对文件权限的设置:
首先是参数:
<pre class="prettyprint linenums prettyprinted" style="">
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
</pre>
针对acl参数:
<pre class="prettyprint linenums prettyprinted" style="">
</pre>
下面看实例:
咱们再设置一个对其余用户彻底没有权限的acl
这里再添加一个能够读可执行却没有写权限的用户acl,
这就是文件访问控制的魅力,你但愿这个文件对那些用户有什么权限均可以经过这样来进行设置;
提供文件共享的服务Samba、NFS、Ftp等等,这些均可以做为Linux中文件的共享功能;提供服务时须要注意目录的权限控制,这里咱们将一下Linux中与cp命令相对应的一个命令scp,它能够远程来传输文件,而且基于ssh登陆是一个安全的文件传输通道;经常用于咱们的两台服务器之间的文件传输,好比咱们的备份日志(经过crontab来实现)
传一个文件到咱们的远程服务器上面:
从远程服务器上面获取一个文件:
若是咱们不想在每次获取文件或者传输文件的时候输入密码,咱们可使用ssh创建密钥认证来进行传输,通常在咱们备份日志文件中也是经过这样的方式来进行备份;
制定一个定时任务crontab -e每2分钟向服务器发送一个test.txt的文件
咱们这么作的目的或者说这么作了对服务器有什么安全性嘛,其实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="[ ]*:&: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
若是咱们是想给不一样的用户设置history配置,咱们就能够在相对应的帐户家目录中的.bash_profile文件中进行编辑,而后从新登陆系统就修改为功;
固然在Linux系统中其实还有一个命令能够帮助咱们记录咱们所操做过的命令:script
script这个命令不但能够记录咱们执行的命令,还能够记录咱们执行命令后的返回结果,可是随着命令的执行这个文件会愈来愈大,因此这个命令使用的不多;
在禁用没必要要的服务及用户中,咱们已经说过关于删除一些无用的用户(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 | 列出当前设置 |