1、系统账号清理
账号安全 是最基本的系统安全。
1.1 将非登录用户的Shell 设为/sbin/nologin
什么样的用户是非登录用户?
// 程序用户 是非登录用户。
1.2 锁定长期不使用的账号
#passwd
passwd -l #锁定
passwd -u(小写) #解锁
#usermod
usermod -L #锁定
usermod -U(大写) #解锁
1.3 删除无用的账号
账号存在就有被破解的风险。
1.4 锁定账号文件passwd、shadow
#1、加锁
chattr +i /etc/passwd/etc/shadow #锁定 ,变成只读文件,任何用户都不能修改。
#2、解锁
chattr -i /etc/passwd/etc/shadow #-i就是解锁
#3、查看
lsattr /etc/passwd/etc/shadow #查看权限
2、密码安全控制
vi /etc/login.defs #适用于新建用户
chage -M 30 lisi #适用于已有用户
chage -d 0 zhangsan #强制要求下次登录时修改密码
chage选项:
#更改用户的密码相关信息:
[root@localhost bin]# chage zhangsan
正在为 zhangsan 修改年龄信息
请输入新值,或直接敲回车键以使用默认值
最小密码年龄 [0]: 7
最大密码年龄 [99999]: 99999
最近一次密码修改时间 (YYYY-MM-DD) [2024-04-17]:
密码过期警告 [7]: 7
密码失效 [-1]: 100
帐户过期时间 (YYYY-MM-DD) [-1]:
随机生成密码?
cat /dev/random |tr -dc [[:alnum:]] | head -c 12
分解:
tr -d 删除
[:alnum:] 数字和字母
[[:alnum:]] 任意数字和字母
head -c 12 前12个字符
// [:alpha:] 是数字的意思。
历史命令:
历史命令可以通过history命令进行查看,同时因为记载了很多命令,如果泄露会有风险,不利于网络的安全。
位置是:~/. bash.history
history -c #清除历史命令,但只是一次性的,重启后还会出现。
如果想永久清除历史记录,有两种方法:
#1、登录时或者登出时 清空
echo " " > ~/.bash_history #把这个命令编辑到.bashrc或者/etc/profile里,就可以永久更改配置。
#2、减少命令条数
echo $HISTSIZE #通过这个命令可以查看最大的历史命令条数,默认是1000
HISTSIZE=200 #把最大历史命令条数改成200,这个同样也是临时性的。
// 注意:配置文件.bashrc只对当前用户生效。如果想对所有用户都生效的话,要用:vim /etc/profile ,并且重新刷新一下!
小拓展:
a=10 #变量
echo $a #打印a
10 #打印出来的a,也就等于变量10
相当于python中的print
3、切换用户
su命令 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令。
su zhangsan #切换用户,但切换的不彻底。
su - zhangsan #彻底的切换用户
// 即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误。
小拓展:
echo $PID #子进程
echo $PPID #父进程
下图中有多个 bash ,根据pid号区分出 哪个是父进程,哪个是子进程。父、子相互之间有相同的地方,也有不同之处。
如果想要将 父进程和子进程 的环境同步,需要用到 export命令。
4、PAM安全认证
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。
问:为什么超级管理员 切换用户不需要密码;普通用户切换需要密码验证?
答:默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。为了加强su命令的使用控制,可借助于PAM认证模块只允许极个别用户使用su命令进行切换。
PAM服务模块(共64个):
- 认证管理模块
- 账号管理模块
- 会话管理模块
- 口令管理模块…
pam中,以 .so结尾的 都是模块:
rpm -ql pam |grep ".so$" |wc -l #查看模块的数量
4.1 PAM相关文件
- 包名: pam
- 模块文件目录: /lib64/security/*.so
- 特定模块相关的设置文件: /etc/security/ 这里面是比较复杂的
- man 8 加模块名 可以查看帮助
- 应用程序调用PAM模块的配置文件
- 主配置文件: /etc/pam.conf, 默认不存在,一般不使用主配置
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效
4.2 PAM工作原理
Service(服务)→PAM(配置文件)→pam_*.so(调用模块)
4.3 PAM配置文件的格式
专用配置文件: /etc/pam.d
打开su文件 :vim su
共分为四部分:
1、第一部分(第一列):type验证类型
auth #验证用户是否有效
account #验证是否在有效期
password #验证密码是否正确
session #限制使用的资源数量
2、第二部分(第二列):control flags 控制类型
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的
- equired和requisite:表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略include: 调用其他的配置文件中定义的配置
- optional 可选项
3、第三部分(第三列):调用的功能模块
pam_rootok.so 比较重要,只允许超级管理员通过。
4、第四部分(第四列):参数
查看su是否支持PAM模块认证:
ls /etc/pam.d |grep su
4.4 shell模块
功能:检查有效shell
帮助:man pam_shells
案例:不允许使用/bin/csh 的用户本地登录
模块: pam_shells.so 只允许 规定的shell类型通过, 是在/etc/shells 文件中存在的 类型通过
[root@localhost ~]#vim /etc/pam.d/su
auth required pam_shells.so
#第一行添加
vim /etc/shells
去掉 /bin/csh
useradd -s /bin/csh lisi
#testuser将不可切换
[root@centos7 ~]#tail /var/log/secure
4.5 securetty模块
功能:只允许root用户 在/etc/securetty列出的安全终端上登录
案例:CentOS 7 允许root在telnet登录
- sshd 远程连接
- remote 远程登录
- login 用户登录
- nologin 拒绝登录
gpasswd -a root wheel #加入到wheel组
gpasswd -d root wheel #从wheel组中删除
#wheel默认是10
4.6 limit 限制
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
ab : 压力测试工具(简称压测工具)
| ab命令选项 | 功能描述 |
|---|---|
| -c+数字 | 同一时间发的请求数量,最大值不能超过1024,如果超过1024,会报错。 |
| -n+数字 | 总的请求数量 |
套接字 作用: 两个主机进程可以交互。
修改限制的实现方式:
4.6.1 ulimit命令
系统限制
| 选项 | 功能描述 |
|---|---|
| -a | all 显示全部,但是只对当前终端生效。 |
| -n | 最大范围 |
怎么修改对所有终端都生效?
修改位置: /etc/security/limits.d
修改 同样分为四列:
-
第一列:
- domain 用户名
- *号 代表所有用户 all
-
第二列:
- soft 软限制
- hard 硬限制
-
第三列:
- core 控制类型
-
第四列:
- value 数量、值
如何修改 ulimit -n的最大文件数量?
1、使用 nofile命令
nofile 是最大可以打开的文件数量。
2、刷新。修改完一定要记得刷新,否则不生效。
4.7 内核调优
默认配置文件位置:/etc/sysctl.conf ,可以查看、修改内核kernel参数。
常用的内核参数:
net.ipv4.ip_forward #开启路由转发功能
0是关,默认就是0 关闭
1是开
sysctl -a |grep icmp #禁ping
net.ipv4.icmp_echo_ignore_a11 = 0 #允许ping
net.ipv4.icmp_echo_ignore_a11 = 1 #禁止ping,禁ping的命令要放到/etc/sysctl.conf的配置文件里面。
设置完再刷新!
sysctl -p
当你执行 `sysctl -p` 时,系统会读取 `/etc/sysctl.conf` 文件中的设置,并尝试将这些设置应用到当前运行的内核中。这通常在修改了该配置文件后执行,以确保更改立即生效,而不需要重启系统。
小拓展:
free -h #清除缓存,实际清的也是内核。
echo1 >/proc/sys/vm/drop_caches
echo2 >/proc/sys/vm/drop_caches
echo3 >/proc/sys/vm/drop_caches #1 2 3中,3清除的最彻底。
4.8 sudo
superuser do 提权操作 ,sudo使一般用户不需要知道超级用户的密码即可获得权限。
用法:sudo + 命令
检票机制,当用户调用sudo并且输入密码时,会获得一张存活期为5分钟的票。
1、配置文件(有两个):
① /etc/sudo.conf (这个尽量不要改动,里面主要是默认配置)
② /etc/sudoers (默认存放的位置),属性权限必须是440 属主可读、属组可读、其他无权限。
如何查看属性权限:
ll /etc/sudoers
2、执行授权命令 :/usr/bin/sudo
3、时间戳文件 :/var/db/sudo
4、日志文件 :/var/log/secure
日志文件需要启用:
defaults logfile = "/var/log/sudo"
vim /etc/sudoers 用这个命令打开,界面好看美观,但是没有语法自动检查功能,因为vim是普通工具。
小拓展:
%wheel 组 ,如果去掉% ,代表是用户。
wheel组里的可以使用所有命令。
sbin 里的命令,只有超级管理员才能用。
4.8.1 子配置文件
为什么会有子配置?为了方便管理。
/etc/sudoers.d/*.conf ,这是文件夹。
安全编辑授权规则文件 和 语法检查工具:
/usr/sbin/visudo #自带语法检查功能
visudo -c #检查语法
4.8.2 sudo 授权规则配置
配置文件格式说明:
- /etc/sudoers
- /etc/sudoers.d/
// 配置文件中 支持使用通配符(glob模式)
? 任意单一字符
* 匹配任意长度字符
[linux] 匹配其中一个字符
[!linux] 取反,除了这几个字符外的其他字符
\x 转义
配置主要是三项:
-
用户。 比如是zhangsan lisi,也就是提权的对象
-
主机 。 ip地址 或 主机名 ,等号后面 不写的话默认是超级管理员。
怎么设置主机名:hostname命令
- 命令。
①用户 ②主机 ③命令
root ALL=(ALL) ALL
lisi ALL=(运行身份)可以不写,默认是超级管理员。 命令(多个命令之间用,隔开)
rpm -ql sudo
sudo -V #可以看到配置的设置
配置优先级:
最后一个命令的优先级最高。
4.8.3 别名
类似于 组,方便管理。
sudo别名有四种类型(固定格式):
- User_Alias(用户)
- Runas_Alias(代表用户)
- Host_Alias(登录主机)
- Cmnd_Alias(命令)
别名格式:必须大写字母,数字可以使用但是不能放在开头
1、先定义:
同样使用visudo命令:
User_Alias MYUSER = zhangsan,lisi
Cmnd_Alias MYCMD = /usr/bin/*
Host_Alias MYHOST = localhost
2、再使用:
MYUSER MYHOST= MYCMD
用户 主机 命令
4.9 grub加密
grub2-setpassword
#直接设置密码
4.10 破解密码
touch /etc/nologin #禁止普通用户登录
rm -rf /etc/nologin #取消上述登录限制
4.11 nmap扫描
nmap -p #指定扫描的端口
#控制位
SYN 建立链接
ACK 确认位
FIN 结束断开
PSH 传送 0 数据缓存 上层应用协议
RST 重置
URG 紧急
小拓展:服务和端口号
| 服务 | 端口号 |
|---|---|
| HTTP | 80 |
| HTTPS | 443 |
| Telnet | 23 |
| FTP | 21 |
| SSH(安全登录)、SCP(文件传输)、端口重定向 | 22 |
| SMTP | 25 |
| POP3 | 110 |
| WebLogic | 7001 |
| TOMCAT | 8080 |
| WIN2003远程登录 | 3389 |
| Oracle数据库 | 1521 |
| MS SQL* SEVER数据库sever | 1433 |
| MySQL 数据库sever | 3306 |