作为一种开放源代码的操作系统,linux服务器以其安全、高效很稳定的显著优势而得以广泛应用。
账号安全控制
- 系统账号清理
在linux系统中,除了用户手动创建的各种账号之外,还包括随系统或程序安装过程而生成的其他大量账号,除了超级用户root之外,其他大量账号只是用来维护系统运作、启动或保持服务进程,一般是不允许登录的,因此也被称为非登录账号。这些账号的登录Shell通常是/sbin/nologin,表示禁止终端登录,因确保不被人为改动。
1. [root@localhost ~]# grep "/sbin/nologin$" /etc/passwd 2. bin:x:1:1:bin:/bin:/sbin/nologin 3. daemon:x:2:2:daemon:/sbin:/sbin/nologin 4. adm:x:3:4:adm:/var/adm:/sbin/nologin 5. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6. ......//省略部分内容
对于linux服务器中长期不用的用户账号,若无法确定是否应该删除,可以暂时将其锁定。(passwd、usermod命令都可以锁定解锁)
1. [root@localhost ~]# usermod -L zhangsan //锁定账号 2. [root@localhost ~]# passwd -S zhangsan //查看账号状态 3. zhangsan LK 2022-07-03 0 99999 7 -1 (密码已被锁定。) 4. [root@localhost ~]# usermod -U zhangsan //解锁账号 5. [root@localhost ~]# passwd -S zhangsan 6. zhangsan PS 2022-07-03 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
如果是服务器中的用户账号已经固定,不再进行更改,还可以采取锁定账号配置文件的方法。使用chattr命令,分别结合"+i" "-i"选项来锁定、解锁文件,使用lsattr命令查看文件锁定情况。
1. [root@localhost ~]# chattr +i /etc/passwd /etc/shadow //锁定文件 2. [root@localhost ~]# lsattr /etc/passwd /etc/shadow //查看为锁定的状态 3. ----i----------- /etc/passwd 4. ----i----------- /etc/shadow 5. [root@localhost ~]# chattr -i /etc/passwd /etc/shadow //解锁文件 6. [root@localhost ~]# lsattr /etc/passwd /etc/shadow //查看解锁的状态 7. ---------------- /etc/passwd 8. ---------------- /etc/shadow
- 密码安全控制
在不安全的网络环境中,为了降低密码被猜出来或被暴力破解的风险,管理员可以在服务器端限制用户密码的最大有效天数,对于密码已过期的用户,登录时被要求重新设置密码,否则被拒绝登录。以下操作将密码的有效期设置为30天。
1. [root@localhost ~]# vim /etc/login.defs //适用于新建的用户 2. PASS_MAX_DAYS 30 //默认为99999天 3. [root@localhost ~]# chage -M 30 lisi //适用于已有的lisi用户
强制用户zhangsan下次登录时重设密码
[root@localhost ~]# chage -d 0 zhangsan
命令历史、自动注销
Bash终端环境中,历史明丽的记录条数由变量HISTSIZE控制,默认为1000条。通过修改/etc/profile文件中的HISTSIZE变量值,可以影响系统中的所有用户。例如,可以设置只记录200条历史命令。
1. [root@localhost ~]# vim /etc/profile //适用于新登录用户 2. HISTSIZE=200 3. [root@localhost ~]# export HISTSIZE=200 //适用于当前用户
除此之外,还可以修改用户宿主目录中的~/.bash_logout文件,添加清空历史明丽的操作语句。这样,当用户退出已登录Bash环境以后,所记录的历史命令将自动清空。
1. [root@localhost ~]# vim ~/.bash_logout 2. history -c 3. clear
Bash终端环境中,还可以设置一个闲置超时时间,当超过指定的时间没有任何输入时即自动注销终端,这样可以有效避免当管理员不在时其他人员对服务器的无操作风险。闲置超时时间由变量TMOUT来控制,默认单位为秒(s)。
1. [root@localhost ~]# vim /etc/profile //适用于新登录用户 2. export TMOUT=600 3. [root@localhost ~]# export TMOUT=600 //适用于当前用户
执行"unset TMOUT"命令取消TMOUT变量设置。
用户切换与提权
- su命令——切换用户
1. [lisi@localhost ~]$ su - root 2. 密码: //输入root口令 3. 上一次登录:日 7月 3 20:26:50 CST 2022pts/0 上 4. [root@localhost ~]# //登录成功后过得root权限
上述命令中su添加“-”选项,表示切换用户后进入目标用户的登录Shell环境,若缺少此选项仅切换身份、不切换用户环境。对于切换为root用户的情况,“root”可以省略。
默认情况下,任何用户都允许使用su命令,从而有机会反复尝试其他用户(如root)的登录密码,,为了加强su命令的使用控制,可以借助于pam_whel认证模块,只允许极个别用户使用su命令进行切换。实现过程如下:将授权使用su命令的用户添加到wheel组,修改/etc/pam.d/su认证配置以启动pam_wheel认证。
1. [root@localhost ~]# gpasswd -a zhangsan wheel 2. 正在将用户“zhangsan”加入到“wheel”组中 3. [root@localhost ~]# grep wheel /etc/group 4. wheel:x:10:zhangsan 5. [root@localhost ~]# vim /etc/pam.d/su 6. #%PAM-1.0 7. auth sufficient pam_rootok.so //默认有 8. auth required pam_wheel.so use_uid //去#注释 9. ......省略部分内容
启用pam_wheel认证以后,未加入到wheel组内的其他用户将无法使用su命令,尝试进行切换时将提示“拒绝权限”,从而将切换用户的权限控制在最小范围内。
1. [lisi@localhost ~]$ su - root //lisi用户切换root用户 2. 密码: 3. su: 拒绝权限 4. [lisi@localhost ~]$ //切换失败
- sudo命令——提升执行权限
既可以让普通用户拥有一部分管理权限,又不需要将root用户的密码告诉他时,就可以使用sudo命令来提升权限,不过需要管理员预先进行授权,指定允许哪些用户以超级用户(或其他普通用户)的身份来执行哪些命令。
在配置文件/etc/sudoers中添加授权
sudo机制的配置文件为/etc/sudoers,文件的默认权限为440,需使用专门的visudo工具进行编辑。虽然也可以用vim进行编辑,但保存时必须执行“w!”命令来强制操作,否则系统将提示为只读文件而拒绝保存。
授权记录的基本配置格式如下:
1. [root@localhost ~]# vim /etc/sudoers 2. user MACHINE=COMMANDS
授权配置主要包括用户、主机、命令三部分,即授权那些人在哪些主机上执行哪些命令。
用户(user):直接授权指定的用户名,或采用“%组名”的形式(授权一个组的所有用户)。
主机(MACHINE):使用此配置文件的主机名称。此部分主要是方便在多个主机间公用同一份sudoers文件,一般设为localhost或者实际的主机名即可。
命令(COMMANDS):允许授权的用户通过sudo方式执行的特权命令,需填写命令程序的完整路径,多个命令之间以逗号进行分隔。
若要授权用户zhangsan能够执行ifconfig命令来修改IP地址,而wheel组的用户无需验证密码即可执行任何命令,可以执行以下操作。
1. [root@localhost ~]# visudo 2. ......//省略部分内容 3. zhangsan localhost=/sbin/ifconfig 4. %wheel ALL=NOPASSWD: ALL
当相同授权的用户较多,或授权的命令较多时,可以采用几种定义的别名.用户、主机、命令部分都可以定义为别名(必须大写),分别通过关键字User_Alias、Host_Alias、Cmnd_Alias来进行设置。例如,以下操作通过别名方式来添加授权记录,允许用户jerry、tom、tsengyia在主机smtp、pop中执行rpm、yum命令。
1. [root@localhost ~]# visudo 2. User_Alias OPERATORS=jerry,tom,tsengyia 3. Host_Alias MAILSVRS=smtp,pop 4. Cmnd_Alias PKGTOOLS=/bin/rpm,/usr/bin/yum 5. OPERATORS MAILSVRS=PKGTOOLS
sudo配置记录的命令部分允许使用通配符"*"、取反符号"!",当需要授权某个目录下的所有命令或取消其中个别命令时特别有用。例如,若需要授权用户zhangsan可以执行/sbin/目录下除ipconfig、route以外的其他所有命令程序,可以执行以下操作。
1. [root@localhost ~]# visudo 2. zhangsan localhost=/sbin/*,!/sbin/ifconfig,/sbin/route
默认情况下,通过dudo方式执行的操作记录并不记录。若要启用sudo日志记录以备管理员查看,应在/etc/sudoers文件中添加"Defaults logfile"设置。
1. [root@localhost ~]# visudo //找到Defaults,在前面添加一行内容 2. ......//省略部分内容 3. Defaults logfile = "/var/log/sudo"
- 通过sudo执行特权命令
对于已获得授权的用户,通过sudo方式执行特权命令时,只需要将正常的命令行作为sudo命令的参数即可。由于特权命令程序通常位于/sbin、/usr/sbin等目录下,普通用户执行时应使用绝对路径。
1. [zhangsan@localhost ~]$ /sbin/ifconfig ens33:0 192.168.1.10/24 //未使用sudo前 2. SIOCSIFADDR: 不允许的操作 3. SIOCSIFFLAGS: 不允许的操作 4. SIOCSIFNETMASK: 不允许的操作 5. [zhangsan@localhost ~]$ sudo /sbin/ifconfig ens33:0 192.168.1.10/24 //使用sudo后 6. [sudo] password for zhangsan: //输入zhangsan口令 7. [zhangsan@localhost ~]$ /sbin/ifconfig ens33:0 //查看执行结果 8. ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 9. inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 10. ether 00:0c:29:bc:c7:b8 txqueuelen 1000 (Ethernet)
若要查看用户自己获得哪些sudo授权,可以执行"sudo -l"命令。
1. [zhangsan@localhost ~]$ sudo -l 2. 匹配此主机上 zhangsan 的默认条目: 3. logfile=/var/log/sudo, !visiblepw, always_set_home, env_reset, env_keep="COLORS 4. DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR 5. USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION 6. LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER 7. LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET 8. XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin 9. 10. 用户 zhangsan 可以在该主机上运行以下命令: 11. (root) /sbin/*, (root) !/sbin/ifconfig, (root) /sbin/route 12. (root) /sbin/ifconfig 13. (root) NOPASSWD: ALL 14. (ALL) ALL
开关机安全控制
- 禁止Ctrl+Alt+Del快捷键重启
快捷键重启功能为服务器的本地维护提供了方便,但对于多终端的linux服务器,禁用此功能是比较安全的选择。虚拟机中将Del键换成insert键。
查看/usr/lib/systemd/system/ctrl-alt-del.target文件发现,ctrl-alt-del.target是reboot.target文件的软链接文件。
1. [root@localhost ~]# ll /usr/lib/systemd/system/ctrl-alt-del.target 2. lrwxrwxrwx. 1 root root 13 5月 7 2018 /usr/lib/systemd/system/ctrl-alt-del.target -> reboot.target
再不行影响reboot.target文件的前提下执行以下命令即可禁用Ctrl+Alt+Del快捷键功能。
1. [root@localhost ~]# systemctl mask ctrl-alt-del.target 2. Created symlink from /etc/systemd/system/ctrl-alt-del.target to /dev/null. 3. [root@localhost ~]# systemctl daemon-reload
若想重新开启Ctrl+Alt+Del快捷键功能,只需要执行systemctl mask ctrl-alt-del.target 命令,然后刷新配置即可。在命令提示符终端测试Ctrl+Alt+F2...F7,F1切换回图形界面。
- 限制更改GRUB引导参数
从系统安全的角度来看,如果任何人都能够修改GRUB引导参数,对服务器本身显然是一个极大的威胁。为了加强对引导过程的安全控制可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
1. [root@localhost ~]# grub2-mkpasswd-pbkdf2 //根据提示指定密码 2. 输入口令: 3. Reenter password: 4. PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.8022173B1FB81686F9450202D77EEFA20A44D8FE7F662756CCE0092B1CC95D0D465F19C9F93295153291D0852153C0D8363FCA7431B955B6E4C246463154BA97.125C6C9494909CE87C38EB36D0A330AAA002AC14F652FAC7C01C0C45B05D60D5D0AF8BCDCD4F71FD7807839657FF13C887094C47831AEC84E290B2280486701A //复制is密文密码 5. [root@localhost ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak 6. [root@localhost ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak 7. [root@localhost ~]# vim /etc/grub.d/00_header //将下面内容添加到文件最后 8. ......//省略部分内容 9. cat << EOF 10. set superusers="root" 11. password_pbkdf2 root grub.pbkdf2.sha512.10000.8022173B1FB81686F9450202D77EEFA20A44D8FE7F662756CCE0092B1CC95D0D465F19C9F93295153291D0852153C0D8363FCA7431B955B6E4C246463154BA97.125C6C9494909CE87C38EB36D0A330AAA002AC14F652FAC7C01C0C45B05D60D5D0AF8BCDCD4F71FD7807839657FF13C887094C47831AEC84E290B2280486701A 12. EOF
使用grub2-mkconfig命令生成新的grub.cfg配置文件。
1. [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg //生成新的grub.cfg文件 2. Generating grub configuration file ... 3. Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 4. Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img 5. Found linux image: /boot/vmlinuz-0-rescue-d2fbf6a8306647d2abb5b8e02db3fcaa 6. Found initrd image: /boot/initramfs-0-rescue-d2fbf6a8306647d2abb5b8e02db3fcaa.img 7. done
通过配置后,重新开机进入GRUB菜单时,按e键将无法修改引导参数,需输入正确的GRUB密码。
终端及登录控制
- 禁止root用户登录
若要禁止root用户从tty5、tty6登录,可以修改/etc/securetty文件,将tty5、tty6注释掉。
1. [root@localhost ~]# vim /etc/securetty 2. ......//省略部分内容 3. #tty4 4. #tty5 5. tty6
- 禁止普通用户登录
当服务器正在备份或维护时,若不希望有新的用户登录系统,这时只需要简单的建立/etc/nologin文件即可。当手动删除/etc/nologin文件或者重新启动主机以后,即可恢复正常。
[root@localhost ~]# touch /etc/nologin
弱口令检测
John the Ripper是一款开源的密码破解工具,能够在已知密文的情况下快速分析出明文密码字符串,支持DES、MD5等多种加密算法,而且允许使用密码字典来进行暴力破解。官方网站是John the Ripper password cracker 。
- 安装John the Ripper
解压后可以看到三个子目录——doc、run、src,分别表示手册文档、运行程序、源码文件,和一个链接文件README。
1. [root@localhost ~]# eject 2. [root@localhost ~]# mount /dev/cdrom /media 3. mount: /dev/sr0 写保护,将以只读方式挂载 4. [root@localhost ~]# tar zxf /media/john-1.8.0.tar.gz -C /usr/src 5. [root@localhost ~]# cd /usr/src/john-1.8.0/ 6. [root@localhost john-1.8.0]# ls -ld * 7. drwxr-xr-x 2 root root 208 7月 3 22:49 doc 8. lrwxrwxrwx 1 root root 10 5月 30 2013 README -> doc/README 9. drwxr-xr-x 2 root root 143 7月 3 22:49 run 10. drwxr-xr-x 2 root root 4096 7月 3 22:49 src 11. [root@localhost john-1.8.0]# ls doc/ 12. CHANGES CONTACT CREDITS EXTERNAL INSTALL MODES README 13. CONFIG COPYING EXAMPLES FAQ LICENSE OPTIONS RULES
切换到src目录下进行编译,编译完成后,run子目录下会生成一个名为john的可执行程序。
1. [root@localhost john-1.8.0]# cd src 2. [root@localhost src]# make clean linux-x86-64 3. ......//省略部分内容 4. [root@localhost src]# ls ../run/john 5. ../run/john
- 检测弱口令账号
1. [root@localhost src]# cp /etc/shadow /root/shadow.txt //准备待破解的密码文件 2. [root@localhost src]# cd ../run 3. [root@localhost run]# ./john /root/shadow.txt //执行暴力破解 4. Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64]) 5. Press 'q' or Ctrl-C to abort, almost any other key for status 6. 123456 (root) 7. 1 (lisi) 8. 1 (zhangsan) 9. 3g 0:00:00:52 100% 2/3 0.05738g/s 215.8p/s 265.4c/s 265.4C/s rosita..help 10. Use the "--show" option to display all of the cracked passwords reliably 11. Session completed
破解出的密码信息自动保存到john.pot文件中,可以结合"--show"选项进行查看。
1. [root@localhost run]# ./john --show /root/shadow.txt //查看已破解出的账户列表 2. root:123456::0:99999:7::: 3. lisi:1:19176:0:30:7::: 4. zhangsan:1:19176:0:99999:7::: 5. 6. 3 password hashes cracked, 0 left
- 使用密码字典文件
对于密码的暴力破解,字典文件的选择相当关键。只要字典文件足够完整,密码破解只是时间上的问题。John the Ripper默认提供的字典文件为password.lst,其中列出来3000多个常见的弱口令。"--wordlist="选项指定字典文件的位置。
1. [root@localhost run]# :> john.pot //清空已破解出的账户列表,以便重新分析 2. [root@localhost run]# ./john --wordlist=./password.lst /root/shadow.txt 3. Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64]) 4. Press 'q' or Ctrl-C to abort, almost any other key for status 5. 123456 (root) 6. 1 (lisi) 7. 1 (zhangsan) 8. 3g 0:00:00:18 100% 0.1643g/s 136.7p/s 278.7c/s 278.7C/s rosita..help 9. Use the "--show" option to display all of the cracked passwords reliably 10. Session completed
网络扫描
NMAP是一个强大的端口扫描类安全测评工具,官方网站是Nmap: the Network Mapper - Free Security Scanner。NMAP被设计为检测众多主机数量的巨大网络,支持ping扫描、多端口检测、OS识别等多技术。使用NMAP定期扫描内部网络,可以找出网络中不可控制的应用服务,及时关闭不安全的服务,减少安全风险。
- 安装NMAP软件包
在CentOS7系统中,可以使用光盘自带的nmap-6.40-7.el7.x86_64.rpm安装包,也可以使用从NMAP官网下载最新的源码包,这里以YUM方式安装。
[root@localhost ~]# yum -y install nmap
- 语法扫描类型
NMAP的扫描程序位于/usr/bin/nmap目录下,命令格式如下:
nmap [扫描类型] [选项] <扫描目标...>
其中,扫描目标可以是主机名、IP地址或网络地址等,多个目标以空格分隔;常用的选项有“-p”“-n”,分别用来指定扫描的端口、禁用反向DNS解析(以加快扫描速度);扫描类型决定着检测的方式,也直接影响扫描的结果。
比较常用的集中扫描类型如下。
-sS,TCP SYN扫描(半开扫描);只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。
-sT,TCP连接扫描:这是完整的TCP扫描方式,用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。
-sF,TCP FIN扫描:开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对SYN数据包进行简单过滤,而忽略了其他形式的TCP攻击包。这类型的扫描可间接检测防火墙的健壮性。
-sU,UDP扫描:探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。
-sP,ICMP扫描:类似于ping检测,快速判断目标主机是否存活,不做其他扫描。
-PO,跳过ping检测:这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法ping通而放弃扫描。
- 扫描操作示例
在扫描结果中,STATE列若为open则表示端口为开放状态,为filtered表示可能被防火请过滤,为closed表示端口为关闭状态。
1. [root@localhost ~]# nmap 127.0.0.1 //扫描常用的TCP端口 2. 3. Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-03 23:38 CST 4. mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers 5. Nmap scan report for localhost (127.0.0.1) 6. Host is up (0.0000050s latency). 7. Not shown: 996 closed ports 8. PORT STATE SERVICE 9. 22/tcp open ssh 10. 25/tcp open smtp 11. 111/tcp open rpcbind 12. 631/tcp open ipp 13. 14. Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds 15. [root@localhost ~]# nmap -sU 127.0.0.1 //扫描常用的UDP端口 16. 17. Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-03 23:38 CST 18. mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers 19. Nmap scan report for localhost (127.0.0.1) 20. Host is up (0.0000090s latency). 21. Not shown: 999 closed ports 22. PORT STATE SERVICE 23. 5353/udp open|filtered zeroconf 24. 25. Nmap done: 1 IP address (1 host up) scanned in 1.29 seconds
检查192.168.1.0/24网段中有哪些主机提供FTP服务。
1. [root@localhost ~]# nmap -p 21 192.168.1.0/24 2. 3. Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-03 23:46 CST 4. mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers 5. Nmap scan report for 192.168.1.10 6. Host is up (0.00045s latency). 7. PORT STATE SERVICE 8. 21/tcp closed ftp 9. 10. Nmap done: 256 IP addresses (1 host up) scanned in 10.67 seconds
快速检测192.168.1.0/24网段中有哪些存活主机(能ping通)。
1. [root@localhost ~]# nmap -n -sP 192.168.1.0/24 2. 3. Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-03 23:48 CST 4. Nmap scan report for 192.168.1.10 5. Host is up. 6. Nmap done: 256 IP addresses (1 host up) scanned in 10.59 seconds
检测IP地址位于192.168.1.100~200的主机是否开启文件共享服务。
1. [root@localhost ~]# nmap -p 139,445 192.168.1.100-200 2. 3. Starting Nmap 6.40 ( http://nmap.org ) at 2022-07-03 23:49 CST 4. mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers 5. Nmap done: 101 IP addresses (0 hosts up) scanned in 4.55 seconds