账号安全基本措施
将用户设置为无法登录
[root@localhost ~]# usermod -s /sbin/nologin lisi
#修改lisi的shell属性
Changing shell for lisi.
Shell changed.
[root@localhost ~]# tail -1 /etc/passwd
#查看lisi的属性
lisi:x:1001:1001::/home/lisi:/sbin/nologin
锁定用户
[root@localhost ~]# passwd -l zhaosi
锁定用户 zhaosi 的密码 。
passwd: 操作成功
[root@localhost ~]# su zhangsan
[zhangsan@localhost root]$ su zhaosi
密码:
su: 鉴定故障
[root@localhost ~]# passwd -u zhaosi
解锁用户 zhaosi 的密码。
[root@localhost ~]# usermod -L user04 //锁定用户user04
[root@localhost ~]# passwd -S user04 //查看用户user04的状态
user04 LK 2022-03-05 0 99999 7 -1 (密码已被锁定。)
[root@localhost ~]# usermod -U user04 //解锁用户user04
[root@localhost ~]# passwd -S user04 //查看用户user04的状态
user04 PS 2022-03-05 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
设置密码规则
一般通过设置密码规则来控制密码安全,主要设置以下两点:
- 设置密码有效期
- 要求用户下次登录时修改密码
对于新建用户——修改/etc/login.defs文件
[root@localhost ~]# vim /etc/login.defs
#适用于修改后生效后修改的用户
--------------------------------
25 PASS_MAX_DAYS 99999 密码最长有效期
26 PASS_MIN_DAYS 0 密码修改最小时间
27 PASS_MIN_LEN 5 密码最小长度 对root无效
28 PASS_WARN_AGE 7 密码过期前n天提醒
对于现有用户——chage命令
chage [选项] 用户名
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
[root@localhost ~]# chage -d 0 zhangsan
#强制张三下一次登录一定修改密码(密码符合复杂性要求)
[root@localhost ~]#chage -M 30 lisi
#设置密码有效期为30天
命令历史限制
1.临时修改历史命令条数。只针对当前用户,退出登录后失效。
[root@localhost ~]# export HISTSIZE=200
2.永久修改历史命令条数。编辑配置文件,设置历史命令条数。
[root@localhost ~]# vim /etc/profile //设置历史命令条数记录为200条
HISTSIZE=200
[root@localhost ~]# source /etc/profile //刷新配置文件,使文件立即生效
3.编辑 ~/.bash_logout 文件,在注销时清空命令历史。
[root@localhost ~]#vim .bash_logout
# ~/.bash_logout
echo " " >~/.bash_history
4.编辑 ~/.bashrc 文件,在登录时清空命令历史
[root@localhost ~]#vim .bashrc
echo " " >~/.bash_history
系统引导和登录控制
开关机安全控制
调整BIOS引导设置原则
-
将第一引导设备设为当前系统所在硬盘;
-
禁止从其他设备(光盘、 U盘、网络)引导启动系统;
-
将安全级别设为setup,并设置管理员密码。
禁用重启热键:Ctrl+Alt+Delete,避免因用户误操作重启。
GRUB限制
- 未经授权禁止修改启动参数
- 未经授权禁止进入指定系统
通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
GRUB菜单加密的实现
定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。
为GRUB菜单设置密码的两种方式:
- CentOS 7系统中,直接使用 “grub2-setpasswd” 命令设置grub密码;
- CentOS 6系统中,先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。(/etc/grub.d/00_header是开机时第一个启动的文件)
方法一:
CentOS 7系统中,直接使用 “grub2-setpasswd” 命令设置grub密码。
[root@localhost ~]# grub2-setpassword //使用命令直接设置GRUB密码
Enter password: //输入密码
Confirm password: //确认密码
方法二:
CentOS 6系统中,
先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,
然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,
最后使用grub2-mkconfig命令生成grub配置文件。
# 步骤1.备份两个配置文件
[root@localhost ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
[root@localhost ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak
# 步骤2.生成PBKDF2加密口令
[root@localhost ~]# grub2-mkpasswd-pbkdf2 //使用哈希算法生成密码
输入口令:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.D9BDDD44312FD353436E03F2F73F643A0DD6FB59D989ECAAADB911E95846A477137A73DCEA248BFD6FF02BE2D52052E3790AEE175B10AA7634C6B66D1D9173C7.B15B5DC77367D1960086506C3E39A718477F1D326B6548577D992BB383DBA0E3AF7EFD3E67DD768E33B391C6AC1FAC1C6BB4CFF492D2046A651DF5986ACAE35A
# 步骤3.编辑配置文件/etc/grub.d/00_header,将加密口令添加进文件。注意复制口令时不要有空格。
[root@localhost ~]# vim /etc/grub.d/00_header
-------------------------------
cat <<EOF
set superusers="root" //设置登录用户
password_pbkdf2 root grub.pbkdf2.sha512.10000.D9BDDD44312FD353436E03F2F73F643A0DD6FB59D989ECAAADB911E95846A477137A73DCEA248BFD6FF02BE2D52052E3790AEE175B10AA7634C6B66D1D9173C7.B15B5DC77367D1960086506C3E39A718477F1D326B6548577D992BB383DBA0E3AF7EFD3E67DD768E33B391C6AC1FAC1C6BB4CFF492D2046A651DF5986ACAE35A
EOF
# 步骤4.使用 grub2-mkconfig 命令生成新的 grub.cfg 配置文件。
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-869778d6675742a5968d2ea8c0e087b2
Found initrd image: /boot/initramfs-0-rescue-869778d6675742a5968d2ea8c0e087b2.img
done
限制root只在安全终端登录
安全终端配置:/etc/securetty
示例:
将终端tty5、tty6注释掉,禁止root用户从这两个终端登录。
[root@localhost ~]# vi /etc/securetty //编辑配置文件,将终端tty5、tty6注释掉
----------------------
#tty5
#tty6
禁止普通用户登录
- 建立/etc/nologin文件
- 删除nologin文件或者重启后即恢复正常
[root@localhost ~]# touch /etc/nologin //禁止普通用户登录
[root@localhost ~]# rm -rf /etc/nologin //取消普通用户登录限制
nmap工具
服务和端口号:
| 服务 | 端口号 |
|---|---|
| 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 |
安装nmap:
[root@localhost ~]# rpm -qa|grep nmap //查看nmap
[root@localhost ~]# yum install -y 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通而放弃扫描。 |
分别查看本机开放的TCP端口、UDP端口
[root@localhost ~]# nmap -sT 127.0.0.1
[root@localhost ~]# nmap -sU 127.0.0.1
检测192.168.80.0/24网段有哪些主机提供HTTP服务
[root@localhost ~]# nmap -p 80 192.168.80.0/24
[root@localhost ~]# nmap -p 80 192.168.91.100/24
检测192.168.80.0/24网段有哪些存活主机
[root@localhost ~]# nmap -n -sP 192.168.80.0/24
netstat命令
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。
常用选项
| 选项 | 作用 |
|---|---|
| -a | 显示主机中所有活动的网络连接信息(包括监听、非监听状态的服务端口)。 |
| -n | 拒绝显示别名,以数字的形式显示相关的主机地址、端口等信息。 |
| -t | 查看TCP协议相关的信息。 |
| -u | 显示UDP协议相关的信息。 |
| -p | 显示与网络连接相关联的进程号、进程名称信息(该选项需要root权限) |
| -r | 显示路由表信息。 |
| -l | 显示处于监听状态(Listen)的网络连接及端口信息。 |
常用搭配:
netstat -a //列出所有端口
netstat -at //列出所有TCP端口
netstat -au //列出所有UDP端口
netstat -ax //列出所有unix端口
netstat -lt //列出处于监听状态的TCP端口
netstat -tnlp //直接使用ip地址列出所有处于监听状态的TCP端口,且加上程序名
复制代码
示例:
1)netstat -lt,列出处于监听状态的TCP端口。
[root@localhost ~]# netstat -lt //列出处于监听状态的TCP端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN
tcp 0 0 localhost.locald:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:shell 0.0.0.0:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 [::]:shell [::]:* LISTEN
2)netstat -tnlp,直接使用ip地址列出所有处于监听状态的TCP端口,且加上程序名。
[root@localhost ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1462/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1113/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1111/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1394/master
tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN 798/rsyslogd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1113/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1111/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1394/master
tcp6 0 0 :::514 :::* LISTEN 798/rsyslogd
一台 Linux 系统初始化环境后需要做一些什么安全工作?
1.只允许bios从硬盘启动
2.给bios加上密码
3.给gurb加上密码
5.设置sudo权限,禁用不安全的命令
6.passwd shadow fstab 等重要文件 加上 i 权限不让删除
7.将一些常用端口隐藏
9.禁止su root 切换超级管理员
10.设置密码复杂性规则,长度 特殊字符 密码失效时间等密码策略
11.修改历史命令记录的条数为 10 条
12.添加普通用户登陆,禁止 root 用户登陆,更改 SSH 端口号(如果要暴露在外网,建议改下)
13.服务器使用密钥登陆,禁止密码登陆
14.设置只允许公司办公网出口 IP 能登陆服务器(看公司实际需要)也可以安装 VPN 等软件,只允许连接 VPN 到服务器上
15.做好软件层面的防护。
设置 nginx_waf 模块防止 SQL 注入。
把 Web 服务使用 www 用户启动,更改网站目录的所有者和所属组为 www 。