系统安全及应用

212 阅读10分钟

账号安全基本措施

将用户设置为无法登录

[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工具

服务和端口号:

服务端口号
HTTP80
HTTPS443
Telnet23
FTP21
SSH(安全登录)、SCP(文件传输)、端口重定向22
SMTP25
POP3110
WebLogic7001
TOMCAT8080
WIN2003远程登录3389
Oracle数据库1521
MS SQL* SEVER数据库sever1433
MySQL 数据库sever3306

安装nmap:

 [root@localhost ~]# rpm -qa|grep nmap      //查看nmap
 [root@localhost ~]# yum install -y nmap    //安装nmap

常用选项和扫描类型

扫描类型和选项作用
-p指定扫描的端口。
-n禁用反向DNS解析(以加快扫描速度)
-sSTCP的SYN扫描 (半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。
-sTTCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。
-sFTCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对sYN数据包进行简单过滤,而忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性。
-sUUDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。
-sPICMP 扫描,类似于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 。