系统安全及应用

本章结构

  • 账号安全控制
  • 系统引导和登录控制
  • 弱口令检测
  • 端口扫描

一、 账号安全基本措施

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 [选项] 用户名

less 复制代码
[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 用户名 强制要求用户下次登录时必须修改密码

js 复制代码
[root@localhost ~]# chage -d  0 lisi     #强制李四下一次登录一定修改密码(密码符合复杂性要求)

补充 :随机生成密码 cat /dev/random | tr -dc [[:alnum:]] |head -c 12 (tr -d 删除)

3. 命令历史限制

Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。

3.1 减少记录的命令条数

Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改 <math xmlns="http://www.w3.org/1998/Math/MathML"> / e t c / p r o f i l e \color{red}{ /etc/profile } </math>/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设置最多只记录 200 条历史命令。

js 复制代码
临时修改历史命令条数。只针对当前用户,退出登录后失效。
[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 文件,用于记录历史命令。清空该文件即清空了命令历史。

bash 复制代码
临时清除历史命令 history  -c 

注销时自动清空历史命令 
[root@localhost ~]# vim ~/.bash_logout
echo "" > ~/.bash_history

登录时自动清空历史命令
[root@localhost ~]# vim ~/.bashrc
echo "" > ~/.bash_history

4. 终端自动注销

编辑 /etc/profile 文件,设置闲置600秒后自动注销 (不常用)

js 复制代码
 [root@localhost ~]#  vim /etc/profile
 .................................
 export  TMOUT=600

5. su 切换用户

su( switch user)命令可以切换用户身份,并且以指定用户的身份执行命令

root 切换至其他用户无须密码;非root用户切换时需要密码

5.1 切换用户的方式

su - 用户 完全切换

su 用户 不完全切换

注意 :su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。

5.2 限制使用su命令的用户 (和PAM 安全认证有关)

su 命令的安全隐患 :默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。为了加强su命令的使用控制,可借助于 PAM认证模块 ,只允许极个别用户使用su命令进行切换。

限制方法:修改/etc/pam.d/su 文件

  1. 将允许使用su命令的用户加入wheel组。
  2. 启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户

注意第二行和第六行

  • 以上两行现在是默认状态(即开启第二行,注释第六行),这种状态下是允许所有用户间使用su命令进行切换的。
  • 两行都注释是允许所有用户都能使用su命令,但root使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码)。
  • 如果开启第六行,表示只有root用户和wheel组内的用户才可以使用su命令。
  • 如果注释第二行,开启第六行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。

6. PAM 安全认证

PAM ( Pluggable Authentication Modules )可插拔式认证模块,是一种高效而且灵活便利的用户级别的认证方式,也是当前Linux服务器普遍使用的认证方式。

通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务 配置不同的认证方式,而无需更改服务程序,同时也便于向系统中添加新的认证手段。

官网手册 : www.linux-pam.org/

6.1 PAM相关文件

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

查看某个程序是否支持PAM认证,可以用 ls 命令:

js 复制代码
[root@localhost ~]#  ls  /etc/pam.d  | grep  su   #查看su是否支持PAM模块认证
ksu
su
sudo
sudo-i
su-l

6.2 PAM工作原理

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so

PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件 ( 位于 /etc/pam.d 下 ) ,最后调用认证文件 ( 位于 /lib64/security 下 ) 进行安全认证。

6.3 专用配置文件/etc/pam.d/ 格式

js 复制代码
[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/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。

6.4 limit

功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间

js 复制代码
[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 limits.conf 可以进行永久修改

缺点:写完需要重启才能生效,所以装好系统后第一时间进行修改

limits 生产中的 建议设置

js 复制代码
用户名          限制类型   控制类型         数量
<domain>        <type>   <item>           <value>
*                soft    core            unlimited
*                hard    core            unlimited
*                soft    nproc           1000000
*                hard    nproc           1000000
*                soft    nofile          1000000
*                hard    nofile          1000000
*                soft    memlock         32000
*                hard    memlock         32000
*                soft    msgqueue        8192000
*                hard    msgqueue        8192000

*代表所有     软硬一起设置可以直接使用 -
相关推荐
Lysun0011 小时前
云服务器安装mysql8.0(阿里云或者腾讯云都可以)
阿里云·云计算·腾讯云
汤米粥3 小时前
通过PHP创建AWS的CloudFront并绑定证书添加备用域名
服务器·云计算·aws
Z1eaf_complete4 小时前
Docker的基础使用
运维·docker·容器·云计算
大鹅i5 小时前
aws-athena查询语句总结
云计算·aws
汤米粥6 小时前
怎么样绑定域名到AWS(亚马逊云)服务器
服务器·云计算·aws
小安运维日记9 小时前
CKA认证 | Day3 K8s管理应用生命周期(上)
运维·云原生·容器·kubernetes·云计算·k8s
眷怀1 天前
网卡绑定bonding
linux·运维·服务器·网络·云计算
数勋API1 天前
银行卡归属地查询API接口如何用PHP调用
开发语言·云计算·php
tmgmforex20241 天前
亚马逊云计算部门挑战英伟达,提供免费AI计算能力
人工智能·科技·云计算
CCSBRIDGE1 天前
给阿里云OSS绑定域名并启用SSL
阿里云·云计算·ssl