前言
Linux 作为一种开放源代码的操作系统,Linux 服务器以其安全、高效和稳定的显著优势而得以广泛应用。下面是我总结的一些有关 Linux 系统安全优化方面的基础知识,希望能给刚接触 Linux 系统的小白一些帮助。
一、账号安全控制
用户账号是计算机使用者的身份凭证或标识,每一个要访问系统资源的人,必须凭借其用户账号才能进入计算机。 在 Linux 系统中,提供了多种机制来确保用户账号额正当、安全使用。
1.账号安全措施
1.1 系统账号清理
- 将非登录用户的 Shell 设为 /sbin/nologin
- 锁定长期不使用的账号
- 删除无用的账号
- 锁定账号文件passwd、shadow
命令如下
[root@localhost ~]# usermod -L zhangsan #锁定账号
[root@localhost ~]# passwd -S zhangsan #查看状态
[root@localhost ~]# usermod -U zhangsan #解锁账号
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow #锁定文件
[root@localhost ~]# lsattr /etc/passwd /etc/shadow #查看为锁定的状态
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow #解锁文件
在账号文件被锁定的情况下,其内容将不允许变更,因此无法添加、删除账号,也不能更改用户的密码、登录 Shell、宿主目录等属性信息。
1.2 密码安全控制
在不安全的网络环境中,为了降低密码被猜出或被暴力破解的风险,用户应养成定期更改密码的习惯,避免长时间使用同一个密码。
- 我们可以使用 chage 命令设置密码时限,例如执行下面的操作可以将密码的有效期设置为30天。
[root@localhost ~]# chage -M 30 lisi #适用于已有的用户
[root@localhost ~]# vim /etc/login.defs #使用于新建的用户
PASS_MAX_DAYS 30
- chage 命令还可以强制让用户在下次登录的时候重设密码,操作如下。
[root@localhost ~]# chage -d 0 zhangsan
[root@localhost ~]# cat /etc/shadow |grep zhangsan
1.3 命令历史限制
Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在的危险。只要获得用户的命令历史文件,该用户的命令操作过程将一览无余,如果里面有曾经输入的密码,那么意味着服务器的安全又多了一个隐患。
- 我们可以自己定义历史命令最多纪录多少条,如下,设置最多纪录200条命令。
[root@localhost ~]# vim /etc/profile #适用于新登录用户
HISTSIZE=200
[root@localhost ~]# export HISTSIZE=200 #适用于当前用户
- 除此之外,我们还可以修改用户宿主目录中的 ~/.bash_logout 文件,添加清空历史命令的操作语句,这样的话当用户退出已登录的 Bash 环境后,所记录的历史命令将会自动清空。
[root@localhost ~]# vim ~/.bash_logout
history -c #添加清空历史命令的语句
clear
或者
[root@localhost ~]# vim .bash
echo ' ' > ~/.bash_history
- 除了设置自动清除之外还可以设置闲置超时时间,当超过指定的时间没有任何输入时自动注销终端,这样可以避免当管理员不在时其他的人对服务器误操作风险。
[root@localhost ~]# vim /etc/profile #适用于新登录用户
export TMOUT=600
[root@localhost ~]# export TMOUT=600 #适用于当前用户
2.用户切换与提权
大多数情况下并不建议用户直接以 root 用户进行登录服务器。这样可以大大减少因误操作而导致的破坏,也降低了密码在不安全的网络中泄露的风险。所以我们就需要为普通用户提供一种身份切换或权限的提升,以便在必要的时候执行管理任务。
2.1 切换用户(su)
- 使用 su 命令可以切换为指定的另一个用户,从而具有该用户的所有权限。当然,切换时需要对目标的密码进行验证(root 用户切换到其他用户不需要)。
[gulei@localhost ~]$su - root
密码: #输入root 用户的密码
上一次登录:四 8月 19 21:37:26 CST 2021从 192.168.24.1pts/0 上
[root@localhost ~]# #验证成功后获得root权限
上面操作中,选项“-”表示切换用户后进入目标用户的宿主目录,不加则表示切换到当前目录。
- 默认情况下,任何用户都允许使用 su 命令,从而有机会反复尝试 root 用户的登陆密码,带来安全隐患。我们可以使用 pam_whell 认证模块只允许极个别的用户使用 su 命令进行切换。具体操作如下:
[root@localhost ~]#gpasswd -a zhangsan wheel #添加授权用户zhangsan
正在将用户“zhangsan”加入到“wheel”组中
[root@localhost ~]#grep wheel /etc/group #确认 wheel 组成员
wheel:x:10:zhangsan
[root@localhost ~]#vim /etc/pam.d/su
auth required pam_wheel.so use_uid #去掉此行开头的“#号”
wq #保存并退出
验证是否设置成功
[lisi@localhost ~]$su - root
密码:
su: 拒绝权限 # lisi 用户没有授权所以登陆失败
[zhangsan@localhost ~]$su - root
密码:
上一次登录:五 8月 20 00:52:07 CST 2021pts/0 上
[root@localhost ~]# # zhangsan 用户可以可以登录
- 我们也可以在 /etc/pam.d/su 文件里设置禁止用户使用su命令
[root@localhost ~]#vim /etc/pam.d/su
......
#auth sufficient pam rootok.so
#auth required pam wheel.so useuid
- 以上两行是默认状态(即开启第一行,注释第二行),这种状态下是允许所有用户间使用su命令进行切换的。
- 两行都注释是运行所有用户都能使用su命令,但 root 下使用 su 切换到其他普通用户需要输入密码。
- 如果第一行不注释,则 root 使用 su 切换普通用户就不需要输入密码。
- 如果开启第二行,表示只有 root 用户和 wheel 组内的用户才可以使用 su 命令。
- 如果注释第一行,开启第二行,表示只有 wheel 组内的用户才能使用 su 命令,root 用户也被禁用 su 命令。
- 使用 su 命令切换用户的操作将会记录到安全日志 /var/log/secure 文件中,可以根据需要进行查看。
2.2 提升执行权限(sudo)
通过 su 命令可以很方便的切换为另外一个用户,前提条件是必须知道用户的登录密码。但对于服务器来说,多一个人知道密码,它的安全风险也就会多增加一分。我们可以使用 sudo 命令进行提升权限,这样就可以降低密码泄露的风险。
- 在配置文件 /etc/sudoers 中添加授权,文件的默认权限为440, 保存退出时必须执行 “:w!” 命令来强制操作,否则系统将提示为只读文件而拒绝保存
- 配置文件中,授权记录的基本格式如下
用户 主机名列表=命令程序列表
上面主要包括用户、主机、命令三个部分,即授权哪些人在哪些主机上执行哪些命令,含义如下
用户:授权的用户名,或者用“%组名”的形式,授权一个组的所有用户
主机:使用此配置文件的主机名称,没配置过的主机名时可用local host ,配置过则用实际主机名,ALL 代表所有主机
命令:运行授权的用户通过sudo方式执行的特权命令,需要填写命令程序的完整路径,多个命令之间以逗号“,”进行分隔
- 例如,授权用户zhangsan 能够执行 ifconfig 命令来修改 IP地址,wheel 组的用户不需要验证密码就可以执行任何命令
[root@localhost ~]# visudo 或者 vim /etc/sudoers
......
zhangsan localhost=/sbin/ifconfig
%wheel ALL=NOPASSWD:ALL
- 当使用相同授权的用户较多,或者授权命令较多时,可以使用集中定义的别名。用户、主机、命令部分都可以定义为别名(必须为大写),分别通过关键字User_Alias、Host_Alias、Cmnd_Alias 来进行设置。
[root@localhost ~]# visudo
...
User_Alias USERS=zs, wer,lisi
Host_Alias HOSTS=localhost, bogon
Cmnd_Alias CMNDS=/sbin/ifconfig, /usr/sbin/useradd, /usr/sbin/userdel
USERS HOSTS=CMNDS
- sudo 配置记录的命令部分允许使用通配符“*”、取反符号“!”,当需要授权某个目录下的所有命令或取消其中个别命令时也别有用。
[root@localhost ~]# visudo
...
Host_Alias MYHOSTS=kgc,localhost
User_Alias MYUSERS=zhangsan,wangwu,lisi
Cmnd_Alias MYCMNDS = /sbin
- 若要查看用户自己获得哪些 sudo 授权,可以执行 sudu -l 命令,未授权的用户将会得到“may not run sudo”的提示,已授权的用户可以看到自己的 sudo 配置。
[root@localhost ~]# sudo -l
- 如果已经启用 sudo 日志,则可以从 /var/log/sudo 文件中看到用户的 sudo 操作记录。
[root@localhost ~]# tail /var/log/sudo
3.PAM 安全认证
3.1 PAM 及其作用
- PAM,是linux 系统可插拔认证模块,是一套可定制、 可动态加载的共享库,使本地系统管理员可以随意选择程序的认证方式。
- PAM使用/etc/pam.d/下的配置文件,来管理对程序的认证方式。应用程序调用相应的PAM配置文件,从而调用本地的认证模块,模块放置在/1ib64/security下,以加载动态库的形式进行认证。比如使用su命令时,系统会提示输入root用户的密码,这就是su命令通过调用PAM模块实现的。
3.2 PAM 认证原理
- PAM认证一般遵循的顺序: Service (服务) --> PAM (配置文件) --> pam_ *.so
- PAM认证首先要确定哪一项应用服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证模块(位于/lib64/security/下)进行安全认证。
- 用户访问服务器的时候,服务器的某一个服务程序把用户的请求发送到PAM模块进行认证。不同的应用程序所对应的PAM模块也是不同的。
如果想查看某个程序是否支持PAM 认证,可以用 ls 命令进行查看,例如查看 su 是否支持 PAM 模块认证,操作如下
[root@localhost ~]# ls /etc/pam.d | grep su
3.3 PAM认证的构成
查看 su 的PAM 配置文件
[root@localhost ~]#cat /etc/pam.d/su
#%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
上面输出结果中
参数 | 说明 |
---|
auth | 对用户身份进行识别,如提示输入密码,判断是否为root。 | account | 对账号各项属性进行检查,如是否允许登录系统,帐号是否已经过期,是否达到最大用户数等。 | password | 使用用户信息来更新数据,如修改用户密码。 | session | 定义登录前以及退出后所要进行的会话操作管理,如登录连接信息,用户数据的打开和关闭,挂载文件系统。 |
格式 | 说明 |
---|
required | 表示需要返回一个成功值,如果返回失败,不会立刻将失败结果返回,而是继续进行同类型的下一验证,所有此类型的模块都执行完成后,再返回失败。 | requisite | 与required类似,但如果此模块返回失败,则立刻返回失败并表示此类型失败。 | sufficient | 如果此模块返回成功,则直接向程序返回成功,表示此类成功,如果失败,也不影响这类型的返回值。 | optional | 不进行成功与否的返回,一般不用于验证,只是显示信息(通常用于session类型), | include | 表示在验证过程中调用其他的PAM配置文件。比如很多应用通过完整调用/etc/pam.d/system-auth(主要负责用户登录系统的认证工作)来实现认证而不需要重新逐一去写配置项。 |
3.4 PAM控制类型
- required 验证失败时仍然继续,但返回 Fail
- requisite 验证失败则立即结束整个验证过程,返回 Fail
- sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续
- optional 不用于验证,只是显示信息(通常用于 session 类型)
验证流程图如下图所示
二、系统引导和登录控制
在互联网环境中,大部分服务器都是通过远程登录来进行管理的,而本地引导和终端登录过程中往往容易被忽略,从而留下安全隐患。
1.开关机安全控制
-
调整 BIOS 引导设置 (1)将第一引导设备设为当前系统所在硬盘。 (2)禁止从其他设备(如光盘、U盘、网络等)引导系统。 (3)将安全级别设为"setup",并设置管理员密码,以防止未授权的修改。 -
GRUB 限制 (1)通过修改 GRUB 引导参数进入单用户模式,可以不需要密码就能进入系统,从而拥有 root 权限,从安全的角度来看,如果任何人都能够这样修改参数,对服务器显然是很大的威胁。 (2)为了加强对引导过程的安全控制,可以为 GRUB 菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。 (3)使用 “grub2-mkpasswd-pbkdf2” 生产密钥 (4)修改 /etc/grub.d/00_header 文件中,添加密码记录 (5)生成新的 grub.cfg 配置文件
2.终端登录安全控制
[root@localhost ~]# vim/etc/securetty
...
#tty5
#tty6 #禁止root用户从终端tty5、tty6登录
[root@localhost ~]# touch /etc/nologin #禁止普通用户登录
[root@localhost ~]# rm -rf /etc/nologin #取消上述登录限制
3.网络扫描(NMAP)
NMAP是一个强大的端口扫描类安全评测工具,官方网站 ,支持 ping 扫描,多端口检测,OS识别等多种技术。使用 NMAP 定期扫描内部网络,可以找出网络中不可控的应用服务,及时关闭不安全的服务,能减小安全风险。
[root@localhost ~]# yum install -y nmap
- 扫描语法及类型(程序位于/usr/bin/nmap 目录下)
nmap [扫描类型] [选项] < 扫描目标... >
常用选项如下
选项 | 说明 |
---|
-P | 指定扫描的端口 | -n | 禁用 反向DNS 解析 | -sS | TCP 的 SYN 扫描(半开扫描) | -sT | TCP连接扫描 | -sF | TCP FIN扫描 | -sU | UDP 扫描 | -sP | ICMP 扫描 | -P0 | 跳过 ping 检测 |
案例 检查本机开放了哪些常用的 TCP 端口、UDP 端口
[root@localhost ~]#nmap 127.0.0.1
Starting Nmap 6.40 ( http:
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000030s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
总结
上面就是我对于账号安全控制,系统引导和登陆控制基础知识的一些总结,希望能给刚接触 Linux 系统的人一些帮助。
|