文章目录
用户账号安全
设置账号有效期
- 使用chage工具
– -d 0 , 强制修改密码
– -E yyyy-mm-dd , 指定失效日期(-1)取消
chage命令的语法格式:
chage –l 账户名称
//查看账户信息
chage –E 时间 账户名称
//修改账户有效期 - 失效的用户将无法登录
使用chage命令将用户zhangsan的账户设为当前已失效(比如已经过去的某个时间):
useradd zhangsan
chage -E 2019-12-31 zhangsan
chage -l zhangsan
Last password change : May 15, 2017
Password expires : never
Password inactive : never
Account expires : Dec 31, 2019
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
- 定义默认有效期(扩展知识)
/etc/login.defs这个配置文件,决定了账户密码的默认有效期。
cat /etc/login.defs
PASS_MAX_DAYS 99999 #密码最长有效期
PASS_MIN_DAYS 0 #密码最短有效期
PASS_MIN_LEN 5 #密码最短长度
PASS_WARN_AGE 7 #密码过期前几天提示警告信息
UID_MIN 1000 #UID最小值
UID_MAX 60000 #UID最大值
账号的锁定/解锁
- 使用passwd命令
– -l锁定、-u 解锁、-S看状态 - 锁定用户账号
使用passwd或usermod命令将用户zhangsan的账户锁定
passwd -l zhangsan #锁定用户账号lock
锁定用户 zhangsan 的密码。
passwd: 操作成功
passwd -S zhangsan #查看状态status
zhangsan LK 2018-02-22 0 99999 7 -1 (密码已被锁定。)
- 解除对用户zhangsan的锁定
passwd -u zhangsan #解锁用户账号
解锁用户 zhangsan 的密码 。
passwd: 操作成功
passwd -S zhangsan #查看状态
zhangsan PS 2018-08-14 0 99999 7 -1 (密码已设置,使用 SHA512 加密。)
伪装登录提示
- 配置文件/etc/issue、/etc/issue.net
– 分贝使用于本地、远程登录
– 默认会提示内核、系统等版本信息
cat /etc/issue #确认原始文件
Red Hat Enterprise Linux Server release 6.5 (Santiago)
Kernel \r on an \m
cp /etc/issue /etc/issue.origin #备份文件
vim /etc/issue #修改文件内容
Windows Server 2012 Enterprise R2
NT 6.2 Hybrid
测试版本伪装效果
文件系统安全
- 禁用非必要的系统服务
– 使用systemctl、chkconfig工具
锁定/解锁保护文件
- 语法格式:
命令 | 说明 |
---|---|
chattr +i 文件名 | 锁定文件(无法修改、删除等) |
chattr -i 文件名 | 解锁文件 |
chattr +a 文件名 | 锁定后文件仅可追加 |
chattr -a 文件名 | 解锁文件 |
lsattr 文件名 | 查看文件特殊属性 |
- 使用+i锁定文件,使用lsattr查看属性
chattr +i /etc/resolv.conf
lsattr /etc/resolv.conf
----i---------- /etc/resolv.conf
- 使用+a锁定文件(仅可追加),使用lsattr查看属性
chattr +a /etc/hosts
lsattr /etc/hosts
-----a---------- /etc/hosts
- 测试文件锁定效果
rm -rf /etc/resolv.conf
rm: 无法删除"/etc/resolv.conf": 不允许的操作
echo xyz > /etc/resolv.conf
-bash: resolv.conf: 权限不够
rm -rf /etc/hosts #失败
echo "192.168.4.1 xyz" > /etc/hosts #失败
echo "192.168.4.1 xyz" >> /etc/hosts #成功
用户切换与提权
su切换用户身份
- 格式如下:
su - [账户名称]
su - [账户名称] -c '命令'
- 从普通用户切换为root账户身份(如果没有普通账户则需要先创建)
[zhangsan@proxy ~]$ whoami
zhangsan
su - #切换账户,默认切换为root账户
密码: #输入root的密码
[root@proxy ~]# whoami #确认结果
root
- 以普通身份创建文件(如果没有普通账户则需要先创建),以root身份重启服务
su - zhangsan -c "touch /tmp/test.txt" #管理员切换普通用户
ll /tmp/test.txt
su - -c "systemctl restart sshd" #以管理员重启服务
密码:
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
active: active (running) since 五 2018-01-19 08:59:40 CST; 1 months 4 days ago
- 安全日志/var/log/secure
– 记录su验证、shell开启与关闭 - 日志/var/log/sudo
–专门看提权使用情况(后面将如何开启)
sudo提升执行权限
概述
- Super or another Do , 超级执行
– 管理员预先为用户设置执行许可
– 被授权用户有权执行授权的命令,验证自己的口令 - 执行提权命令
– 用法:sudo 提权命令 - 查看提权命令
– 用法:sudo -l
配置sudo提权
- 修改方法:
– visudo
– vim /etc/sudoers - 授权记录格式:
– 用户 主机列表=命令列表
grep ^root /etc/sudoers
root ALL=(ALL) ALL
括号里的省略时代表root
第一个ALL:指定的是用户所在的主机
第二个ALL:指定以什么用户身份执行sudo,即使用sudo后可以享有所有账号下的权限。如果要排除个别用户,可以在括号内设置,比如ALL=(ALL,!root,!ops)
第三个ALL:L指定的是执行的命令,可以执行所有的命令 - 案例
vim /etc/sudoers
mike localhost,zaclient1=/sbin/*,!/sbin/ifconfig eth1
#用户mike可以在本机使用/sbin/下面所有的命令,除了不能使用ifconfig eth1
softadm ALL=/usr/bin/vim /etc/my.cnf,/usr/bin/systemctl * mariadb,/usr/bin/rpm,/usr/bin/yum
#用户softadm可以在任意主机使用vim 编辑/etc/my.cnf , 可以systemctl命令控制mariadb , 可以使用rpm,yum命令
- whell组
wheel组默认是使用的,权限太大,生产环境下慎用
vim /etc/sudoers
%wheel ALL=(ALL) NOPASSWD: ALL
分析sudo提权的使用情况
为sudo机制启用日志记录,以便跟踪sudo执行操作
- 修改全局配置,启用日志
vim /etc/sudoers
Defaults logfile="/var/log/sudo" #添加
SSH访问控制
SSH防护概述
- 存在的安全隐患
– 密码嗅探、键盘记录
– 暴力枚举账号、猜解密码 - 常见的防护措施
– 用户限制、黑白名单
– 更改验证方式(密码–>密钥对)
– 防火墙…
配置基本安全策略
- 调整sshd服务配置,并重载服务
vim /etc/ssh/sshd_config
.. ..
Protocol 2 #SSH协议
PermitRootLogin no #禁止root用户登录
PermitEmptyPasswords no #禁止密码为空的用户登录
UseDNS no #不解析客户机地址
LoginGraceTime 1m #登录限时
MaxAuthTries 3 #每连接最多认证次数
.. ..
systemctl restart sshd
- 测试基本安全策略
尝试以root用户SSH登录,失败:
ssh root@192.168.4.5
root@192.168.4.5's password:
Permission denied, please try again.
将服务器上用户kate(如无该账户则先创建)的密码设为空,尝试SSH登录,也会失败:
passwd -d kate #清空用户口令
清除用户的密码 kate。
passwd: 操作成功
ssh kate@192.168.4.5
kate@192.168.4.5's password:
Permission denied, please try again.
sshd黑白名单配置
- 配置文件/etc/ssh/sshd_config
vim /etc/ssh/sshd_config
.. ..
AllowUsers zhangsan tom useradm@192.168.4.0/24 #定义账户白名单
##DenyUsers USER1 USER2 //定义账户黑名单
##DenyGroups GROUP1 GROUP2 //定义组黑名单
##AllowGroups GROUP1 GROUP2 //定义组白名单
systemctl restart sshd
验证SSH访问控制,未授权的用户将拒绝登录。
ssh useradm@192.168.4.5 #已授权的用户允许登录
useradm@192.168.4.5's password:
exit
ssh root@192.168.4.5 #未授权的用户被拒绝登录
root@192.168.4.5's password:
Permission denied, please try again.
SSH密钥对验证
- 口令验证
– 检查登录用户的口令是否一致 - 密钥验证
– 检查客户端私钥与服务器上的公钥是否匹配
创建SSH密钥对
- 使用工具ssh-keygen
– 可以手动指定加密算法(-t rsa 或 -t dsa)
– 若不指定,默认采用RSA加密 - 交互式:
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #直接回车将口令设为空
Enter same passphrase again: #再次回车确认
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
63:6e:cf:45:f0:56:e2:89:6f:62:64:5a:5e:fd:68:d2
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . . . |
| = = |
| S = B . |
| o B = . o |
| + + = E .|
| . + + o |
| o |
+-----------------+
ls -lh ~/.ssh/id_rsa* #确认密钥对文件
-rw-------. 1 root root 1.8K 8月 15 10:35 /root/.ssh/id_rsa
-rw-r--r--. 1 root root 403 8月 15 10:35 /root/.ssh/id_rsa.pub
ssh-copy-id root@192.168.4.5 #传公钥
root@192.168.4.5's password:
Now try logging into the machine, with "ssh 'root@192.168.4.5'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
非交互式:
ssh-keygen -f /root/.ssh/id_rsa -N ''
SELinux安全防护
什么是SELinux
- Security-Enhanced Linux
– 一套强化Linux安全的扩展模块
– 美国国家安全局主导开发 - SELinux的运作机制
– 集成到Linux内核(2.6及以上)
– 操作系统提供可制定的策略、管理工具
红帽的SELinux策略集
- SELINUXTYPE=targeted
– 推荐,仅保护最常见/关键的网络服务,其他不限制
– 主要软件包:
selinux-policy、selinux-policy-targeted、libselinux-utils、
coreutils、policycoreutils
]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
vim /etc/selinux/config
SELINUX=enforcing #设置SELinux为强制模式
SELINUXTYPE=targeted #保护策略为保护主要的网络服务安全
从disabled变enforcing或permissive,需要该配置文件,之后再在/root/,touch /.autorelabel
,再重启系统即可.
- 临时调整
使用setenforce 0|1
0:代表宽松模式
1:代表强制模式
getenforce #看当前状态
SELinux策略设置
安全上下文
- Security Context,安全上下文
– 为文件/目录/设备标记访问控制属性 - 属性构成
– 用户:角色:访问类型:选型
ls -Z /bin/ls
-rwxr-xr-x. root root system_u:object_r:bin_t:s0 /bin/ls
修改安全上下文
- 使用chcon工具
– -t,指定访问类型
– -R,递归修改
– --reference=参看文档 操作文档
chcon -t public_content_t /var/ftp/d2.tar.gz
restorecon /var/ftp/log2.tar.gz
chcon --reference=/var/ftp/log1.tar.gz /var/ftp/log2.tar.gz
- 一般操作规律
– 移动的文件,原有的上下文属性不变
– 复制的文件,自动继承目标位置的上下文
重置安全上下文
- 使用restorecon工具
– 恢复为所在位置的默认上下文属性
restorecon /var/ftp/log2.tar.gz
– -R.递归修改 - /.autorelabel文件
– 下次重启后全部重置
调整SELinux布尔值
- 使用getsebool查看
– -a ,列出所有布尔值 - 使用setsebool设置
– -P,永久更改,重启后任然有效
案例
实现在selinux开启时,ftp能上传和新建目录功能
- 配置一个允许匿名上传的vsftpd服务作为测试环境
setenforce 1
yum -y install vsftpd
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES #开启匿名访问
anon_upload_enable=YES #允许上传文件
anon_mkdir_write_enable=YES #允许上传目录
systemctl start vsftpd
#默认Vsftpd共享目录为/var/ftp/
- 从/root目录下移动2个包文件到FTP下载目录,调整文件的安全上下文
由root用户创建两个测试压缩包,一个直接建立到/var/ftp/目录下,另一个先在/root/下建立,然后移动至/var/ftp/目录。
//测试文件1,直接在ftp目录下创建文件
tar -czf /var/ftp/log1.tar /var/log
ls -Z /var/ftp/log1.tar
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 log1.tar
//测试文件2,在/root下建立,然后移动至/var/ftp目录
tar -czf log2.tar /var/log
mv log2.tar /var/ftp/
ls -Z /var/ftp/log2.tar
-rw-r--r--. 1 root root unconfined_u:object_r:admin_home_t:s0 log2.tar
- 通过FTP方式测试下载
使用wget命令分别下载这两个包文件,第二个包将会下载失败(看不到文件)
wget ftp://192.168.4.5/log1.tar #下载第一个文件,成功
wget ftp://192.168.4.5/log2.tar #下载第二个文件,失败
使用ftp工具
yum -y install ftp
ftp 192.168.2.100
Connected to 192.168.2.100 (192.168.2.100).
220 (vsFTPd 3.0.2)
Name (192.168.2.100:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>ls #显示
ftp>get 文件名 #下载文件