Linux服务器安全配置细节


1.概述

对于开放式的操作系统---Linux,系统的安全设定包括系统服务最小化、限制远程存取、隐藏重要资料、修补安全漏洞、采用安全工具以及经常性的安全检查等。

本文主要从用户设置、如何开放服务、系统优化等方面进行系统的安全配置,以到达使Linux服务器更安全、稳定。

2.用户管理

在Linux系统中,用户帐号是用户的身份标志,它由用户名和用户口令组成。

系统将输入的用户名存放在/etc/passwd文件中,而将输入的口令以加密的形式存放在/etc/shadow文件中。

2.1 删除系统特殊的的用户帐号和组帐号: 

1

以上所删除用户为系统默认创建,但是在常用服务器中基本不使用的一些帐号,但是这些帐号常被黑客利用和攻击服务器。 

2

同样,以上删除的是系统安装是默认创建的一些组帐号。这样就减少受攻击的机会。

2.2用户密码设置:

安装linux时默认的密码最小长度是5个字节,但这并不够,要把它设为8个字节。修改最短密码长度需要编辑login.defs文件(vi /etc/login.defs)  ,设置为:

PASS_MAX_DAYS   90        ##密码设置最长有效期
PASS_MIN_DAYS   6            ##密码设置最短有效期
PASS_MIN_LEN    8              ##设置密码最小长度
PASS_WARN_AGE   30      ##提前多少天警告用户密码即将过期

设置用户目录缺省访问权限

vi /etc/login.defs

在文件中设置

UMASK           027

2.3 修改自动注销帐号时间:

自动注销帐号的登录,在Linux系统中root账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户,那将会带来很大的安全隐患,应该让系统会自动注销。通过修改账户中“TMOUT”参数,可以实现此功能。TMOUT按秒计算。编辑你的profile文件(vi /etc/profile),在"HISTSIZE="后面加入下面这行:

export TMOUT=300

300,表示300秒,也就是表示5分钟。这样,如果系统中登陆的用户在5分钟内都没有动作,那么系统会自动注销这个账户。

2.4 给系统的用户名密码存放文件加锁(注意:配置后不能更改密码,一般不配置):  

4

注:chattr是改变文件属性的命令,参数i代表不得任意更动文件或目录,此处的i为不可修改位(immutable)。查看方法:lsattr /etc/passwd

2.5限制Shell命令记录大小

默认情况下,bash shell会在文件$HOME/.bash_history中存放多达500条命令记录(根据具体的系统不同,默认记录条数不同)。系统中每个用户的主目录下都有一个这样的文件。在此笔者强烈建议限制该文件的大小。

您可以编辑/etc/profile文件,修改其中的选项如下:

HISTFILESIZE=5或HISTSIZE=5

#vi /etc/profile

export HISTSIZE=10

export HISTFILESIZE=10

2.6阻止任何人su作为root

如果你不想任何人能够su作为root,你能编辑/etc/pam.d/su加下面的行:

请先把用户添加到wheel组,以使它可以使用su命令成为root用户,
添加方法为:usermod –G wheel xxx

#vi /etc/pam.d/su

auth            sufficient      pam_rootok.so
auth            required        pam_wheel.so    group=wheel

意味着仅仅wheel组的用户可以su作为root.

修改 /etc/sudoers   ,增加一行
xxx      ALL=(ALL)     ALL    <!--新增行-->

2.7 设置密码复杂度策略和锁定多次登陆失败的用户

# vi /etc/pam.d/system-auth

修改:

password    requisite     pam_cracklib.so try_first_pass retry=3 type= ocredit=-1 lcredit=-1 dcredit=-1 ucredit=-1

说明(参数-1为包含):

type:提示为空;ocredit:特殊字符个数;lcredit:小写字母个数;dcredit:数字个数;ucredit:大写字母个数

增加:

centos 5 以下

auth        required      pam_tally.so  deny=5  unlock_time=600

centos 6 以上

auth        required      pam_tally2.so  deny=5  unlock_time=600

说明:

deny  设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户;
unlock_time  设定普通用户锁定后,多少时间后解锁,单位是秒; 

2.8 不允许root直接登陆和ssh认证次数限制

vi /etc/ssh/sshd_config

修改:
PermitRootLogin yes        ##将前面的“#”去掉,短尾“Yes”改为“No”,并保存文件。

MaxAuthTries 5                 ##超过5次验证错误断开连接

vi /etc/pam.d/sshd

centos 5 以下

auth        required      pam_tally.so  deny=5  unlock_time=600

centos 6 以上

auth       required     pam_tally2.so  deny=5  unlock_time=600

3.服务管理

在Linux系统的服务管理方面,如果想做到服务的最好安全,其中主要的就是升级服务本身的软件版本,另外一个就是关闭系统不使用的服务,做到服务最小化。

3.1 关闭系统不使用的服务:  

5

在这里有两个方法,可以关闭init目录下的服务,一、将init目录下的文件名mv成*.old类的文件名,即修改文件名,作用就是在系统启动的时候找不到这个服务的启动文件。二、使用chkconfig系统命令来关闭系统启动等级的服务。

注:在使用以下任何一种方法时,请先检查需要关闭的服务是否是本服务器特别需要启动支持的服务,以防关闭正常使用的服务。

第一种:修改文件名的方法  

6

第二种:使用chkcofig命令来关闭不使用的系统服务  

7

注:以上chkcofig 命令中的3和5是系统启动的类型,3代表系统的多用启动方式,5代表系统的X启动方式。

3.2 给系统服务端口列表文件加锁

主要作用:防止未经许可的删除或添加服务  

8

3.3修改ssh服务的sshd 端口

ssh默认会监听在22端口,你可以修改至6022端口以避过常规的扫描。

注意:修改端口错误可能会导致你下次连不到服务器,可以先同时开着22和6022两个端口,然后再关掉22端口;

重启sshd不会弹掉你当前的连接,可以另外开一个客户端来测试服务;

#vi /etc/ssh/sshd_config

#增加修改

#Port 22 #关闭22端口

Port 6022 #增加6022端口

#重启sshd服务

service sshd restart

5.系统优化

5.1 虚拟内存优化:

一般来说,linux的物理内存几乎是完全used。这个和windows非常大的区别,它的内存管理机制将系统内存充分利用,并非windows无论多大的内存都要去使用一些虚拟内存一样。

在/proc/sys/vm/freepages中三个数字是当前系统的:最小内存空白页、最低内存空白页和最高内存空白。

注意,这里系统使用虚拟内存的原则是:如果空白页数目低于最高空白页设置,则使用磁盘交换空间。当达到最低空白页设置时,使用内存交换。内存一般以每页4k字节分配。最小内存空白页设置是系统中内存数量的2倍;最低内存空白页设置是内存数量的4倍;最高内存空白页设置是系统内存的6倍。

以下以1G内存为例修改系统默认虚拟内存参数大小:

13

6.日志管理

6.1 系统引导日志:

dmesg

使用 dmesg 命令可以快速查看最后一次系统引导的引导日志。通常它的

内容会很多,所以您往往会希望将其通过管道传输到一个阅读器。

6.2 系统运行日志:

A、Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有 root 才可以读,不过只需要修改文件的访问权限就可以让其他人可读。

以下是常用的系统日志文件名称及其描述:

14

B、/var/log/messages

messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。

C、/var/log/XFree86.0.log

这个日志记录的是 Xfree86 Xwindows 服务器最后一次执行的结果。如果您在启动到图形模式时遇到了问题,一般情况从这个文件中会找到失败的原因。

D、在/var/log 目录下有一些文件以一个数字结尾,这些是已轮循的归档文件。日志文件会变得特别大,特别笨重。Linux 提供了一个命令来轮循这些日志,以使您的当前日志信息不会淹没在旧的无关信息之中。 logrotate 通常是定时自动运行的,但是也可以手工运行。当执行后,logrotate 将取得当前版本的日志文件,然后在这个文件名最后附加一个“.1”。其他更早轮循的文件为“.2”、“.3”,依次类推。文件名后的数字越大,日志就越老。

可以通过编辑 /etc/logrotate.conf 文件来配置 logrotate 的自动行为。
 

定制日志

1安装sudo和syslog服务

使用yum等命令在在线安装sudo和syslog服务(在centos6.4中syslog为rsyslog服务)

2配置/etc/sudoers

在/etc/sudoers中配置下面这一行配置

Defaults        logfile=/var/log/sudo.log

3配置系统日志/etc/(r)syslog.conf

在/etc/syslog.conf中添加下面一行的配置文件

*.*    /var/log/sudo.log

4重启syslog服务

/etc/init.d/rsyslog restart

然后在/var/log/sudo.log 中就可以发现使用sudo命令的用户。

5.为审计产生的数据分配合理的存储空间和存储时间

检查方法:

#cat /etc/logrotate.conf 查看系统轮询配置,

# rotate log files weekly

weekly

       #这里代表每个日志文件是每个星期循环一次,一个日志文件保存一个星期的内容。

# keep 4 weeks worth of backlogs

rotate 26

         #这里代表日志循环的次数是26次,即可以保存26个日志文件。

日志配置参考:

/opt/logtest/*.log {
daily # 每天分割一次
rotate 30 # 保留最近30个分割后的日志文件
copytruncate
missingok
dateext # 切割后的文件添加日期作为后缀
dateyesterday # 配合dateext使用,添加前一天的日期作为分割后日志的后缀
dateformat -%Y-%m-%d # 格式为2022-02-08
}

添加 crontab 计划任务
01 01 * * * /usr/sbin/logrotate -f /etc/logrotate_d/xxx