linux 系统级别安全
作为一个开放源代码的操作系统,Linux服务器以其安全、高效和稳定的显著优势而得以广泛应用。下面主要从账户安全、系统引导、登录控制的角度,优化Linux系统的安全性
账号安全控制
用户账号,是计算机使用者的身份凭证,每个访问系统资源的人,必须要有账号才能登录计算机,在Linux中,提供了多种机制来确保用户账号的安全使用
1. 基本安全措施
(1)系统账号清理、锁定
在Linux系统中,除了用户手动创建的各种账号外,还包括随系统或程序安装过程中生成的大量其他账号,用来维护系统运作、启动或保持服务进程,一般不允许登陆,称为非登录用户。为了保持系统安全,这些用户的登陆shell通常是/sbin/nologin,表示禁止终端登录,应确保不被人为改动
1
2
3
4
5
6
7
|
[root@localhost ~] # grep "/sbin/nologin$" /etc/passwd bin:x:1:1:bin: /bin : /sbin/nologin daemon:x:2:2:daemon: /sbin : /sbin/nologin adm:x:3:4:adm: /var/adm : /sbin/nologin lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin mail:x:8:12:mail: /var/spool/mail : /sbin/nologin …… // 省略部分内容 |
各种非登录用户中,有一些很少用到,如news、uucp、games、gopher。可使用冗余账户,直接删除即可,还有一些随着应用程序的卸载未能自动删除,则需要管理员手动清除
1
2
3
|
[root@localhost ~] # userdel uucp [root@localhost ~] # userdel games [root@localhost ~] # userdel gopher |
对于一些长期不用的账号,若无法确定是否删除,应暂时锁定(用usermod、passwd命令都可以锁定、解锁账号)
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost ~] # usermod -L ysf //锁定账号 [root@localhost ~] # passwd -S ysf //查看账号状态 ysf LK 2017-12-22 0 99999 7 -1 (密码已被锁定。) [root@localhost ~] # usermod -U ysf //解锁账号 [root@localhost ~] # passwd -S ysf ysf PS 2017-12-22 0 99999 7 -1 (密码已设置,使用 SHA512 加密。) [root@localhost ~] # passwd -l ysf 锁定用户 ysf 的密码 。 passwd : 操作成功 [root@localhost ~] # passwd -u ysf 解锁用户 ysf 的密码 。 passwd : 操作成功 |
如果服务器中的账号已经固定,不进行更改,可以采用锁定账号配置文件的方法。使用chattr命令锁定、解锁文件,使用lsattr查看文件锁定情况
1
2
3
4
5
6
7
8
9
|
[root@localhost ~] # chattr +i /etc/passwd /etc/shadow //+i,锁定文件 [root@localhost ~] # lsattr /etc/passwd /etc/shadow //查看文件锁定情况 ----i--------e- /etc/passwd ----i--------e- /etc/shadow [root@localhost ~] # useradd yangshufan //文件锁定,无法添加、删除用户,也不能更改用户的密码、登陆shell、宿主目录等属性 useradd : cannot open /etc/passwd [root@localhost ~] # chattr -i /etc/passwd /etc/shadow //-i,解锁文件 [root@localhost ~] # useradd yangshufan //正常创建用户 [root@localhost ~] # |
(2)密码安全控制
为了降低密码被猜出或暴力破解的风险,应避免长期使用同一个密码。管理员可以在服务器端限制用户密码使用最大有效期天数,对密码已过期的用户,登录时要求重新设置密码,否则拒绝登录
1
2
3
4
5
6
7
8
|
[root@localhost ~] # vim /etc/login.defs //适应于新建的用户 PASS_MAX_DAYS 30 // 密码最多使用30天,必须更改密码 PASS_MIN_DAYS 0 // 密码最少使用0天,才能更改密码 PASS_MIN_LEN 5 // 可接受的密码长度 PASS_WARN_AGE 7 // 密码到期前的警告时间 [root@localhost ~] # chage -M 30 ysf //适用于以存在的用户,密码30天过期 [root@localhost ~] # chage -d 0 yangshufan //下次登录时,必须更改密码 |
(3)命令历史、自动注销
shell环境下,命令历史机制为用户提供了极大的便利,也带来了一些潜在的风险。只有获得用户的命令历史记录,该用户的命令操作将一览无余,服务器的安全将受到威胁。历史命令记录条数有变量HISTSIZE控制,默认1000条,可修改配置文件,影响系统中的所有用户。
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost ~] # vim /etc/profile //适用于新登录用户 HISTSIZE=100 [root@localhost ~] # HISTSIZE=5 //适用于当前用户 [root@localhost ~] # history 96 chage -d 0 yangshufan 97 vim /etc/profile 98 export HISTSIZE=100 99 export HISTSIZE=5 100 history [root@localhost ~] # vim ~/.bash_logout //添加以下语句,用户退出登录bash时,自动清空历史命令 history -c clear |
bash终端环境中,可设置一个闲置超时时间,当超过指定的时间没有任何输入时,自动注销终端。由变量TMOUT控制,默认单位
1
2
3
4
5
|
[root@localhost ~] # vim /etc/profile //适用于新登录用户 export TMOUT=600 [root@localhost ~] # TMOUT=600 //适用于当前用户 [root@localhost ~] # unset TMOUT //如果进行耗时较长的操作,避免打扰,可取消TMOUT变量 |
2. 用户切换与提权
一般情况下,不建议直接使用root用户登录,一是减少因操作失误而造成的破坏;二是降低特权密码被泄露的风险。鉴于这些原因,需要为普通用户提供一种身份切换或权限提升机制,以进行管理任务
(1)su命令——切换用户
使用su命令,可以切换一个指定的用户,拥有该用户的所有权限
1
2
3
4
|
[root@localhost ~] # su - ysf //root切换为普通用户,不需要密码验证 [ysf@localhost ~]$ su - // 普通用户切换为root,需要验证,root可省略 密码: [root@localhost ~] # |
默认所有用户允许使用su命令,从而有机会反复尝试其他用户(root)的登陆密码,带来安全风险。可以使用pam_wheel认证模块,只允许极个别用户使用su命令进行切换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@localhost ~] # vim /etc/pam.d/su auth required pam_wheel.so use_uid // 这行去掉注释 # [root@localhost ~] # su - ysf [ysf@localhost ~]$ su - root // 再次尝试切换,就会提示密码错误 密码: su : 密码不正确 [ysf@localhost ~]$ exit logout [root@localhost ~] # gpasswd -a ysf wheel //添加授权用户到wheel组 Adding user ysf to group wheel [root@localhost ~] # grep wheel /etc/group //查看wheel组成员 wheel:x:10:ysf [root@localhost ~] # su - ysf [ysf@localhost ~]$ su - // 再次尝试切换,切换成功 密码: [root@localhost ~] # |
(2)sudo命令——提升执行权限
使用su命令虽然可以切换为root用户,但必须知道root密码要知道每多一个人知道特权密码,就多一份风险。而sudo命令可以让普通用户拥有一部分root用户才能执行的命令,有不用知道特权密码
1)修改配置文件/etc/sudoers
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@localhost ~] # visudo //也可使用vi进行编辑,但保存是必须执行“:w!”强制执行 %wheel ALL=(ALL) NOPASSWD: ALL //wheel 组的用户不需要密码验证 yangshufan localhost= /sbin/ifconfig //yangshufan 能在主机localhost上执行 ifconfig 命令修改IP地址 User_Alias USER=ysf,yang Host_Alias HOST=win,www Cmnd_Alias CMND= /bin/rpm , /usr/bin/yum USER HOST=CMND // 这四行表示允许用户ysf,yang在主机win,www上执行rpm,yum命令 yang localhost= /sbin/ *,! /sbin/ifconfig //yang 可以执行在 /sbin 目录下除了 ifconfig 外所有的命令程序 Defaults logfile= "/var/log/sudo" // 启用 sudo 日志记录以备管理员查看 |
2)通过sudo执行特权命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[yangshufan@localhost ~]$ ifconfig eth0:0 10.0.0.1 /8 // 未用 sudo 命令 SIOCSIFADDR: 权限不够 SIOCSIFFLAGS: 权限不够 [yangshufan@localhost ~]$ sudo ifconfig eth0:0 10.0.0.1 /8 // 使用 sudo 命令 …… // 省略部分内容 [ sudo ] password for yangshufan: // 验证密码 [yangshufan@localhost ~]$ ifconfig eth0:0 // 查看命令,执行成功 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:FB inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 [yangshufan@localhost ~]$ sudo -l // 查看获得哪些 sudo 授权 [ sudo ] password for yangshufan: 用户 yangshufan 可以在该主机上运行以下命令: (root) /sbin/ifconfig [root@localhost ~] # tail /var/log/sudo //可以看到用户的sudo操作记录 Dec 27 07:49:35 : yangshufan : TTY=pts /0 ; PWD= /home/yangshufan ; USER=root ; COMMAND= /sbin/ifconfig eth0:0 10.0.0.1 /8 |
系统引导和登录控制
现在,大部分服务器是通过远程登录的方式来进行管理的,本地引导和终端登录过程往往被忽视,从而留下安全隐患。
1. 开关机安全控制
对于服务器主机,其物理安全是非常重要的,除了要保持机箱完好、机柜锁闭、严格控制机房人员进出、硬件设备现场接触等,在开关机方面,还要做好系统本身的安全措施
(1)调整BIOS引导设置
* 将第一优先引导设备设为当前系统所在磁盘
* 禁止从其他设备引导系统,对应的项为Disabled
* 将BIOS安全级别改为setup,并设好管理密码,以防止未授权修改
(2)禁止Ctrl+Alt+Del快捷键重启
1
2
3
|
[root@localhost ~] # vim /etc/init/control-alt-delete.conf #exec /sbin/shutdown -r now "Control-Alt-Delete pressed" //加#,注释信息 [root@localhost ~] # reboot //重启生效 |
(3)限制更改GRUB引导参数
通过修改GRUB引导参数进入单用户模式,不需要密码就可以进入系统,而且还用于root权限,只应在紧急情况下使用。从系统安全角度来看,如果任何人都能修改GRUB引导参数,对服务器来说是个极大地威胁。所以需要为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
1
2
3
4
5
6
7
8
|
[root@localhost ~] # grub-md5-crypt //经过MD5算法加密的字符串,安全性更好 Password: Retype password: $1$vkPke/$TRfLUURiy7XMKa13XgvIH1 // 经过加密的密码字符串 [root@localhost ~] # vim /boot/grub/grub.conf password --md5 $1$vkPke/$TRfLUURiy7XMKa13XgvIH1 // 复制密码,添加到第一个title之前就可以了 …… // 省略部分内容 |
再次修改GRUB菜单时,必须输入正确的GRUB密码,如下图所示
2. 终端及登录控制
在Linux中,默认开启了留个tty终端,允许任何用户进行本地登录,可从以下方面限制本地登录:
(1)减少开放的tty终端个数
对于远程维护的Linux服务器,六个tty终端有些多余
1
2
3
4
5
6
7
8
9
|
/etc/init/tty .conf // 控制 tty 终端的开启 /etc/init/start-ttys .conf // 控制 tty 终端的开启数量、设备文件 /etc/sysconfig/init // 控制 tty 终端的开启数量、终端颜色 [root@localhost ~] # vim /etc/init/start-ttys.conf env ACTIVE_CONSOLES= /dev/tty [1-3] // 修改为1-3 [root@localhost ~] # vim /etc/sysconfig/init ACTIVE_CONSOLES= /dev/tty [1-3] // 修改为1-3 [root@localhost ~] # reboot |
重启后,将无法切换到tty4、tty5、tty6
(2)禁止root用户登录
在Linux系统中,login程序会读取/etc/securetty文件,以决定允许root用户从哪些终端登录。若要禁止root用户从指定的终端登录,只需注释或删除对应的行即可
1
2
3
|
[root@localhost ~] # vim /etc/securetty #tty1 #tty2 |
(3)禁止普通用户登录
当服务器在维护时,不希望普通用户登录系统,只需建立/etc/nologin文件即可。当login程序检测到/etc/nologin文件存在时,将拒绝普通用户登录系统(root除外)
1
|
[root@localhost ~] # touch /etc/nologin |
当收到删除/etc/nologin文件或重启主机后,即可恢复正常
弱口令检测、端口扫描
1. 弱口令检测——John the Ripper
过于简单的密码是服务器面临的最大风险,尽管大家知道设置一个更长、更复杂的密码会更安全,但总有人贪图方便而采用简单、易记的密码。对于任何一个承担着安全责任的管理员,及时找出这些弱口令账户是非常重要的,这样更容易采取安全措施(如提醒重设更安全的密码)
John the Ripper是一款开源的密码破解工具,能在已知密文的情况下,快速分析明文的密码字串,支持DES、MD5等多种加密算法,允许使用密码字典进行暴力破解。通过John the Ripper,可以检测Linux/UNIX系统用户的密码强度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
[root@localhost ~] # tar zxf john-1.8.0.tar.gz [root@localhost ~] # cd john-1.8.0 [root@localhost john-1.8.0] # ls -ld * drwxr-xr-x. 2 root root 4096 12月 27 09:45 doc // 手册文档 lrwxrwxrwx. 1 root root 10 12月 27 09:45 README -> doc /README // 链接文件 drwxr-xr-x. 2 root root 4096 12月 27 09:45 run // 运行程序 drwxr-xr-x. 2 root root 4096 12月 27 09:45 src // 源码文件 [root@localhost john-1.8.0] # cd src/ [root@localhost src] # make clean linux-x86-64 //切换到src目录下,编译 …… // 省略编译信息 [root@localhost src] # ls ../run/john //run子目录生成john可执行程序 .. /run/john [root@localhost src] # cp /etc/shadow /etc/shadow.txt //准备待破解的密码文件 [root@localhost src] # cd ../run [root@localhost run] # ./john /etc/shadow.txt //执行暴力破解,破解后信息保存到john.pot文件 Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [? /64 ]) Press 'q' or Ctrl-C to abort, almost any other key for status ysf (ysf) 123 (yangshufan) …… // 按Ctrl+C,终止后续过程 [root@localhost run] # ./john --show /etc/shadow.txt //可通过--show选项,查看已破解的账户列表 ysf:ysf:17527:0:30:7::: yangshufan:123:17527:0:99999:7::: 2 password hashes cracked, 1 left [root@localhost run] # :> john.pot //清空以破解的账户列表,以便使用密码字典重新破解 [root@localhost run] # ./john --wordlist=./password.lst /etc/shadow.txt //提供默认的密码字典password.lst,可往里添加更多密码组合 Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [? /64 ]) Press 'q' or Ctrl-C to abort, almost any other key for status 123 (yangshufan) 1g 0:00:00:18 100% 0.05467g /s 193.8p /s 393.0c /s 393.0C /s !@ #$%..sss Use the "--show" option to display all of the cracked passwords reliably Session completed |
从上可看出,由于密码字典的密码组合较少,仅破解出一个其中密码。也不难看出像这类密码有多么脆弱了
2. 网络扫描——NMAP
NMAP是一款强大的端口扫描类安全评测工具,支持ping扫描、多端口检测、OS识别等多种技术。使用NMAP定期扫描内部网络,可以找出网络中不可控的应用服务,及时关闭不安全的服务,较少安全风险
1
2
3
|
[root@localhost ~] # mount /dev/cdrom /media/ mount : block device /dev/sr0 is write-protected, mounting read -only [root@localhost ~] # rpm -ivh /media/Packages/nmap-5.51-3.el6.x86_64.rpm |
NMAP的扫描程序位于/usr/bin/nmap目录下,命令基本格式如下:
nmap [扫描类型] [选项] [扫描目标...]
其中:
扫描目标:可以是主机名、IP地址、网络地址等,多个目标以空格分隔
选项:-p指定扫描的端口;-n禁用反向解析(加快扫描)
常用的扫描类型如下
-sS:TCP SYN扫描(半开扫描),只向目标发送SYN数据包,如果收到SYN/ACK响应就认为目标正在监听,并立即断开连接;否则就认为目标端口未开放
-sT:TCP连接扫描,完整的TCP扫描方式,如果成功连接就认为目标端口正在监听;否则就认为目标端口未开放
-sF:TCP FIN扫描,开放的端口会忽略,关闭的端口会回应RST数据包。这种方式扫描可间接检测防火墙的健壮性
-sU:UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描会比较慢
-sP:ICMP扫描,快速判断目标主机是否存活,不做其他扫描
-s0:跳过ping检测,当对方不响应ICMP请求时,使用这种方式可避免因无法ping通而放弃扫描
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@localhost ~] # nmap 127.0.0.1 //扫描常用的TCP端口 Not shown: 995 closed ports PORT STATE SERVICE 22 /tcp open ssh 25 /tcp open smtp 111 /tcp open rpcbind 631 /tcp open ipp 3306 /tcp open mysql [root@localhost ~] # nmap -sU 127.0.0.1 //扫描常用的UDP端口 PORT STATE SERVICE 111 /udp open rpcbind 631 /udp open |filtered ipp [root@localhost ~] # nmap -p 21 192.168.1.0/24 //检测192.168.1.0/24网段有哪些主机提供FTP服务 [root@localhost ~] # nmap -n -sP 192.168.1.0/24 //检测192.168.1.0/24网段有哪些主机存活(能ping通) [root@localhost ~] # nmap -p 139,445 192.168.4.10-20 //检测192.168.10-20的主机是否开启文件共享服务 |