Linux 系统安全及应用(账号安全和引导登录控制)(3)

本文涉及的产品
运维安全中心(堡垒机),免费版 6个月
简介: 1 账号安全基本措施1.1 系统账号清理1.1.1 将非登录用户的Shell设为/sbin/nologin在我们使用Linux系统时,除了用户创建的账号之外,还会产生系统或程序安装过程中产生的许多其他账号,除了超级用户root外,其他账号都是用来维护系统运作的,一般不允许登录,常见的非登录用户有bin、adm、mail、lp、nobody、ftp等。查看/etc/passwd 文件,可以看到多个程序用户。


2.2.3 sudo子目录

如果对所有用户进行提权都放在/etc/sudoers 一个文件中,非常不便于管理。这时可以在/etc/sudoers.d/ 下创建子目录。例如针对 测试部门的员工进行授权,可以创建/etc/sudoers.d/test;针对hr部门的员工进行授权,可以创建/etc/sudoers.d/hr。便于分类管理。

[root@localhost ~]# vim /etc/sudoers.d/test          //创建子目录
 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
复制代码


网络异常,图片无法展示
|


注:

如果允许用户使用sudoedit命令,则该用户能够修改配置文件/etc/sudoers。变相变成管理员,十分危险,建议不要设置该命令。

[root@localhost sudoers.d]#vim /etc/sudoers.d/hr
 lisi ALL=(root)  sudoedit
 [root@localhost ~]#su lisi
 [lisi@localhost root]$ sudoedit /etc/sudoers   //sudoedit可以修改配置文件,十分危险
复制代码


2.2.4 查看sudo操作记录

  • 需要启用 Default logfile 配置
  • 默认日志文件:/var/log/sudo
[root@localhost log]# visudo          //修改配置文件
-----------------------------
Default logfile="/var/log/sudo"       //在最后一行添加 Default logfile 配置
复制代码


网络异常,图片无法展示
|


测试查看日志是否正常记录:

[root@localhost ~]# sudo -u nancy touch /tmp/f2.txt     //以nancy用户的身份创建文件
[root@localhost ~]# tail -4 /var/log/sudo               //日志成功记录sudo操作
Mar 12 23:12:06 : root : TTY=pts/0 ; PWD=/root ; USER=nancy ; COMMAND=/bin/touch
    /tmp/f1.txt
Mar 12 23:13:49 : root : TTY=pts/0 ; PWD=/root ; USER=nancy ; COMMAND=/bin/touch
    /tmp/f2.txt
复制代码


网络异常,图片无法展示
|


2.3 PAM安全认证

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

官网:www.linux-pam.org/

[root@localhost ~]#rpm -qi pam     //查看当前系统pam
 [root@localhost ~]#rpm -ql pam     //查看模块
 [root@localhost ~]#ls /usr/lib64/security/*.so|wc -l   //60个模块是二进制文件,不会直接修改
 60
 [root@localhost ~]#ls /etc/security/    //和上面的模块配合使用,有些比较简单的模块没有配置文件
 access.conf       console.perms.d  namespace.d     sepermit.conf
 chroot.conf       group.conf       namespace.init  time.conf
 console.apps      limits.conf      opasswd
 console.handlers  limits.d         pam_env.conf
 console.perms     namespace.conf   pwquality.conf
 #我们去修改配置文件
 /etc/security
 /etc/pam.d/*
 [root@localhost ~]#cd /etc/pam.d/   //这里的文件是应用程序怎么调用模块的
 [root@localhost pam.d]#ls
 atd                     login              smtp
 chfn                    other              smtp.postfix
 chsh                    passwd             sshd
 config-util             password-auth      sssd-shadowutils
 crond                   password-auth-ac   su
 cups                    pluto              sudo
 fingerprint-auth        polkit-1           sudo-i
 fingerprint-auth-ac     postlogin          su-l
 gdm-autologin           postlogin-ac       system-auth
 gdm-fingerprint         ppp                system-auth-ac
 gdm-launch-environment  remote             systemd-user
 gdm-password            runuser            vlock
 gdm-pin                 runuser-l          vmtoolsd
 gdm-smartcard           setup              vsftpd
 ksu                     smartcard-auth     xserver
 liveinst                smartcard-auth-ac
 [root@localhost pam.d]#cat /etc/pam.d/sshd    //文件类型
 #%PAM-1.0
 auth       required pam_sepermit.so
 auth       substack     password-auth
 auth       include      postlogin
 # Used with polkit to reauthorize users in remote sessions
 -auth      optional     pam_reauthorize.so prepare
 account    required     pam_nologin.so
 account    include      password-auth
 password   include      password-auth
 # pam_selinux.so close should be the first session rule
 session    required     pam_selinux.so close
 session    required     pam_loginuid.so
 # pam_selinux.so open should only be followed by sessions to be executed in the user context
 session    required     pam_selinux.so open env_params
 session    required     pam_namespace.so
 session    optional     pam_keyinit.so force revoke
 session    include      password-auth
 session    include      postlogin
 # Used with polkit to reauthorize users in remote sessions
 -session   optional     pam_reauthorize.so prepare
复制代码


网络异常,图片无法展示
|


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


2.3.1 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将失效

2.3.2 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回传的结果决定下一个动作(重新输入密码或者通过验证)
复制代码


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

application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确
 配置的其它服务
 type:指模块类型,即功能
 control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
 module-path: 用来指明本模块对应的程序文件的路径名
 Arguments: 用来传递给该模块的参数
复制代码


配置文件/etc/pam.d/每一行都是一个独立的认证过程。

每一行可以区分为三个字段: 认证类型 、控制类型 、PAM 模块及其参数 。具体如下:

认证类型(module-type):

  • 认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证;
  • 帐户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等;
  • 密码管理(password management):用户修改密码时密码复杂度检查机制等功能;
  • 会话管理(session management):主要是提供对会话的管理和记账。
  • -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用。

控制类型: 也可以称做 Control Flags,用于 PAM 验证类型的返回结果。

  • 1)required 验证失败时仍然继续,但返回 Fail。
  • 2)requisite 验证失败则立即结束整个验证过程,返回 Fail 。
  • 3)sufficient 验证成功则立即返回,不再继续,否则忽略结果并继续。
  • 4)optional 不用于验证,只是显示信息(通常用于 session 类型)。

PAM 模块及其参数:

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


3 系统引导和登录控制


3.1 开关机安全控制

3.1.1 调整BIOS引导设置原则

  • 将第一引导设备设为当前系统所在硬盘;
  • 禁止从其他设备(光盘、 U盘、网络)引导启动系统;
  • 将安全级别设为setup,并设置管理员密码。
    禁用重启热键:Ctrl+Alt+Delete,避免因用户误操作重启。

3.1.2 GRUB限制

  • 未经授权禁止修改启动参数
  • 未经授权禁止进入指定系统

通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。

3.1.3 GRUB菜单加密的实现

定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。


文件 描述
00_header 设置grub默认参数
10_linux 系统中存在多个linux版本
20_ppc_terminfo 设置tty控制台
30_os_prober 设置其他分区中的系统(硬盘中有多个操作系统时设置)
40_custom和41_custom 用户自定义的配置


设置GRUB 2加密

由于GRUB 2负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。

在默认情况下,GRUB 2对所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认真支持,必须将环境变量超级用户设置为一组用户名(可以使用空格、逗号、分号作为分隔符)这样就只允许超级用户使用GRUB命令行、编辑菜单项以及执行任意菜单项。

GRUB 2密码支持以下两种格式:

  • 明文密码:密码数据没有经过加密,安全性差。
  • PBKDF2加密密码:密码经过PBKDF2哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。

为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
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


相关文章
|
9天前
|
网络协议 Ubuntu Linux
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
|
15天前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
15天前
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
50 3
|
14天前
|
安全 Linux
Linux查看和剔除当前登录用户详细教程
Linux查看和剔除当前登录用户详细教程
13 0
Linux查看和剔除当前登录用户详细教程
|
18天前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
|
18天前
|
JavaScript Linux
【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
|
18天前
|
JavaScript Linux API
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
|
18天前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
18天前
|
Java Linux C++
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑
|
19天前
|
JavaScript Linux 容器
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问
【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问