1.系统账号安全的基本操作
1.1将用户设置成无法登录
所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。举例来说,各个系统账号中,打印作业有lp这个账号管理,www服务器有apache这个账号管理,他们都可以进行系统程序的工作,但就是无法登陆主机而已。
所以设置用户无法登录就是将用户的shell
类型设置成/sbin/nologin
通过usermod -s
命令实现
usermod -s /sbin/nologin 用户名
示例操作:
1.2锁定和解锁用户
这里说的锁定用户有两种方式,都有对应的解锁方式,实现锁定的根本方式是锁定用户的密码
锁定用户:
passwd
-l
用户名
usermod
-L
用户名
解锁用户:
passwd
-u
用户名
usermod
-U
用户名
1.3 删除用户账号
用于删除一些无用账号,例如项目结束,不在使用的账号
使用用户管理中删除的命令userdel
实现
命令:
userdel
用户名
userdel
-r
用户名
PS:需注意,userdel
-r
用户名
会在删除用户的同时删除该用户的家目录,不加选项-r
则不会删除用户的家目录,那么用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID
和GID
1.4 锁定配置文件
软件的配置文件一般都比较重要,chattr
命令用于修改文件或目录的属性,设置文件的特殊属性,使其具有更高级的保护或控制,chattr
中用+
表示添加,-
表示移除
格式:chattr
选项
文件或文件夹
选项:
+
:添加指定属性。-
:移除指定属性。i
:将文件设置为不可修改(immutable),意味着文件无法被删除、修改、重命名或链接,除非先移除该属性。a
:将文件设置为仅追加(append-only),只能在文件末尾添加内容,无法修改或删除已有内容。s
:将文件设置为同步更新(synchronous),要求每次文件写入都同步到磁盘,包含文件内容和元数据的更新。u
:设置文件为可以恢复(undeletable),即使文件被删除,仍然可以通过恢复工具恢复文件。c
:启用文件的压缩,文件在磁盘上以压缩形式存储,只有读取时才会进行解压缩操作。R
:递归修改目录及其子目录下的文件属性。
示例用法:
chattr +i file.txt
chattr -i file.txt
chattr +a file.txt
chattr -a file.txt
chattr +s file.txt
chattr -s file.txt
1.5 密码安全控制
密码安全控制,其实就是设置密码规则
部分规则:
- 设置密码有效期
- 要求用户下次登录时修改密码
- 密码长度
- 密码复杂性
对于新建用户
通过修改/etc/login.defs
文件中的内容来设置密码规则
查看/etc/login.defs
文件
修改密码有效期命令示例:
#修改配置文件
[root@localhost ~]# vim /etc/login.defs
----------------------------
PASS_MAX_DAYS 30 //将密码最大有效期修改为30天
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
#
#Esc :wq保存退出
#创建新用户wanghu
[root@localhost ~]# useradd wangwu
[root@localhost ~]# grep 'wangwu' /etc/shadow
lucy:!!:19056:0:30:7:::
#密码有效期已经变成30天了
对已有用户
已有用户直接使用chage
命令就可以设置密码的规则
格式:chage
选项
用户名
选项:
- -m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
- -M:密码保持有效的最大天数。
- -w:用户密码到期前,提前收到警告信息的天数。
- -E:帐号到期的日期。过了这天,此帐号将不可用。
- -d:上一次更改的日期。
- -i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
- -l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
示例:
-d选项
#强制张三下一次登录一定修改密码(密码符合复杂性要求)
[root@localhost ~]# chage -d 0 zhangsan
#-d选项后的 0 有特殊的含义,
-M选项
#将zhangsan用户的密码有效期设置为30天
[root@localhost ~]# chage -M 30 zhangsan #查看用户zhangsan的密码有效期
[root@localhost ~]# grep zhangsan /etc/shadow
zhangsan:!!:19030:0:30:7:::
#用户张三的密码有效期已被修改为30天
-l选项
#查看用户zhangsan的密码设置信息
[root@localhost ~]# chage -l zhangsan
最近一次密码修改时间 :密码必须更改
密码过期时间 :密码必须更改
密码失效时间 :密码必须更改
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
1.6 历史命令限制
Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在 命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE
控制,默认为 1000 条。通过修改/etc/profile
文件中的 HISTSIZE
变量值,可以影响系统中的所有用户。例如,可以设 置最多只记录 200 条历史命令。
查看历史命令的命令:history
历史命令存放于家目录下的.bash_history
文件,history
命令实际上是导出了该文件总的内容,所以清空该文件其实就是清空了命令历史。
历史命令是很便利的一种机制,不过考虑到潜在的风险,所以我们一般采用两种方式来限制它
- 减少记录的命令条数。
- 注销时自动清空命令历史,或登录时自动清空命令历史。
PS:任何需要永久生效的命令都需要写到对应的配置文件中,且在配置文件中添加或修改以后,一定要刷新,否则不生效
1.# 永久修改历史命令条数。编辑配置文件,设置历史命令条数。
#设置历史命令条数记录为200条
[root@localhost ~]# vim /etc/profile
················
export HISTSIZE=200
#export是使添加的变量不管在第几个bash终端(即shell会话)中都生效,系统变量可以不加,但是如果你没有经验,无法判断到底是不是系统变量,建议全加(没有坏处)
#进入末行模式,保存并退出
Ese :wq
#刷新配置文件,使生效
[root@localhost ~]# source /etc/profile
# . = source
所以
. .bashrc = source .bashrc 即刷新文件 在应用修改后使用 效果等同于重启刷新
2.# 编辑 .bash_logout 文件使在注销时自动清空历史命令
[root@localhost ~]# vim ~/.bash_logout
echo " " >root/.bash_history
#进入末行模式,保存并退出
Ese :wq
#刷新配置文件,使生效
[root@localhost ~]# source /etc/profile
3.#编辑 .bashrc 文件使在登录时自动清空历史命令
[root@localhost ~]# vim ~/.bashrc
echo " " >root/.bash_history
#进入末行模式,保存并退出
Ese :wq
#刷新配置文件,使生效
[root@localhost ~]# source /etc/profile
4.#编辑 /etc/profile 文件使系统在闲置600秒后自动注销
[root@localhost ~]# vi /etc/profile
.................................
export TMOUT=600
#刷新配置文件,使生效
[root@localhost ~]# source /etc/profile
.brashrc
:中添加的设置只对自己(当前用户) 生效
/etc/profile
:中添加的设置对所有用户都生效
1.7 su(Substi User)切换用户
su(Substi User)切换用户身份,并且以指定用户的身份
切换用户的时候,root用户切换到任何用户都不需要验证密码,其他用户切换到其他用户都需要验证目标用户的密码
格式:su
选项
目标用户
选项:-
su
命令只有一个选项
su
目标用户
:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
su
-
目标用户
:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
PS:使用su
命令切换目标用户后,使用exit
命令退回到原用户,不要再使用su
命令切换到原用户,否则会生成很多bash子进程,环境可能会混乱
示例:
#以不加-的方式,切换至张三用户
[root@localhost ~]# su zhangsan
[zhangsan@localhost root]$ pwd //不改变当前工作目录
/root
[zhangsan@localhost root]$ exit
exit
#以加 - 切换至zhangsan用户
[root@localhost ~]# su - nancy
上一次登录:二 8月 1 16:32:38 CST 2023pts/0 上
[zhangsan@localhost root]$ exit
/home/zhangsan
#家目录也切换到的zhangsan
#确定当前用户
[zhangsan@localhost ~]$ whoami
zhangsan
1.7.1 限制使用su
命令的用户
su 命令的安全隐患
- 默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。
- 为了加强su 命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su 命令进行切换。
限制使用su命令的用户(通过修改/etc/pam.d/su
文件):
- 将允许使用
su
命令的用户加入wheel组。 - 启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户。
/etc/pam.d/su
文件内容:
1.8 sudo 用户提权
sudo用户提权即使用户以超级管理员的身份去执行命令
格式:sudo
选项
命令
选项:
- -V:显示版本编号
- -l:显示出自己(执行 sudo 的使用者)的权限
- -k:将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
- -p:可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
- -u:用户名 以指定用户的权限
- -s:执行环境变数中的 SHELL 所指定的 shell
sudo特性:
- sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
- sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
- sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
- sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在
/etc/sudoers
,属性必须为0440
sudo与su的区别:
身份验证方式: su
命令(切换用户)需要输入目标用户的密码来切换到目标用户的身份。
sudo
命令(以超级用户执行)需要输入当前用户的密码来验证身份。
执行命令的方式: su
命令会切换用户的环境,包括当前工作目录和环境变量等。在切换用户后,需要重新设置所需的工作环境。
sudo
命令在当前用户的环境下以超级用户身份执行命令,不会切换用户的环境。这使得在执行完命令后,可以继续以当前用户身份继续工作,而不需要重新设置环境。
授权: su
命令切换到目标用户后,拥有目标用户的完整权限。
sudo
命令可以按需授予用户对特定命令或特定命令组合的访问权限
/etc/sudoers
文件内容即各字段含义
文件内容添加设置支持通配符
[root@localhost ~]#visudo
...........
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
//允许root在任何地方使用任何命令
..............
//格式:
//用户 登入主机 = (代表用户) 命令
user host = (runas) command
//释义:
user: 运行命令者的身份
host: 通过哪些主机 多个 192.168.91.100 - 110 localhost
(runas):以哪个用户的身份
command: 运行哪些命令
//也可以对组进行操作
%在前表示组
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
//举例:
%gtest ALL=(ALL) ALL
gtest组内的成员通过任何主机登入系统后,在命令前加sudo可以以任何用户的身份运行所有命令,
四个字段
- user字段: 用户名或UID %组名或者%GID
- host字段: IP地址或主机名 ALL代表任意主机
- runas代表用户字段: 用户名或UID ALL代表任意用户
- 命令字段(绝对路径) : command name (命令) directory (文件夹里的命令) sudoedit (可以编辑sudoers这个文件,变相变成管理员) Cmnd_Alias (命令别名)
sudo别名(自定义用户组单独给几个用户某些权限)
sudo的别名有四种类型:
- User_Alias(用户):
- Runas_Alias(代表用户)
- Host_Alias(登录主机)
- Cmnd_Alias(命令)(一定要绝对路径)
使用别名的时候,!
是取反的意思,!后面的不生效,例如!/sbin/init
,表示除了init
命令不允许用,其余无限制
举例:
#主机yyy和localhost的名为zhangsan,wangwu和lisi的用户可以使用/sbin下,除了reboot,poweroff,init和rm之外的命令
Host_Alias MYHOSTS = yyy,localhost
User_Alias MYUSERS = zhangsan,wangwu,lisi
Cmnd_Alias MYCMNDS = /sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm
MYUSERS MYHOSTS=NOPASSWD:MYCMNDS
sudo子目录
为了方便管理,不会把所有的用户提权都放在/etc/sudoers
文件中,所以我们在/etc/sudoers.d/
下创建子目录,针对特定部分,比如给公司的测试(text)部门用户进行授权
示例:
# 创建子目录
[root@localhost ~]# vim /etc/sudoers.d/test
#允许用户zhangsan可以以root身份运行挂载命令
zhangsan ALL=(root) /bin/mount
#设置属主和属组只读权限,加固安全
[root@localhost ~]# chmod 440 /etc/sudoers.d/test
[root@localhost ~]# ll /etc/sudoers.d/test
-r--r----- 1 root root 33 3月 7 17:51 /etc/sudoers.d/test
查看sudo操作历史
查看sudo操作历史需要启动去sudo
命令默认的操作日志/var/log/sudo
#进入sudo配置文件
[root@localhost log]# visudo
-----------------------------
#一般在最后一行添加 Default logfile 配置,启动sudo操作日志
Default logfile="/var/log/sudo"
#Esc进入末行模式,:保存(w)退出(q)
Esc :wq
//以lisi用户的身份创建文件
[root@localhost ~]# sudo -u lisi touch /opt/1.txt
[root@localhost ~]# tail -4 /var/log/sudo //日志成功记录sudo操作
Mar 12 23:12:06 : root : TTY=pts/0 ; PWD=/root ; USER=lisi ; COMMAND=/bin/touch
/opt/1.txt
Mar 12 23:13:49 : root : TTY=pts/0 ; PWD=/root ; USER=lisi ; COMMAND=/bin/touch
/opt/1.txt
sudo注意事项sudoedit命令(不建议使用)
允许用户使用suoedit
命令,就是允许该用户可以修改/etc/sudoers
(sudo
命令配置文件)那么该用户基本就称为管理员了,可以自己给自己添加可执行命令,安全性比较差,不建议使用
[root@localhost sudoers.d]#vim /etc/sudoers.d/test
lisi ALL=(root) sudoedit
[root@localhost ~]#su lisi
[lisi@localhost root]$ sudoedit /etc/sudoers
1.9 grub加密
[root@localhost ~]#grub2-setpassword
//直接设置密码
PAM安全认证
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。
相关文件:
- 包名:
pam
- 模块文件目录:
/lib64/security/*.so
- 特定模块相关的设置文件:
/etc/security/
(主要配置文件,只有功能强大的pam模块才会有) - man 8 加模块名 可以查看帮助
- 应用程序调用PAM模块的配置文件
/etc/pam.conf
,默认不存在,一般不使用主配置/etc/pam.d/APP_NAME
/etc/pam.d
存在,它优先生效,/etc/pam.conf
将失效PAM认证顺序:
Service(服务)
PAM(配置文件)
pam_*.so
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d
下),最后调用认证文件(位于/lib64/security
下)进行安全认证
required
:无论验证成功还是失败 会继续往下验证
requisite
:验证成功则继续,验证失败则立即结束整个验证过程
sufficient
:验证成功则立即返回,否则忽略结果并继续
optional
:一般不用于验证,只显示信息
配置文件内容解析
以 /etc/pam.d/login
文件举例
- 第一列:认证类型(module-type)
Auth
:账号的认证和授权Account
:帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)Password
:用户修改密码时密码复杂度检查机制等功能Session
:用户会话期间的控制,如:最多打开的文件数,最多的进程数等-type
表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用。- 第二列:Control:( 控制位)
required
:一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件requisite
:一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件sufficient
:一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的equired
和requisiteoptional
:表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略include: 调用其他的配置文件中定义的配置optional
可选项- 第三列:PAM模块(根据第一列类型,调用的PAM对于模块)
列举部分PAM模块
limits模块
功能:
限制用户的资源使用,例如:可打开的文件数量,可运行的进程数量,可用内存空间
可用通过ulimit
命令查看和设置不同类型资源限制,但ulimit
是linux shell
的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。
ulimit
的设定值是 per-process
的,也就是说,每个进程有自己的limits
值。使用ulimit
进行修改,立即生效。
ulimit
只影响shell进程及其子进程,用户登出后失效。
可以在profile
中加入ulimit
的设置,变相的做到永久生效
ulimit
命令格式:ulimit
选项
选项:
- -H 设置硬件资源限制
- -S 设置软件资源限制.
- -c 设置core文件的最大值.单位:blocks
- -d 设置数据段的最大值.单位:kbytes
- -f 设置创建文件的最大值.单位:blocks
- -l 设置在内存中锁定进程的最大值.单位:kbytes
- -m 设置可以使用的常驻内存的最大值.单位:kbytes
- -n 设置内核可以同时打开的文件描述符的最大值.单位:n
- -p 设置管道缓冲区的最大值.单位:kbytes
- -s 设置堆栈的最大值.单位:kbytes
- -t 设置CPU使用时间的最大上限.单位:seconds
- -u 最大用户进程数
- -v 设置虚拟内存的最大值.单位:kbyte
- -a 显示当前所有的资源限制
示例:
[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) 7168
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 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) 7168
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
//open files (-n) 1024
这一条限制了进程能打开的文件数,1024远远不够使用。所以得为其增加内核可以同时打开的文件
#增加
[root@localhost ~]#ulimit -n 100000
[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) 7168
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 100000
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) 7168
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
limits 生产中的 建议设置(仅供参考)
PS:通信是相互得,所以两端必须一样设置
* 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
shell模块
功能:检查有效shell
帮助:man pam_shells
案例:不允许使用/bin/csh的用户本地登录
模块: pam_shells.so 只允许 规定的shell类型通过, 是在/etc/shells 文件中存在的 类型通过
[root@localhost ~]#vim /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
//去掉/bin/csh
那么shell类型为csh的用户将无法登录
1.10 nmap 端口扫描,安全检测工具
nmap
需要安装才可以使用
yum -y install nmap //安装nmap
nmap
的格式和常用选项
格式:nmap
选项
扫描方式
选项:
- -p:指定扫描的端口。
- -n:禁用反向DNS解析(以加快扫描速度)
- -sS:TCP的SYN扫描 (半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。
- -sT:TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。
- -sF:TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对sYN数据包进行简单过滤,而忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性。
- -sU:UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。
- -sP:ICMP 扫描,类似于ping检测,快速判断目标主机是否存活,不做其他扫描。
- -P0:跳过ping检测, 这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法ping通而放弃扫描。
常用服务和端口号:
服务 | 端口号 |
---|---|
HTTP | 80 |
HTTPS | 443 |
Telnet | 23 |
FTP | 21 |
SSH(安全登录)、SCP(文件传输)、端口重定向 | 22 |
SMTP | 25 |
POP3 | 110 |
WebLogic | 7001 |
TOMCAT | 8080 |
WIN2003远程登录 | 3389 |
Oracle数据库 | 1521 |
MS SQL* SEVER数据库sever | 1433 |
MySQL 数据库sever | 3306 |