1、系统账号清理
账号安全 是最基本的系统安全。
1.1 将非登录用户的Shell 设为/sbin/nologin
什么样的用户是非登录用户?
// 程序用户 是非登录用户。
1.2 锁定长期不使用的账号
python
#passwd
passwd -l #锁定
passwd -u(小写) #解锁
#usermod
usermod -L #锁定
usermod -U(大写) #解锁
1.3 删除无用的账号
账号存在就有被破解的风险。
1.4 锁定账号文件passwd、shadow
python
#1、加锁
chattr +i /etc/passwd/etc/shadow #锁定 ,变成只读文件,任何用户都不能修改。
#2、解锁
chattr -i /etc/passwd/etc/shadow #-i就是解锁
#3、查看
lsattr /etc/passwd/etc/shadow #查看权限
2、密码安全控制
python
vi /etc/login.defs #适用于新建用户
chage -M 30 lisi #适用于已有用户
chage -d 0 zhangsan #强制要求下次登录时修改密码
chage选项:
python
#更改用户的密码相关信息:
[root@localhost bin]# chage zhangsan
正在为 zhangsan 修改年龄信息
请输入新值,或直接敲回车键以使用默认值
最小密码年龄 [0]: 7
最大密码年龄 [99999]: 99999
最近一次密码修改时间 (YYYY-MM-DD) [2024-04-17]:
密码过期警告 [7]: 7
密码失效 [-1]: 100
帐户过期时间 (YYYY-MM-DD) [-1]:
随机生成密码?
python
cat /dev/random |tr -dc [[:alnum:]] | head -c 12
分解:
tr -d 删除
[:alnum:] 数字和字母
[[:alnum:]] 任意数字和字母
head -c 12 前12个字符
// [:alpha:] 是数字的意思。
历史命令:
历史命令可以通过history命令进行查看,同时因为记载了很多命令,如果泄露会有风险,不利于网络的安全。
位置是:~/. bash.history
python
history -c #清除历史命令,但只是一次性的,重启后还会出现。
如果想永久清除历史记录,有两种方法:
#1、登录时或者登出时 清空
echo " " > ~/.bash_history #把这个命令编辑到.bashrc或者/etc/profile里,就可以永久更改配置。
#2、减少命令条数
echo $HISTSIZE #通过这个命令可以查看最大的历史命令条数,默认是1000
HISTSIZE=200 #把最大历史命令条数改成200,这个同样也是临时性的。
// 注意:配置文件.bashrc只对当前用户生效。如果想对所有用户都生效的话,要用:vim /etc/profile ,并且重新刷新一下!
小拓展:
python
a=10 #变量
echo $a #打印a
10 #打印出来的a,也就等于变量10
相当于python中的print
3、切换用户
su命令 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令。
python
su zhangsan #切换用户,但切换的不彻底。
su - zhangsan #彻底的切换用户
// 即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误。
小拓展:
python
echo $PID #子进程
echo $PPID #父进程
下图中有多个 bash ,根据pid号区分出 哪个是父进程,哪个是子进程。父、子相互之间有相同的地方,也有不同之处。
如果想要将 父进程和子进程 的环境同步,需要用到 export命令。
4、PAM安全认证
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。
问:为什么超级管理员 切换用户不需要密码;普通用户切换需要密码验证?
答:默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。为了加强su命令的使用控制,可借助于PAM认证模块只允许极个别用户使用su命令进行切换。
PAM服务模块(共64个):
- 认证管理模块
- 账号管理模块
- 会话管理模块
- 口令管理模块...
pam中,以 .so结尾的 都是模块:
python
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验证类型
python
auth #验证用户是否有效
account #验证是否在有效期
password #验证密码是否正确
session #限制使用的资源数量
2、第二部分(第二列):control flags 控制类型
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的
- equired和requisite:表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略include: 调用其他的配置文件中定义的配置
- optional 可选项
3、第三部分(第三列):调用的功能模块
pam_rootok.so 比较重要,只允许超级管理员通过。
4、第四部分(第四列):参数
查看su是否支持PAM模块认证:
python
ls /etc/pam.d |grep su
4.4 shell模块
功能:检查有效shell
帮助:man pam_shells
案例:不允许使用/bin/csh 的用户本地登录
模块: pam_shells.so 只允许 规定的shell类型通过, 是在/etc/shells 文件中存在的 类型通过
python
[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 拒绝登录
python
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参数。
常用的内核参数:
python
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的配置文件里面。
设置完再刷新!
小拓展:
python
free -h #清除缓存,实际清的也是内核。
echo1 >/proc/sys/vm/drop_caches
echo2 >/proc/sys/vm/drop_caches
echo3 >/proc/sys/vm/drop_caches #1 2 3中,3清除的最彻底。