Linux系统安全与应用

185 阅读16分钟

账户基本安全措施

一、系统账号的清理

  • 将用户设置为无法登录

  • 锁定账户

  • 删除账户

  • 锁定账户密码,本质锁定

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

1.将非登录用户的Shell设为/sbin/nologin

在我们使用Linux系统时,除了用户创建的账号之外,还会产生系统或程序安装过程中产生的许多其他账号,除了超级用户root外,其他账号都是用来维护系统运作的,一般不允许登录,常见的非登录用户有bin、adm、mail、lp、nobody、ftp等。

查看/etc/passwd 文件,检索出无法登录用户。

image.png

使用usermod命令修改登录shell:

 usermod  -s  /sbin/nologin  用户名         //修改用户属性

image.png

2.锁定用户

锁定用户命令

方法一:

  •  锁定用户:passwd -l 用户名    

  •  解锁用户:passwd -u 用户名

image.png

方法二:

  •  锁定用户:usermod -L 用户名    

  •  解锁用户:usermod -U 用户名    

image.png

3.删除账户

删除账户命令

  •  删除用户,但不删除用户的家目录:userdel 用户名    
  •  删除用户的同时,删除他的家目录:userdel -r 用户名    

注意

加上-r才能删除用户的家目录。如果不删除家目录,那么用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID和GID。

image.png

4.锁定账号文件

chattr命令改变文件属性,lsattr命令查看文件底层属性。

chattr命令格式:chattr [-RV] [+/-/=<属性>] 文件或目录

 lsattr命令格式:lsattr 文件或目录

选项

  • -R:递归处理,将指定目录下的所有文件及子目录一并处理。

  • -V:显示指令执行过程。

属性

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

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

image.png

二、密码安全控制

一般通过设置密码规则来控制密码安全,主要设置以下两点:

  • 设置密码有效期

  • 要求用户下次登录时修改密码

1.对于新建用户——修改/etc/login.defs文件

对于新建用户,可以修改/etc/login.defs文件里的内容来设置密码规则。

查看/etc/login.defs文件

image.png

示例

image.png

image.png

2.对于现有用户——使用chage命令修改文件

chage命令格式:chage [选项] 用户名

选项

  • -m:密码可更改的最小天数。为0时代表任何时候都可以更改密码。

  • -M:密码保持有效的最大天数。

  • -W:用户密码到期前,提前收到警告信息的天数。

  • -E:帐号到期的日期。过了这天,此帐号将不可用。

  • -d:设置”最后一次修改密码的日期“。设置为 0 有特殊意思,表示用户应该在下次登录系统时更改密码。

  • -i:停滞时期。允许密码过期后多少天内仍能使用,如果一个密码已过期这些天,那么此帐号将不可用。

  • -l:例出当前的设置。

示例

1)查看当前设置:chage -l 用户名

image.png

2)设置用户密码的有效期:chage -M 天数 用户名

image.png

3)强制要求用户下次登录时必须修改密码:chage -d 0 用户名

image.png

三、命令历史限制

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

1.临时清除历史命令

临时清除历史命令:history -c和clear

注意:只是临时的清除命令,重启后记录还是会回来。

image.png

image.png

2.一般使用两种方式控制命令历史

第一种方法:减少记录的命令条数。

第二种方法:注销时自动清空命令历史,或登录时自动清空命令历史。

家目录下有 .bash_history 文件,用于记录历史命令。清空该文件即清空了命令历史。

修改历史命令

 1)临时修改历史命令条数。只针对当前用户,退出登录后失效:export HISTSIZE=200

image.png

 2)永久修改历史命令条数。编辑配置文件,设置历史命令条数:vim /etc/profile

image.png

设置历史命令条数记录为200条:HISTSIZE=200

image.png

然后刷新配置文件,使文件立即生效:source /etc/profile

image.png

 3. 注销时自动清空历史命令:vim ~/.bash_logout   输入:echo "" > ~/.bash_history

image.png

 4. 登录时自动清空历史命令:vim ~/.bashrc

 输入echo "" > ~/.bash_history

image.png

5)设置终端自动注销

编辑/etc/profile 文件:vim /etc/profile

image.png

设置闲置500秒后自动注销:export TMOUT=500

image.png

四、PAM安全认证

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

官网:www.linux-pam.org/

PAM安全认证流程图

image.png

  1. required验证失败时任然继续,但返回Fail

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

  3. sufficien验证成功则立即返回,不在继续,否则忽略结果并继续

  4. optional不用于验证,只显示信息

五、用户切换——su命令

su命令即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令。

查看su操作记录

系统安全日志/var/log/secure,是记录ssh登陆服务器的日志文件。

1.用户切换su命令概述

用户切换su命令格式:su 选项 [-] 用户名

切换用户的方式

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

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

注意

用户为超级管理员时 su至其他用户无须密码;非超级管理员的用户切换时需要密码。

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

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

image.png

1)普通用户切换到其他用户,需要验证目标用户的密码。

image.png

2 限制使用su命令的用户

su 命令的安全隐患

  • 默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。

  • 为了加强su命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su 命令进行切换。

限制使用su命令的用户(通过修改/etc/pam.d/su 文件)

  • 将允许使用su命令的用户加入wheel组。

  • 启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户。

查看 /etc/pam.d/su 文件

image.png

  • 以上两行是默认状态(即开启第一行,注释第二行),这种状态下是允许所有用户间使用su命令进行切换的。

  • 两行都注释也是允许所有用户都能使用su命令,但'root'下使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam rootok.so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码。)

  • 如果开启第二行,表示只有root用户和wheel组内的用户才可以使用su命令

  • 如果注释第一行,开启第二行,表示只有whee1组内的用户才能使用su命令,root用户也被禁用su命令。

示例

1)编辑 /etc/pam.d/su 文件:vim /etc/pam.d/su,将第二行和第六行都开启,则只有root和wheel组内的用户才能使用 su 命令。

image.png

2)lhey用户不在wheel组内,使用su命令时拒绝权限。

image.png

3)将lhey用户加入wheel组内,则可以成功使用su 命令。

image.png

六、shell模块

功能:检查有效shell

帮助:man pam_shells

案例:不允许使用/bin/csh的用户本地登录

模块: pam_shells.so 只允许 规定的shell类型通过, 是在/etc/shells 文件中存在的 类型通过。

示例

1)编辑 /etc/pam.d/su 文件:vim /etc/pam.d/su,添加auth required pam_shells.so命令项。

image.png

2)编辑 /etc/shells文件:vim /etc/shells,删除/bin/csh。

image.png

3)为zhangsan用户设置shell类型,查看系统安全日志。

image.png

4)切换到zhangsan用户,系统不允许使用/bin/csh的用户本地登录。

image.png

七、limit

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

修改限制的实现方式:ulimit 命令

ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。

ulimit的设定值是 per-process 的,也就是说,每个进程有自己的limits值。使用ulimit进行修改,立即生效。

ulimit只影响shell进程及其子进程,用户登出后失效。

可以在profile中加入ulimit的设置,变相的做到永久生效

选项

  • -H 设置硬件资源限制

  • -S 设置软件资源限制

  • -a 显示当前所有的资源限制

  • -c size:设置core文件的最大值.单位:blocks

  • -d size:设置数据段的最大值.单位:kbytes

  • -f size:设置创建文件的最大值.单位:blocks

  • -l size:设置在内存中锁定进程的最大值.单位:kbytes

  • -m size:设置可以使用的常驻内存的最大值.单位:kbytes

  • -n size:设置内核可以同时打开的文件描述符的最大值.单位:n

  • -p size:设置管道缓冲区的最大值.单位:kbytes

  • -s size:设置堆栈的最大值.单位:kbytes

  • -t size:设置CPU使用时间的最大上限.单位:seconds

  • -u size:最大用户进程数

  • -v size:设置虚拟内存的最大值.单位:kbytes unlimited 是一个特殊值,用于表示不限制。

示例

1.查看系统相关资源限制的设置:ulimit -a

image.png

2.临时修改资源限制(只对当前终端有效):ulimit -n 20000。

image.png

3.永久修改:编辑/etc/security/limits.conf配置文件,添加信息。

vim /etc/security/limits.conf

输入* - nofile 20000

image.png

image.png

重启,使用ulimit -a 查看就可以看到设置完成。

image.png

八、用户提权:sudo命令

1.sudo命令和/etc/sudoers配置文件

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等。

查看sudo操作记录

  • 需要启用 Default logfile 配置

  • 默认日志文件:/var/log/sudo.log

sudo特性

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

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

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

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

使用visudo命令,可编辑配置文件/etc/sudoers

image.png

image.png

文件格式

  • 用户 登入主机=(代表用户) 命令

  • user host=(runas) command

  • root ALL=ALL(绝对路径)

  • %wheel   ALL=(ALL)         NOPASSWD:ALL

注释

  • root表示允许哪个用户。

  • %wheel表示wheel组。

  • 第一个ALL表示通过哪些主机登入。

  • 第二个ALL表示以哪个用户身份。

  • 最后一个ALL表示允许运行哪些命令。

  • NOPASSWD表示使用sudo命令不需要验证密码。

示例

1.lhey用户通过任何主机登入系统后,可以以root的身份运行mount命令

确定mount命令路径,编辑visudo配置文件,输入lhey    ALL=(ALL)   /usr/bin/mount /dev/sr0 /mnt

image.png

image.png

image.png

切换lhey用户,输入sudo /usr/bin/mount /dev/sr0 /mnt,输入密码,挂载成功。

image.png

2.lhey不在wheel组中,不允许使用sudo命令

image.png

将jack加入wheel组内。lhey可以成功使用sudo命令。

image.png

2.sudo别名

sudo别名有四种类型:

  • User_Alias(用户)

  • Runas_Alias(代表用户)

  • Host_Alias(登录主机)

  • Cmnd_Alias(命令)

示例

创建用户别名MYUSERS=user01,user02。允许这两个用户使用/sbin/下的所有命令,除了cat、mkdir、ps、mount这四个命令。 (! 表示取反。! /bin/cat 表示不允许使用cat命令。)

image.png

注意

如果配置文件内有语法错误,visudo命令会进行提示。

image.png

3.sudo子目录

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

image.png

image.png

注意

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

4.查看sudo操作记录

  • 需要启用 Default logfile 配置

  • 默认日志文件:/var/log/sudo

操作

修改配置文件:visudo

image.png

在最后一行添加 Default logfile 配置:Default logfile="/var/log/sudo"

image.png

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

image.png

九、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用户自定义的配置

1.设置GRUB 2加密

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

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

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

  • 明文密码:密码数据没有经过加密,安全性差

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

为GRUB菜单设置密码的两种方式

  • CentOS 7系统中,直接使用 “grub2-setpassword” 命令设置grub密码;

  • CentOS 6系统中,先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。(/etc/grub.d/00_header是开机时第一个启动的文件)

方法一

CentOS 7系统中,直接使用 “grub2-setpassword” 命令设置grub密码

image.png

十、端口号

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