Linux系统提供了多种机制来确保用户账号的正当,安全使用。
系统安全措施
一. 清理系统账号
1.1 将用户设置为无法登录
Linux系统中除手动创建的各种账号外,还包括随系统或程序安装过程而生成的其他大量账号。除了超级用户root以外,其他的大量账号只是用来维护系统运作,启动或保存服务进程,一般不允许登录的,因此也被称为非登录用户。
常见的非登录用户,为了确保系统的安全,这些用户的登录shell通常设置是**/sbin/nologin**,表示禁止终端登录,确保不被人为改动。所谓 "禁止登录" 指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。
具体操作如下:
1.2 删除账户
在这些非登录用户中,有一些很少用到的用户,这些被称为冗余账号,直接删除就可以了。当然,还有一些是随程序安装的用户账号,程序卸载不一定能完全自动删除,这时需要管理员手动进行清理。
具体操作如下:
1.3 锁定账户
对于Linux服务器中长期不用的用户账号,无法确定是否删除,可以暂时锁定它,来确保安全。
具体操作如下:
方法一:
方法二:
1.4 锁定账户密码(本质锁定)
服务器中的用户账号已经固定,不能再进行修改,此时我们可以采取锁定账号的配置文件的方法。
chattr命令
|---|----------------------------------------------|
| i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
| a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
这里只参考选项 -i ,chattr命令 与lsattr命令 具体详解可以参考https://blog.csdn.net/qq_66204767/article/details/135326223?spm=1001.2014.3001.5501
具体操作如下:
二. 控制密码安全
在不安全的网络环境中,为了降低密码被猜出与被暴力破解的风险,要养成定期更改密码的习惯,适当避免长期使用同一个密码。对于已有用户可以使用chage命令,用于设置密码时限,对于密码过期的用户,登录时将被要求重新设置密码,否则拒绝登录。
2.1 方法一:chage
chage 命令
格式: chage [选项] 用户名
**作用:**用于设置密码时限
|----|--------------------------------|
| -m | 密码可更改的最小天数。为零时代表任何时候都可以更改密码。 |
| -M | 密码保持有效的最大天数。 |
| -w | 用户密码到期前,提前收到警告信息的天数。 |
| -E | 帐号到期的日期。过了这天,此帐号将不可用。 |
| -d | 上一次更改的日期。 |
| -i | 停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。 |
| -l | 例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。 |
具体操作如下:
2.2 方法二:/etc/login.defs
对于新建用户,可以修改**/etc/login.defs**文件中的内容来设置密码规则
具体操作如下:
java
vim /etc/login.defs #编辑该文件
三. 注销历史命令
Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在 命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改**/etc/profile**文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。
3.1 方法一:/etc/profile
修改**/etc/profile**文件
具体操作如下:
java
vim /etc/profile #编辑该文件
3.2 方法二:~/.bash------logout
修改用户宿主目录中的**~/.bash------logout**文件,添加清空历史命令的操作语句
具体操作如下:
java
vim ~/.bash_logout #在文件中添加清空历史命令的操作语句
**注:**还可以使用 history -c 和 clear命令临时清除历史命令
3.3 方法三:超时时间
设置闲置超时时间,当超过指定的时间没有任何输入时即自动注销终端。如此可以避免管理员不在时其他人员对服务器的误操作风险。
具体操作如下:
java
vim /etc/profile #编辑该文件
....................
export TMOUT=600 #将该字段加入 /etc/profile文件中
闲置超时由变量TMOUT来控制,默认单位为秒
**注:**当正在执行程序代码编译,修改系统配置等耗时较长的操作时,应避免设置TMOUT变量。必要时可以执行 "unset TMOUT"命令取消TMOUT变量设置。
四. 切换用户和用户提权
大多数Linux服务器并不建议用户直接以root用户登录。这样的目的是为了减少因为误操作而导致的破坏,以及降低特权密码在不安全的网络中被泄露的风险。这时,需要为普通用户提供一种身份切换和权限提升机制,以便在必要的时候执行管理任务。
4.1 su命令
格式: su [options...] [-] [user [args...]]
**作用:**主要用来切换用户,可以切换为指定的另外一个用户,从而具有该用户的权限。
**注:**切换时需要对目标用户的密码进行验证(root用户切换到其他用户时除外)。此外,su 切换新用户后,使用 exit退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
su 和 su- 差异
|----------|-----------------------------------------|
| su | 仅仅切换身份,不切换用户环境,会导致某些命令运行出现问题或错误 |
| su - | 加**-** 选项,切换用户身份更彻底,表示进入到目标用户的登录shell环境 |
具体操作如下:
限制使用su命令的用户
默认情况下,任何用户都允许使用su命令,这样使得有机会可以反复尝试其他用户的登录密码,存在安全隐患。因此,我们需要借助pam_wheel认证模块,来规定只允许个别用户可以使用su命令进行切换。
具体操作如下:
java
gpasswd -a lisi wheel #将lisi用户加入 wheel组 root
vim /etc/pam.d/su #编辑认证配置文件
//找到配置文件中的这两行,根据需求更改即可
# auth sufficient pam_ rootok.so
//取消其注释,这种状态下是允许所有用户间使用su命令进行切换的。
# auth required pam_ wheel.so use_uid
//取消其注释,表示只有root用户和wheel组内的用户才可以使用su命令
1. 默认情况,开启第一行,注释第二行,这种状态下是允许所有用户间使用su命令进行切换的。
2.如果开启第一,二行,表示只有root用户和wheel组内的用户才可以使用su命令
3.如果注释第一行,开启第二行,表示只有whee1组内的用户才能使用su命令,root用户也被禁用su命令
4.这两者都被注释的情况下,表示允许所有用户都能使用su命令。
但root下使用su切换到其他普通用户需要输入密码;
如果第一行不注释,则root使用su切换普通用户就不需要输入密码
(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码。)
4.2 sudo命令
格式: sudo [参数] 命令名称
|-------------|-------------------------------|
| -h | 列出帮助信息 |
| -l | 列出当前用户可执行的命令 |
| -u用户名或者uid值 | 以指定的用户身份执行命令 |
| -k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
| -b | 在后台执行指定的命令 |
| -p | 更改询问密码的提示语 |
**作用:**允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,提升普通用户的执行权限。
**与su对比下的区别:**su的缺点之一在于必须要先告知超级用户root的密码,而多一个人知道root用户的密码就多一份风险,而sudo可以使一般用户不需要知道超级用户的密码即可获得权限。
总结来说,sudo命令具有以下功能:
1)限制用户执行指定的命令
2)记录用户执行的每一条命令
3)配置文件(/etc/sudoers)提供集中的用户管理,权限和主机等参数
4)验证密码的后5分钟内(默认值)无须让用户再次验证密码
具体操作如下:
1. /etc/sudoers
可以在配置文件/etc/sudoers中添加授权
sudo机制的配置文件为/etc/sudoers,文件中的默认权限为440,需要使用专门的visudo工具进行编辑,但是要注意只有root管理员才可以使用visduo命令编辑sudo的配置文件。
/etc/sudoers 文件
典型的sudo配置记录中,每一行对应一个用户或组的sudo授权配置
用户(user):授权的用户名,或采用 "%组名"的形式(授权一个组的所有用户)。
主机(MACHINE):使用此配置文件的主机名。这部分主要是方便在多个主机间共用同一份sudoers文件,一般设置成localhost或者实际的主机名就可以。
命令(COMMANDS) :允许授权的用户通过sudo方式执行的特权命令,需要填写命令的完整路径,多个命令之间以 ","分隔。这一部分的配置记录**允许使用通配符 "*",取反符号 " !",**当需要授权某个目录下的所有命令或取消其中个别命令时特别有用。
此外,如果使用相同授权的用户较多,或者授权的命令较多时,可以采用集中定义的别名。用户,主机,命令部分都可以定义别名(必须大写)分别通过关键字User_Alias, Host_Alias ,Cmmd_Alias来进行设置。如图所示:
还值得注意的是,默认情况下,通过sudo方式执行的操作并不会记录。如果我们需要启用sudo日志来供管理员查看的话,可以在/etc/sudoers文件中增加 "Defaults logfile"设置 ,如下图所示:
2. 通过sudo执行特权命令
已经获得授权的用户,可以通过sudo方式执行特权命令,只需要把正常的命令行作为sudo命令的参数即可(普通用户执行的时候需要使用绝对路径)。
如果要查看用户自己获得哪些sudo授权,可执行 "sudo -l命令"。