掘金 阅读 ( ) • 2024-04-19 11:06

theme: Chinese-red

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选项:

image.png

 #更改用户的密码相关信息:
 [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号区分出 哪个是父进程,哪个是子进程。父、子相互之间有相同的地方,也有不同之处。

image.png 如果想要将 父进程和子进程 的环境同步,需要用到 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  #查看模块的数量

image.png

4.1 PAM相关文件

  • 包名: pam
  • 模块文件目录: /lib64/security/*.so
  • 特定模块相关的设置文件: /etc/security/ 这里面是比较复杂的
  • man 8 加模块名 可以查看帮助
  • 应用程序调用PAM模块的配置文件
  1. 主配置文件: /etc/pam.conf, 默认不存在,一般不使用主配置
  2. 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
  3. 注意:如/etc/pam.d存在,/etc/pam.conf将失效

4.2 PAM工作原理

Service(服务)→PAM(配置文件)→pam_*.so(调用模块)

4.3 PAM配置文件的格式

专用配置文件: /etc/pam.d

打开su文件 :vim su

image.png

共分为四部分:

1、第一部分(第一列):type验证类型

 auth      #验证用户是否有效
 account   #验证是否在有效期
 password  #验证密码是否正确
 session   #限制使用的资源数量

2、第二部分(第二列):control flags 控制类型

image.png

  • 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

image.png

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

image.png

修改 同样分为四列:

  • 第一列:

    • 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的配置文件里面。
 设置完再刷新!

小拓展:

 free -h   #清除缓存,实际清的也是内核。
 echo1 >/proc/sys/vm/drop_caches
 echo2 >/proc/sys/vm/drop_caches
 echo3 >/proc/sys/vm/drop_caches   #1 2 3中,3清除的最彻底。