【Linux学习】安全基线配置检查

Linux服务器安全运维

作为从事安全服务工作人来说,对Linux安全配置必不可少,花了点时间写了本章知识,希望帮到你!

1、删除特殊用户和用户组

Linux在系统安装完后,会默认安装很多不必要的用户和用户组,如果不需要这些用户或用户组,应删除它们,因为账户越多,越不安全。

Linux系统中可删除的默认用户和用户组有:
用户:adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher等
用户组:adm、lp、news、uucp、games、dip、pppusers、slipusers等

userdel adm
groupdel adm

某些用户仅仅用作进程调用或用户组调用,并不需要登录功能,此时可以禁止这些用户登录系统的功能:
usermod -s /sbin/nologin admin

2、关闭系统不需要的服务

在安装完后,Linux绑定了很多没用的服务,这些服务都是默认自启动的。

具体服务需要确定后才能关闭,如下面服务一般是不需要的:
anacron、auditd、autofs、avahi-daemon、bluetooh、cpuspeed、gpm、hidd、ipsec、lpd、netfs、nfs、nscd、rpcgssd、rstatd、sendmail等
关闭服务命令:
chkconfig --level 345 anacron off

常用必须启动的服务:
acpid:用于电源管理
apmd:高级电源管理,监控电池性能
kudzu:检测硬件是否变化的服务
crond:为Linux自动安排的进程提供运行服务
atd:类似crond,在指定时间做指定事情的服务
keytables:用于装载镜像键盘
iptables:内置防火墙软件
xinetd:支持多种网络服务的核心守护进程
xfs:使用X Windows桌面系统必须的服务
network:激活已配置网络接口的脚本程序,也就是启动网络服务
sshd:提供SSH远程连接服务
syslog:记录系统日志的服务

3、合理使用su、sudo命令

su命令是一个切换用户的工具,一般用于普通用户输入root密码进行root权限,但是每个普通用户都需要root密码进行切换这是不安全的,所以sudo命令允许系统管理员分配给普通用户一些合理的权力,并不需要知道管理员密码就能执行一些管理员操作的权限。所以sudo也称为受限制的su。

sudo执行命令的流程是:将当前用户切换到超级用户下,以超级用户身份执行命令,执行后直接退回到当前用户下。
可永固sudo配置文件/etc/sudoers来授权

配置/etc/sudoers:
如:要让普通用户user1可以访问/etc/shadow文件:
user1 ALL = /bin/more /etc/shadow
如:要让普通用户user2具有超级用户权限:
user2 ALL=(ALL) NOPASSWD: ALL

4、删除系统登录banner信息

系统的一些欢迎信息或版本信息可能会被攻击者利用,所以为了安全,可以删除或修改系统默认自带的banner信息

有4个banner信息文件:
/etc/issue:记录系统名称和版本号,当用户通过本地等方式登录就会显示此文件内容
/etc/issue.net:记录系统名称和版本号,当用户通过远程连接方式如telnet登录就会显示此文件内容
/etc/redhat-release:记录系统名称和版本号
/etc/motd:系统的公告信息,每次用户登录后,就会显示此文件内容在用户终端上。

5、禁止Ctrl+Alt+Delete快捷键命令

在Linux默认设置下,Ctrl+Alt+Delete可以将系统重启,需要禁止此命令。

修改/etc/init/control-alt-delete.conf文件:注释此命令
#exec /sbin/shutdown -r now "Control-Alt-Delete pressed"

6、shell历史命令记录配置

在Linux下可通过history命令查看用户所有的历史操作记录,同时shell命令默认保存在用户目录下的.bash_history文件中,但是黑客攻击后,可删除此文件。所以需要保护或备份此文件。

默认的history命令只能查看用户历史操作记录,并不能区分每个用户操作命令的时间。可通过配置/etc/bashrc文件,自动记录所有shell命令的执行时间:

HISTFILESIZE=4000 #定义.bash_history文件保存命令的记录总数,默认是1000
HISTSIZA=4000 #定义了history命令输出的记录总数
HISTTIMEFORMAT='%F %T' #定义了时间显示格式
export HISTTIMEFORMAT #作为时间变量将值传给history命令

这样配置后,执行history命令后,就会显示每条历史命令详细执行时间。

通过配置/etc/profile文件,实现详细记录登录过系统的用户、IP地址、shell命令以及操作时间等,并将这些信息以文件形式保存在一个安全的地方。
添加以下代码到/etc/profile文件:
行尾增加如下内容:

#history
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
HISTDIR=/var/log/.hist
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=4096
DT=`date +%Y%m%d_%H%M%S`
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.hist.$DT"
chmod 600 $HISTDIR/${LOGNAME}/*.hist* 2>/dev/null

7、锁定系统重要文件

可能会遇到root用户都不能修改或删除的某个文件的情况,这种情况大多数是这个文件被锁住了,在Linux系统中,锁定文件命令是chattr,只能由root用户执行(只适合ext文件系统)。

chattr [-RV] [-v version] [mode] 文件或目录
-R:递归修改文件及子文件
-V:显示详细修改内容
mode用来控制文件属性:
+:追加参数
-:移除参数
=:更新为指定参数
a:只能向文件添加数据,不能删除,常用于日志文件
i:设置文件不能被修改、删除、重命名、设定链接等,同时不能写入或新增内容,常用。
eg:
chattr -V +i /tmp/1.txt

lsattr用来查询文件属性的
-a 列出目录中所有文件
-d 显示指定目录的属性
-R 以递归方式列出
eg:
lsattr /tmp/1.txt
可以通过锁定系统重要文件,防止攻击者破坏,对重要目录及文件加上i属性:
chattr -R +i /bin /boot /lib /sbin
chattr -R +i /usr/bin /usr/lib /usr/sbin
chattr +i /etc/passed
chattr +i /etc/shadow
chattr +i /etc/hosts
chattr +i /etc/fstab
......
虽然加上了i属性提高了安全性,但如软件的安装、升级、日志的轮询等时需要去掉有关的i属性才可以正常进行。

8、文件权限检查和修改

不正确的权限设置直接威胁系统安全,因此需要及时发现并处置这些文件。

#查找系统中任何用户都有写权限的文件和目录
查找文件:
find / -type f -perm -2 -o -perm -20 |xargs ls -al
查找文件:
find / -type d -perm -2 -o -perm -20 |xargs -ls

#查找系统中所有含s位的程序,s权限的程序对系统危害较大,防止用户提权的可能性。
find / -type f -perm -4000 -o -perm -2000 -print | xargs ls -al

#查找没有属主的文件:没有属主的孤儿文件比较危险
find / -nouser -o -nogroup

9、/tmp、/var/tmp、/dev/shm安全设定

在Linux系统中,用来存放临时文件主要有两个区域,分别是/tmp和/var/tmp。临时文件所有用户可读可写可执行,这就留下了安全隐患。但是如果修改了临时目录的权限,可能会影响应用程序正常运行,所以需要对这两个目录进行特殊设置。/dev/shm是Linux下的一个共享内存设备,在Linux启动时系统会默认加载/dev/shm,它会把tmpfs内存文件系统存储到RAM中,这样通过/dev/shm就可以直接操控系统内存,非常危险。

/tmp、/var/tmp安全设置:
如果/tmp是一个独立磁盘分区,那么修改/etc/fstab文件中的/tmp分区对应的挂载属性,加上nosuid、noexec、nodev即可(不能执行任何脚本及不存在设备文件)
如果是根目录下的一个目录,那么可以通过创建一个loopback文件系统来利用Linux内核的loopback特性将文件系统挂载到/tmp下,然后在挂载时指定限制加载的选项。
/var/tmp同理

/dev/shm安全配置:
可通过修改/etc/fstab文件来使加载/dev/shm的挂载属性:
tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0
限制/dev/shm的可执行权限,提高系统安全

10、PAM

PAM是由sun提出的一种认证机制(插件式鉴别模块),它通过提供动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得管理员可以灵活地根据需要给不同的服务器配置不同的认证方式而无需更改服务程序,应用程序可以通过PAM API方便地使用PAM提供的各种鉴别方式。

比如FTP服务而言,判断使用者的账号密码是否有效与它无关,FTP只是将这组认证信息传给PAM,PAM会根据/etc/pam.conf的设定值来决定如何认证,接下来的认证过程就交给后端的认证机制模块来做,最后PAM将认证结果成功或失败传给FTP引擎,完成整个认证过程。

PAM是应用程序和鉴别模块之间联系的纽带,当应用程序调用PAM API时,PAM会按照配置文件pam.conf的规定,加载相应的鉴别模块,然后把请求传递给底层的鉴别模块,这时鉴别模块就可以根据要求执行具体的鉴别操作,当鉴别模块执行完相应的操作后,将结果返回给PAM,然后由PAM根据配置完成具体情况,将来自鉴别模块的应答返回给应用程序。

PAM配置文件格式:
每一行包括模块类型、控制字、模块路径、模块参数
如:auth       requisite  pam_nologin.so

模块类型:

  • auth:有关用户认证的方面
  • account:处理非认证级别的账号管理,如限制特定用户
  • session:一系列有关动作,指用户做的事如登录、退出等
  • password:设置密码

控制字:

  • required:返回的成功值对于整个模块类型的的成功是必要的,返回的失败值直到剩下的模块都执行过后才传给用户
  • response:类似required,不过当这类模块返回失败时,整个控制立刻回到应用程序中
  • sufficient:返回的成功值会被认为已充分满足模块类型
  • optional:对最终的成功或失败不会产生决定性影响

模块路径:

模块路径在Red Hat系统中在lib/security目录下,模块路径负责给出PAM模块的存放位置,它通常是一个完整的路径名,模块的文件名和扩展名也包括在内。如/lib/security/pam_unix.so。如果没有给出路径,则PAM默认到/lib/security子目录中查找指定模块。

模块参数:

如果某个模块需要参数,这个字段就是给出参数的地方,无效参数对身份验证过程没有影响,所以在做基线配置时,一定要仔细哦!

PAM常用认证模块:

  • pam_access:提供基于登录用户名、客户IP/主机号、网络号以及登录终端的访问控制
  • pam_chroot:为一般用户提供一个虚根环境
  • pam_cracklib:对用户名密码提供强健性检测,密码复杂度检查等
  • pam_deny:仅返回一个错误,用来拒绝用户访问,通常用来做默认的验证规则
  • pam_env:用来设置任意的环境变量
  • pam_filter:提供对用户和应用程序交互内容的访问控制
  • pam_ftp:提供匿名FTP用户认证机制
  • pam_group:没有提供用户认证,仅仅是授权指定用户组权限
  • pam_issue:在用户登录时,将/etc/issue文件的内容打印出来
  • pam_lastlog:在用户登录时,打印最后登录系统的信息
  • pam_permit:使用该模块有风险,提供允许用户登录
  • pam_warn:记录服务、终端名、用户名、远程主机等信息到日志文件中

现在PAM把它所有的配置信息都保存在/etc/pam.d子目录里,而不是统一集中在/etc/pam.conf文件中

root:# ls /etc/pam.d/
chfn      common-account   common-session                 login     passwd     su    systemd-user
chpasswd  common-auth      common-session-noninteractive  newusers

例1:修改口令配置安全

/etc/pam.d/system-auth文件:

password requisite pam_cracklib.so
模块参数:
minlen=N:密码字符长度不少于N位
difok=N:新密码中至少N个字符与旧密码不同
dcredit=N:至少有N个数字
ucredit=N:至少有N个大写字符
lcredit=N:至少有N个小写字符
ocredit=N:至少有N个其它的字符(特殊符号)
retry=N:配置密码时,提示N次用户密码错误输入

例2:账户锁定机制

pam_tally2与pam_tally模块的区别是前者增加了自动解锁时间的功能,后者没有。
注意!旧版本Linux使用的是pam_tally.so模块,而新版本Linux使用的是pam_tally2.so模块。可通过直接执行pam_tally2命令判断是否安装此模块。

模块参数:
deny=N:失败登录次数超过n次后拒绝访问
lock_time=N:失败登录后锁定的时间(秒数)
unlock_time=N:超出失败登录次数限制后,解锁的时间
magic_root:root用户(uid=0)调用该模块时,计数器不会递增
even_deny_root:root用户失败登录次数超过deny=n次后拒绝访问

/etc/pam.d/system-auth文件:
auth required pam_tally2.so deny=3 unlock_time=5 even_deny_root root_unlock_time=10
#最多连续三次认证登录都出错时,5秒后解锁,root用户也可以被锁定,root用户10秒后解锁

例3:限制su为root的用户

默认情况下,任何用户都允许使用su命令,从而有机会反复尝试其他用户(如root)的登录密码,带来安全风险。为了增强su命令的使用控制,可以借助PAM认证模块,只允许极个别用户使用su命令进行切换

/etc/pam.d/su文件:
auth required pam_wheel.so use_uid
#这样只有管理组wheel中的用户才可以使用su命令

11、umask权限掩码设置

umask可以设置用户创建文件的默认权限,如创建一个文件默认权限是-rw-rw-rw-,明显这样权限设置不安全,那么可通过在/etc/profile文件里设置umask值,那么每个用户登录后都会调用此文件,为用户初始化创建文件的权限。

只有Login shell 启动时才会运行 /etc/profile 这个脚本,所以可以在此文件中加入想要登录就执行的命令

umask采用的是反码形式,和普通权限设置刚好相反。
建议默认用户设置为:
/etc/profile文件:
umask=027
那么创建文件的默认权限就是-rw-r-----

12、openssh安全配置

openssh如今已成为服务器远程连接的标配,自然不可避免的要对此进行安全配置,openssh主要配置文件是/etc/ssh/sshd_config文件。

Port 22  #监听端口号,可以更改为其他端口号
LoginGraceTime 2m #如果用户不能成功登录,在切断连接之前服务器需要等待的时间
PermitRootLogin yes #设置root用户能否使用ssh登录
PrintMotd yes #设置sshd是否在用户登录时显示/etc/motd文件的信息
PasswordAuthentication yes #设置是否允许口令登录
AllowUser #设置允许连接的用户
DenyUser #设置拒绝连接的用户
MaxSessions 10 #指定允许每个网络连接打开的最大会话数,默认为10
MaxStartups 10:30:100 #指定SSH守护进程并发未经身份验证连接的最大数量,默认值是10:30:100,即从第10个连接开始,以30%的概率拒绝新的连接,直到连接数为100。

OpenSSL协议相关安全详解:
SSL介绍:

SSL协议主要功能有两个:加密和解密在网络中传输的数据包,保障这些数据不能被修改和伪造;验证网络对话双方的身份。SSL协议工作在TCP/IP协议和HTTP协议之间,
Openssl介绍:
SSL只是一种安全传输协议,而Openssl则是实现SSL协议的产品,它完全实现了SSLV1、SSLV2、SSLV3、TLS协议的支持,很多软件都用了Openssl的库,如openssh、apache服务器和Linux安全模块等。
Openssl组成:
分为三部分:SSL协议、密码算法库、应用程序

而如心脏出血漏洞就是TLS协议心跳扩展时没有对输入进行验证,导致缓冲区过读,即是可以读取的数据比应该要读取的还多。

13、vsftp安全配置

在访问FTP服务器时提供了三类用户

  • 匿名用户:可以匿名访问FTP服务器,使用账户anonymous或ftp
  • 本地用户:在FTP服务器上拥有账户,其默认的主目录就是其命名的目录,但可以切换目录到其他目录中去。
  • 虚拟用户:这类用户只能访问其主目录下的文件,而不能访问主目录以外的文件,提高安全型。
/etc/vsftp/vsftpd.conf文件安全参数:
anonymous_enable=YES #设置是否允许匿名用户登录
local_enable=YES #设置是否允许本地用户登录
write_enable=YES #设置是否允许用户有写入权限
idle_session_timeout=600 #设置用户会话空闲超过指定时间断开连接,单位为秒
max_clients=100 #允许连接客户端的最大数量,0为不限制最大数量
max_per_ip=5 #设置每个IP地址最大连接数
ftpd_banner=hello ftp #设置欢迎消息,登陆时显示欢迎消息
ftp_username=ftp #设置匿名用户使用的系统用户名

你可能感兴趣的:(WEB安全学习笔记)