本章结构
- 账号安全控制
- 系统引导和登录控制
- 弱口令检测
- 端口扫描
一、 账号安全基本措施
1. 系统账号清理
1.1 将非登录用户的Shell设为 /sbin/nologin
shell——/sbin/nologin比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。举例来说,各个系统账号中,打印作业有lp这个账号管理,www服务器有apache这个账号管理,他们都可以进行系统程序的工作,但就是无法登陆主机而已。
usermod -s /sbin/nologin 用户名 修改登录shell类型
1.2 锁定长期不使用的账号
usermod -L 用户名 锁定用户
passwd -l 用户名
1.3 删除无用的账号
userdel [-r] 用户名 加上 -r 才能删除用户的家目录。如果不删除家目录,那么用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID和GID。
1.4 锁定账号文件passwd、shadow
chattr +i /etc/passwd /etc/shadow 锁定文件
2. 密码安全控制
2.1 设置密码有效期
对于新建用户可以修改 /etc/login.defs 文件里的内容来设置密码规则
对于已有用户可以使用chage命令 chage [选项] 用户名
[root@localhost ~]# chage lisi #交互式设置
正在为 lisi 修改年龄信息
请输入新值,或直接敲回车键以使用默认值
最小密码年龄 [0]: 7
最大密码年龄 [99999]: 7
最近一次密码修改时间 (YYYY-MM-DD) [2024-04-18]:
密码过期警告 [7]: 6
密码失效 [-1]: 6
帐户过期时间 (YYYY-MM-DD) [-1]:
[root@localhost ~]#chage -M 30 lisi #设置密码有效期为30天
[root@localhost ~]# chage -l lisi #查看用户李四当前设置
2.2 要求用户下次登录时修改密码
chage -d 0 用户名 强制要求用户下次登录时必须修改密码
[root@localhost ~]# chage -d 0 lisi #强制李四下一次登录一定修改密码(密码符合复杂性要求)
补充:随机生成密码 cat /dev/random | tr -dc [[:alnum:]] |head -c 12 (tr -d 删除)
3. 命令历史限制
Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。
3.1 减少记录的命令条数
Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设置最多只记录 200 条历史命令。
临时修改历史命令条数。只针对当前用户,退出登录后失效。
[root@localhost ~]# export HISTSIZE=200
永久修改历史命令条数。编辑配置文件,设置历史命令条数。
[root@localhost ~]# vim /etc/profile //设置历史命令条数记录为200条
HISTSIZE=200
[root@localhost ~]# source /etc/profile //刷新配置文件,使文件立即生效
注意:写进 /etc/profile 对全局生效 ;写进.bahsrc只对root生效
3.2 注销时自动清空命令历史
家目录下有 .bash_history 文件,用于记录历史命令。清空该文件即清空了命令历史。
临时清除历史命令 history -c
注销时自动清空历史命令
[root@localhost ~]# vim ~/.bash_logout
echo "" > ~/.bash_history
登录时自动清空历史命令
[root@localhost ~]# vim ~/.bashrc
echo "" > ~/.bash_history
4. 终端自动注销
编辑 /etc/profile 文件,设置闲置600秒后自动注销 (不常用)
[root@localhost ~]# vim /etc/profile
.................................
export TMOUT=600
二、用户切换和提权
1.su 切换用户
su( switch user)命令可以切换用户身份,并且以指定用户的身份执行命令
root 切换至其他用户无须密码;非root用户切换时需要密码
1.1 切换用户的方式
su - 用户 完全切换
su 用户 不完全切换
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
1.2 限制使用su命令的用户 (和PAM 安全认证有关)
su 命令的安全隐患:默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。为了加强su命令的使用控制,可借助于 PAM认证模块 ,只允许极个别用户使用su命令进行切换。
限制方法:修改/etc/pam.d/su 文件
- 将允许使用su命令的用户加入wheel组。
- 启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户
注意第二行和第六行:
- 以上两行现在是默认状态(即开启第二行,注释第六行),这种状态下是允许所有用户间使用su命令进行切换的。
- 两行都注释是允许所有用户都能使用su命令,但root使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码)。
- 如果开启第六行,表示只有root用户和wheel组内的用户才可以使用su命令。
- 如果注释第二行,开启第六行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。
2. sudo 用户提权
sudo(superuser do)允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。
在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。sudo于1980年前后推出,sudo使一般用户不需要知道超级用户的密码即可获得权限。
首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是 /etc/sudoers ),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等。
2.1 sudo 命令
用法:sudo 授权命令
sudo组成:
- 包:sudo
- 配置文件:/etc/sudo.conf
- 执行授权命令:/usr/bin/sudo
- 时间戳文件:/var/db/sudo
- 日志文件:/var/log/secure
- 授权规则配置文件:
- /etc/sudoers
- /etc/sudoers.d/*.conf 子配置
sudo特性:
- sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
- sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
- sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
- sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在 /etc/sudoers ,属性必须为0440
查看sudo操作记录:
- 需要启用 Default logfile 配置
- 默认日志文件:/var/log/sudo.log
2.2 /etc/sudoers配置文件
默认配置文件位置: /etc/sudoers ( /etc/sudo.conf文件不要修改 )
编辑配置文件命令:visudo
※注意:编辑sudo的配置文件/etc/sudoers时一般不要直接使用vim(vim /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vim去编辑,但是保存时会自动进行语法检查,有错会有提示。 ( visudo -c 可以检查语法 )
#用户 登入主机 = (代表用户) 命令
#user host = (runas) command
root ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD:ALL
#root表示允许哪个用户。%wheel表示wheel组。
#第一个ALL表示通过哪些主机登入。
#第二个ALL表示以哪个用户身份。
#最后一个ALL表示允许运行哪些命令。
#NOPASSWD表示使用sudo命令不需要验证密码。
举例说明:
1.nancy ALL=(root) /bin/mount
#表示nancy用户通过任何主机登入系统后,可以以root的身份运行mount命令(命令前必须加sudo)。
2.%wheel ALL=(ALL) ALL
#表示wheel组内的成员通过任何主机登入系统后,可以以任何用户的身份运行所有命令(命令前必须加sudo)。
wheel组表示管理员组是比较特殊的一个组,在wheel组中的成员可以使用任何命令
字段填写说明:
1.user:可以写用户名或UID。
2.group:可以写组名或GID。
3.host:可以写ip或hostname(IP地址或主机名)。
4.command:
command name (命令)
directory (文件夹里的命令)
sudoedit (可以编辑sudoers这个文件,变相变成管理员)
Cmnd_Alias (命令别名)
注:配置文件内支持使用通配符,例如"/sbin/*"表示/sbin/目录下的所有命令。
#启用sudo操作日志
visudo
Defaults logfile = "/var/log/sudo"
sudo命令格式:
sudo [-u username] [command] #-u:以哪个用户的身份运行命令
sudo -V #查看相关配置信息
sudo -l #查询授权的sudo操作
2.3 sudo 别名
sudo别名有四种类型:
- User_Alias(用户)
- Runas_Alias(代表用户)
- Host_Alias(登录主机)
- Cmnd_Alias(命令)
别名格式:必须大写字母,数字可以使用但是不能放在开头
举例:创建用户别名MYUSERS=zhangsan,lisi。
允许这两个用户使用/sbin/下的所有命令,除了reboot、poweroff、init、rm这四个命令。
(! 表示取反。! /sbin/reboot 表示不允许使用reboot命令。)
[root@localhost ~]# visudo
----------------------------------
User_Alias MYUSERS = zhangsan,lisi
Host_Alias MYHOSTS = localhost
Cmnd_Alias MYCMNDS = /sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm
MYUSERS MYHOSTS=(root) NOPASSWD:MYCMNDS
2.4 sudo 子目录
如果对所有用户进行提权都放在/etc/sudoers 一个文件中,非常不便于管理。这时可以在/etc/sudoers.d/ 下创建子目录。例如针对 测试部门的员工进行授权,可以创建/etc/sudoers.d/test;针对hr部门的员工进行授权,可以创建/etc/sudoers.d/hr。便于分类管理。
[root@localhost ~]# vim /etc/sudoers.d/test //创建子目录
zhangsan ALL=(root) /bin/mount
[root@localhost ~]# chmod 440 /etc/sudoers.d/test //设置权限,加固安全
[root@localhost ~]# ll /etc/sudoers.d/test
-r--r----- 1 root root 33 3月 7 17:51 /etc/sudoers.d/test
如果允许用户使用sudoedit命令,则该用户能够修改配置文件/etc/sudoers。变相变成管理员,十分危险,建议不要设置该命令。
[root@localhost sudoers.d]#vim /etc/sudoers.d/hr
lisi ALL=(root) sudoedit
[root@localhost ~]#su lisi
[lisi@localhost root]$ sudoedit /etc/sudoers //sudoedit可以修改配置文件,十分危险
3. PAM 安全认证
PAM ( Pluggable Authentication Modules )可插拔式认证模块,是一种高效而且灵活便利的用户级别的认证方式,也是当前Linux服务器普遍使用的认证方式。
通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务 配置不同的认证方式,而无需更改服务程序,同时也便于向系统中添加新的认证手段。
官网手册 : www.linux-pam.org/
3.1 PAM相关文件
- 包名: pam
- 模块文件目录:/lib64/security/*.so
- 特定模块相关的设置文件:/etc/security/
- 应用程序调用PAM模块的配置文件
- 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
- 为每种应用模块提供一个专用的配置文件:
/etc/pam.d/APP_NAME - 注意:如/etc/pam.d存在,/etc/pam.conf将失效
- man 8 加模块名 : 可以查看帮助
查看某个程序是否支持PAM认证,可以用 ls 命令:
[root@localhost ~]# ls /etc/pam.d | grep su #查看su是否支持PAM模块认证
ksu
su
sudo
sudo-i
su-l
3.2 PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件 ( 位于 /etc/pam.d 下 ) ,最后调用认证文件 ( 位于 /lib64/security 下 ) 进行安全认证。
3.3 专用配置文件/etc/pam.d/ 格式
[root@localhost ~]# cat /etc/pam.d/su #查看su的PAM配置文件
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session include system-auth
session include postlogin
session optional pam_xauth.so
type验证类型 控制位 要调用的功能 参数
-
配置文件 /etc/pam.d/ 每一行都是一个独立的认证过程
-
每一行可以区分为三个字段
- 认证类型
- 控制类型
- PAM模块及其参数
认证类型(module-type)
- 认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证; 验证是否有这个用户
- 账户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过 期,帐号的登录是否有时间段的限制等;
- 密码管理(password management):主要是用来修改用户的密码;
- 会话管理(session management):主要是提供对会话的管理和记账。
控制类型(Control Flags)
- required :验证失败时仍然继续,但返回 Fail
一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件。
- requisite :验证失败则立即结束整个验证过程,返回 Fail
一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :验证成功则立即返回,不再继续,否则忽略结果并继续
一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的
-
optional : 不用于验证,只是显示信息(通常用于 session 类型)可选项
-
equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
-
include: 调用其他的配置文件中定义的配置
PAM模块及其参数
- 默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。
3.4 limit
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
[root@localhost ~]# ulimit -a #可以看到系统的相关 资源限制 设置
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7812
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024 #最多只能打开1024个文件
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7812
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -n 10000 #修改限制文件数,但是这样只对当前终端生效
vim /etc/security/limits.conf 可以进行永久修改
缺点:写完需要重启才能生效,所以装好系统后第一时间进行修改
limits 生产中的 建议设置:
用户名 限制类型 控制类型 数量
<domain> <type> <item> <value>
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* - nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000
*代表所有 - 代表软硬一起设置
三、 系统引导和登录控制
1. 开关机安全控制
1.1 调整BIOS引导设置原则
- 将第一引导设备设为当前系统所在硬盘;
- 禁止从其他设备(光盘、 U盘、网络)引导启动系统;
- 将安全级别设为setup,并设置管理员密码。
- 禁用重启热键:Ctrl+Alt+Delete,避免因用户误操作重启。
1.2 GRUB限制
- 使用grub2-mkpasswd-pbkdf2生成密钥
- 修改/etc/grub.d/00_header文件,添加密码记录
- 生成新的grub.cfg配置文件
通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
GRUB2 加密
[root@localhost ~]#grub2-setpassword #直接设置密码
2. 终端登录安全控制
2.1 限制root只在安全终端登录
- 安全终端配置:/etc/securetty
2.2 禁止普通用户登录
- 建立/etc/nologin文件
- 删除nologin文件或者重启后即恢复正常
四、 系统弱口令检测 —— 暴力破解密码
Joth the Ripper,简称JR
- 一款密码分析工具,支持字典式的暴力破解
- 通过对 shadow 文件的口令分析,可以检测密码强度
- 官网网站:www.openwall.com/john/
五、 网络端口扫描 —— nmap扫描
nmap是一个强大的端口扫描类安全评测工具,支持 ping 扫描、多端口检测等多种技术。
网络端口扫描:
| 控制位 | 描述 |
|---|---|
| SYN | 建立链接 |
| ACK | 确认 |
| FIN | 结束断开 |
| PSH | 传送 0 数据缓存,上层应用协议 |
| RST | 重置 |
| URG | 紧 |
namp命令格式:nmap [扫描类型] [选项] <扫描目标>
rpm -qa|grep nmap #查看nmap
yum install -y nmap #安装nmap
示例:
#分别查看本机开放的TCP端口、UDP端口
nmap -sT 127.0.0.1
nmap -sU 127.0.0.1
#检测192.168.80.0/24网段有哪些主机提供HTTP服务
nmap -p 80 192.168.80.0/24
nmap -p 80 192.168.91.100/24
#检测192.168.80.0/24网段有哪些存活主机
nmap -n -sP 192.168.80.0/24