系统安全及应用

一、账号安全基本措施

1、系统账号清理

  • 将非登录用户的Shell设为/sbin/nologin,及将用户设置为无法登录

  • 锁定长期不使用的账户

  • 删除无用的账户

  • 锁定账户密码 本质锁定

  • shell——/sbin/nologin却比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。举例来说,各个系统账号中,打印作业有lp这个账号管理,www服务器有apache这个账号管理,他们都可以进行系统程序的工作,但就是无法登陆主机而已。

1.1 将用户设置为无法登录

chsh -s /sbin/nologin 用户名

usermod  -s  /sbin/nologin 用户名

[root@localhost ~]# tail -n4 /etc/passwd       
#查看lisi的属性

[root@localhost ~]# chsh -s /sbin/nologin lisi     
#修改lisi的shell属性
Changing shell for lisi.
Shell changed.
[root@localhost ~]# tail -n1 /etc/passwd				
#查看lisi的属性
lisi:x:1001:1001::/home/lisi:/sbin/nologin

[root@localhost ~]#usermod -s /bin/bash lisi
#也可以用usermod命令
[root@localhost ~]#tail -n1 /etc/passwd
lisi:x:1001:1001::/home/lisi:/bin/bash

1.2锁定用户

passwd   -l   用户名

usermod -L  用户名

[root@localhost ~]#passwd -l martina
锁定用户 martina 的密码 。
passwd: 操作成功
[root@localhost ~]#su lisi
[lisi@localhost root]$ su martina
密码:
su: 鉴定故障
[lisi@localhost root]$ su root
密码:
[root@localhost ~]#passwd -u martina
解锁用户 martina 的密码。
passwd: 操作成功
[root@localhost ~]#su lisi
[lisi@localhost root]$ su martina
密码:
[martina@localhost root]$ 



#也可以使用usermod -L/-U来锁定或者解锁用户

[root@localhost ~]#usermod -L martina
[root@localhost ~]#su lisi
[lisi@localhost root]$ su martina
密码:
su: 鉴定故障

[lisi@localhost root]$ su root
密码:
[root@localhost ~]#usermod -U martina
[root@localhost ~]#su lisi
[lisi@localhost root]$ su martina
密码:
[martina@localhost root]$ 

1.3 删除用户

userdel    -r   用户名

userdel -r  用户名
#连着家目录一起删除
[root@localhost ~]#ls /home
lisi  martina

[root@localhost ~]#userdel -r lisi

[root@localhost ~]#ls /home
martina

1.4锁定配置文件

-a 让文件或目录仅供附加用途。只能追加

-i 不得任意更动文件或目录

[root@localhost ~]#chattr +i /etc/passwd /etc/shadow
#chattr +i 无法对文件进行修改;若对目录设置了参数,
则仅能修改其中的子文件内容而不能新建或者删除文件
[root@localhost ~]#useradd lisi
useradd:无法打开 /etc/passwd

[root@localhost ~]#lsattr /etc/passwd /etc/shadow
----i----------- /etc/passwd
----i----------- /etc/shadow

[root@localhost ~]#chattr -i /etc/passwd /etc/shadow
关闭这个属性设定
[root@localhost ~]#lsattr /etc/passwd /etc/shadow
---------------- /etc/passwd
---------------- /etc/shadow

2、密码安全控制

2.1 设置密码规则

①对于新建用户,可以修改/etc/login.defs 文件里的内容来设置密码规则
[root@localhost ~]# vim /etc/login.defs              
#适用于修改后生效后修改的用户
	 --------------------------------
	 25 PASS_MAX_DAYS   99999
     26 PASS_MIN_DAYS   0
     27 PASS_MIN_LEN    5
     28 PASS_WARN_AGE   7
[root@localhost ~]# tail -5 /etc/shadow            
#修改密码有效期限
②对于已有用户可以使用chage命令

chage [选项] 用户名
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w: 用户密码到期前,提前收到警告信息的天数。
-E: 帐号到期的日期。过了这天,此帐号将不可用。

-d: 上一次更改的日期。
-i:   停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:   例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。

[root@localhost ~]# chage -d  0 zhangsan
#强制张三下一次登录一定修改密码(密码符合复杂性要求)

[root@localhost ~]#chage -M 30 lisi
#设置密码有效期为30天
[root@localhost ~]#cat /etc/shadow|tail -1
lisi:!!:19055:0:30:7:::
第5字段

man 5 shadow

二、命令历史

Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设 置最多只记录 200 条历史命令。

三、切换和限制用户

1、切换用户

  • su命令即switch user,命令可以切换用户身份,并且以指定用户的身份执行命令。
su [options...] [-] [user [args...]]

切换用户的方式

su username  :非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换

su - username:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换

说明:root su至其他用户无须密码;非root用户切换时需要密码

注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。

su 与 su-

即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误(例如无法使用 service 命令)

2、PAM安全认证

2.1 概念

PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API 接口,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。

                PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录,如:telnet,rlogin,fsh,ftp,点对点协议PPP,su等应用程序中,系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。重复利用别人的开发的功能,不必自己开发,会话,密码验证等功能,已经做好了调用下就可以了未来通用性,所以有了pam框架,类似淘宝 一边普通买家,一边卖家,淘宝上既是买家也是卖家

2.2 PAM相关文件

包名: pam 
模块文件目录:/lib64/security/*.so 
特定模块相关的设置文件:/etc/security/
应用程序调用PAM模块的配置文件

1. 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
2. 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
3. 注意:如/etc/pam.d存在,/etc/pam.conf将失效

ls /usr/lib64/sccurity/    认证模块的位置
/etc/pam.d/*    配置文件位置

2.3 PAM工作原理

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so

PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证

PAM认证过程示例:

1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)

2.4 专用配置文件/etc/pam.d/ 格式

type control module-path arguments

application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确配置的其它服务


type:指模块类型,即功能
control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments: 用来传递给该模块的参数

模块类型(module-type)

  • Auth 账号的认证和授权

  • Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)

  • Password 用户修改密码时密码复杂度检查机制等功能

  • Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等

  • -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用

Control: ( 控制位)

  • required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件

  • requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件

  • sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的

  • equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略include: 调用其他的配置文件中定义的配置

  • optional 可选项

第三列代表PAM模块

默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。

每一行都是一个独立的认证过程; 每一行可以区分为三个字段: 认证类型 控制类型 PAM 模块及其参数

PAM 认证类型包括四种:

认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证;

帐户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等;

密码管理(password management):主要是用来修改用户的密码;

会话管理(session management):主要是提供对会话的管理和记账。 控制类型也可以称做 Control Flags,用于 PAM 验证类型的返回结果。

1)required 验证失败时仍然继续,但返回 Fail

2)requisite 验证失败则立即结束整个验证过程,返回 Fail

3)sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续

4)optional 不用于验证,只是显示信息(通常用于 session 类型)

2.5  shell模块

  • 功能:检查有效shell
  • 帮助:man pam_shells
  • 案例:不允许使用/bin/csh的用户本地登录
  • 模块: pam_shells.so 只允许规定的shell类型通过, 是在/etc/shells 文件中存在的 类型通过

2.6  securetty模块

功能:只允许root用户在/etc/securetty列出的安全终端上登陆

案例:CentOS 7 允许root在telnet登陆

2.7  pam_nologin模块

功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆

范例: 默认此模块可以对ssh等登录有效,但不影响su登录

2.8  limit模块

功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间

3、使用sudo机制提升权限

3.1概念

sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。sudo于1980年前后推出,sudo使一般用户不需要知道超级用户的密码即可获得权限。首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是/etc/sudoers),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等。

3.2 sudo命令的用途及用法

  • 用途:以其他用户身份(如root)执行授权的命令
  • 用法:sudo  授权命令

3.3 配置sudo授权

  • 3.5可以使用visudo(通常使用visudo,因为visudo可以自动检查语法是否输入错误)
  • 也可以使用vim /etc/sudoers进行配置(此文件默认权限为440,保存时必须 wq!强制执行操作)
  • 可以使用通配符“ * ”号任意值和“ !”号进行取反操作
  • 权限生效后,输入密码后5分钟可以不用重新输入密码

3.4 sudo特性

  • sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员

  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器

  • sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票

  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440

3.5 配置文件

  • 用户: 直接授权指定的用户名,或采用“&组名"的形式(授权一个组的所有用户)。
  • 主机名:使用此规则的主机名。没配置过主机名时可用localhost,有配过主机名则用实际的主机名,ALL则代表所有主机。
  • (用户):用户能够以何种身份来执行命令。此项可省略,缺省时以root用户的身份来运行命令。
  • 命令程序列表:允许授权的用户通过sudo方式执行的特权命令,需填写命令程序的完整路径,多个命令之间以逗号“。"进行分隔。ALL则代表系统中的所有命令。

3.6 查看当前sudo配置文件,启用sudo操作日志

启用sudo操作日志

  • 需启用Defaults logfile配置
  • 默认日志文件:/var/log/sudo
  • 操作:在/etc/sudoers末尾添加Defaults logfile="/var/log/sudo"

查询授权的sudo操作

  • sudo -l
3.6.1  配置文件使zhu1可以通过sudo命令使用ifconfig

第一步:切换至用户lisi进行测试

 第二步:在/etc/sudoers末尾插入相关配置,然后强制保存退出

  第三步:再次切换至用户lisi进行验证测试

 3.6.2  示例2:设置wheel组进行sudo操作时无需密码验证,并将zhangsan用户添加到wheel组中测试

四、开关机安全控制

1.调整BIOS引导设置 

  • 将第一引导设备设为当前系统所在硬盘
  • 禁止从其他设备(光盘、U盘、网络)引导系统
  • 将安全级别设为setup,并设置管理员密码(进boot中有一个Set Supervisor Password)


2.GRUB限制

  • 使用grub2-mkpasswd-pbkdf2生成密钥
  • 修改/etc/grub.d/00_header文件中,添加密码记录
  • 生成新的grub.cfg配置文件

3.终端登录安全控制

3.1 限制root只在安全终端登录

  • 安全终端配置:/etc/securetty

  • tty1~ 6是文本型控制台,tty7 是X Window图形显示管理器。可以通过CtrI+Alt+F1 (F1-F7键) 切换到对应的登录控制台。

  • 示例:禁止root在tty2和tty3终端登录

3.2 禁止普通用户登录

  • 建立/etc/nologin文件
  • 删除nologin文件或者重启后即恢复正常

4.网络扫描—NMAP

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-16 21:08:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-16 21:08:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-16 21:08:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-16 21:08:03       20 阅读

热门阅读

  1. WSL dockers容器挂载windows下的文件

    2024-01-16 21:08:03       30 阅读
  2. Spring的纯注解配置

    2024-01-16 21:08:03       30 阅读
  3. Go语言中的Pool

    2024-01-16 21:08:03       32 阅读
  4. Redis面试题14

    2024-01-16 21:08:03       30 阅读
  5. Nginx Ingress轻松上手 | Kubernetes服务管理指南

    2024-01-16 21:08:03       33 阅读
  6. C++面试之线程池、智能指针、设计模式

    2024-01-16 21:08:03       32 阅读
  7. Redis面试题13

    2024-01-16 21:08:03       27 阅读
  8. 二叉树遍历C++

    2024-01-16 21:08:03       38 阅读