0


安全及应用(更新)

一、账号安全

1.1系统帐号清理

#查看/sbin/nologin结尾的文件并统计
[root@root@localhost ~]# grep '/sbin/nologin$' /etc/passwd |wc -l
40

#查看apache登录的shell
[root@root@localhost ~]# grep 'apache' /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

#改变apache的登录的shell
[root@root@localhost ~]# usermod -s /sbin/bash apache

#查看更改结果
[root@root@localhost ~]# grep '/sbin/bash$' /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/bash

1.1.1锁定账户和解锁账户

1.usermod -L 和 usermod -U

#锁定xiewei账号
[root@root@localhost ~]# usermod -L xiewei

#查看谢伟账号
[root@root@localhost ~]# passwd -S xiewei
xiewei LK 1969-12-30 0 99999 7 -1 (Password locked.)

#解锁谢伟账号
[root@root@localhost ~]# usermod -U xiewei

#查看谢伟账号状态
[root@root@localhost ~]# passwd -S xiewei
xiewei PS 1969-12-30 0 99999 7 -1 (Password set, SHA512 crypt.)

2.passwd -l 和 passwd -u

#先查看状态
[root@root@localhost ~]# passwd -S xiewei
xiewei PS 1969-12-30 0 99999 7 -1 (Password set, SHA512 crypt.)

#锁账户
[root@root@localhost ~]# passwd -l xiewei
Locking password for user xiewei.
passwd: Success

#查看账户
[root@root@localhost ~]# passwd -S xiewei
xiewei LK 1969-12-30 0 99999 7 -1 (Password locked.)

#解锁账户
[root@root@localhost ~]# passwd -u xiewei
Unlocking password for user xiewei.
passwd: Success

#查看账户状态
[root@root@localhost ~]# passwd -S xiewei
xiewei PS 1969-12-30 0 99999 7 -1 (Password set, SHA512 crypt.)

3.usermod 和 passwd 两个锁账户的命令比较

①passwd -l

[root@root@localhost ~]# passwd -l xiewei
Locking password for user xiewei.
passwd: Success

#查看passwd -l结果
[root@root@localhost ~]# grep 'xiewei' /etc/passwd
xiewei:x:1000:1000:xiewei:/home/xiewei:/bin/bash
xiewei1:x:1005:1005::/home/xiewei1:/bin/bash
[root@root@localhost ~]# grep 'xiewei' /etc/shadow
xiewei:!!$6$cE/PcSfzNmXqILGt$3x7ix5gmYqeqwkvEuqVq6cllhN3sxZco4Ez1L5E6i0DjssRC9gBp/Ds/0YqOgzYLJdsdvlhAAaVY5EE2h1BAy.::0:99999:7:::
xiewei1:$6$Y0MLY/PCRfQ/BZUN$rjGc5tm9njGip2L5zAi8LYAyz5/pEgQzB6kr/0w41uhA3L1dpS.xsGrUtmJV05P7mnG816l/lZ1OcDkRKONtf0:19894:0:99999:7:::

②****usermod -l

[root@root@localhost ~]# usermod -L xiewei
[root@root@localhost ~]# ls

[root@root@localhost ~]# grep 'xiewei' /etc/shadow
xiewei:!$6$cE/PcSfzNmXqILGt$3x7ix5gmYqeqwkvEuqVq6cllhN3sxZco4Ez1L5E6i0DjssRC9gBp/Ds/0YqOgzYLJdsdvlhAAaVY5EE2h1BAy.::0:99999:7:::
xiewei1:$6$Y0MLY/PCRfQ/BZUN$rjGc5tm9njGip2L5zAi8LYAyz5/pEgQzB6kr/0w41uhA3L1dpS.xsGrUtmJV05P7mnG816l/lZ1OcDkRKONtf0:19894:0:99999:7:::
[root@root@localhost ~]# grep 'xiewei' /etc/passwd
xiewei:x:1000:1000:xiewei:/home/xiewei:/bin/bash
xiewei1:x:1005:1005::/home/xiewei1:/bin/bash
     通过以上不难发现,/etcpasswd现实的结果都是一样的,在信息描述之间出现了一个xiewei,但是再shadow文件中。我们也不难看出,使用usermod命令后,passwd密码位前面只有一个“ !”号,而使用passwd命令后,passwd文件中密码位前面有两个"!!"。

    但是两者锁定的严密性和效果基本相同。而且两者的解锁命令不可互调。

1.1.2删除账号

userdel -r 用户名

#查看并过滤有哪些xiewei账号
[root@root@localhost ~]# grep 'xiewei' /etc/passwd
xiewei:x:1000:1000:xiewei:/home/xiewei:/bin/bash
xiewei1:x:1005:1005::/home/xiewei1:/bin/bash
xiewei2:x:1006:1006::/home/xiewei2:/bin/bash
xiewei3:x:1007:1007::/home/xiewei3:/bin/bash
xiewei4:x:1008:1008::/home/xiewei4:/bin/bash
xiewei5:x:1009:1009::/home/xiewei5:/bin/bash
xiewei6:x:1010:1010::/home/xiewei6:/bin/bash
xiewei7:x:1011:1011::/home/xiewei7:/bin/bash
xiewei8:x:1012:1012::/home/xiewei8:/bin/bash
xiewei9:x:1013:1013::/home/xiewei9:/bin/bash
xiewei10:x:1014:1014::/home/xiewei10:/bin/bash
xiewei11:x:1016:1016::/xiewei11/:/bin/bash
xiewei12:x:1017:1017::/xiewei12:/bin/bash
xiewei13:x:1018:1018::/xiewei13:/bin/bash

#删除账号
[root@root@localhost ~]# userdel -r xiewei13

#查看并过滤有哪些xiewei账号
[root@root@localhost ~]# grep 'xiewei' /etc/passwd
xiewei:x:1000:1000:xiewei:/home/xiewei:/bin/bash
xiewei1:x:1005:1005::/home/xiewei1:/bin/bash
xiewei2:x:1006:1006::/home/xiewei2:/bin/bash
xiewei3:x:1007:1007::/home/xiewei3:/bin/bash
xiewei4:x:1008:1008::/home/xiewei4:/bin/bash
xiewei5:x:1009:1009::/home/xiewei5:/bin/bash
xiewei6:x:1010:1010::/home/xiewei6:/bin/bash
xiewei7:x:1011:1011::/home/xiewei7:/bin/bash
xiewei8:x:1012:1012::/home/xiewei8:/bin/bash
xiewei9:x:1013:1013::/home/xiewei9:/bin/bash
xiewei10:x:1014:1014::/home/xiewei10:/bin/bash
xiewei11:x:1016:1016::/xiewei11/:/bin/bash
xiewei12:x:1017:1017::/xiewei12:/bin/bash

注意: 加-r选项和不加-r选项是有区别的

  • **userdel 用户名**:仅删除用户账户,保留用户的所有文件。
  • **userdel -r 用户名**:删除用户账户,并删除用户的主目录和邮件目录,连同所有内容一起删除。

且要注意用户在删除时候没有 正在运行的进行,否则可能会操作失败

1.2密码安全控制

1.2.1修改密码配置文件

**vim /etc/login.defs **

PASS_MAX_DAYS 99999 #设置密码有效期99999天。 默认99999天

PASS_MIN_DAYS 0 #表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0

PASS_MIN_LEN 5 #密码最小长度,对于root无效 18位包含密码复杂性 大写 、小写、字符、数字

注解:指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效。

PASS_WARN_AGE 7 #指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天。

1.2.2更改密码

[xiewei@root@localhost ~]$ passwd
Changing password for user xiewei.
Changing password for xiewei.
(current) UNIX password: 
New password: 
BAD PASSWORD: The password is too similar to the old one

①:不能太相似,这里设置的新密码是1234567,它则提示太相似(原密码123456)

New password: 
BAD PASSWORD: The password is shorter than 8 characters

②:不能低于8位(root不受限制),这里设置了abcde

[xiewei@root@localhost ~]$ passwd
Changing password for user xiewei.
Changing password for xiewei.
(current) UNIX password: 
passwd: Authentication token manipulation error

③:密码不能为空

[xiewei@root@localhost ~]$ passwd
Changing password for user xiewei.
Changing password for xiewei.
(current) UNIX password: 
passwd: Authentication token manipulation error

④:密码不能设置太简单

1.2.3 查看用户密码有效期

    用于查看指定用户账户的密码有效期信息。它显示了与用户密码相关的各种设置,包括密码上次更改的日期、密码过期的时间、密码最小/最大有效期等。

chage -l 用户名

[xiewei@root@localhost ~]$ chage -l xiewei
Last password change                    : never
Password expires                    : never
Password inactive                    : never
Account expires                        : never
Minimum number of days between password change        : 0
Maximum number of days between password change        : 99999
Number of days of warning before password expires    : 7

1.Last password change

  • 说明:最后一次更改密码的日期。
  • never
  • 解释:密码从未更改过。这意味着自账户创建以来,用户从未修改过密码。

2.Password expires

  • 说明:密码过期的日期。
  • never
  • 解释:密码永不过期。用户可以一直使用当前密码,不需要定期更改。

3.Password inactive

  • 说明:密码失效的日期。
  • never
  • 解释:密码永不失效。即使用户长时间不登录,密码也不会被自动锁定。

4.Account expires

  • 说明:账户过期的日期。
  • never
  • 解释:账户永不过期。用户可以一直使用这个账户,不会因为过期而被锁定或禁用。

5.Minimum number of days between password change

  • 说明:两次密码更改之间的最小天数。
  • 0
  • 解释:用户可以随时更改密码,没有任何限制。用户可以在同一天内多次修改密码。

6.Maximum number of days between password change

  • 说明:两次密码更改之间的最大天数。
  • 99999
  • 解释:用户可以长达 99999 天(约 273 年)不更改密码。实际上,这意味着密码永不过期,因为这一期限极长。

7.Number of days of warning before password expires

  • 说明:密码过期前警告用户的天数。
  • 7
  • 解释:如果设置了密码过期日期,系统会在密码过期前 7 天警告用户需要更改密码。然而,由于上述设置显示密码永不过期,因此这一警告不会实际触发。

1.3历史命令

历史命令可能会有隐私,比如密码什么的,所以我们要管理好我们的历史命令

history 查看历史命令

1.3.1临时清理历史命令

[root@root@localhost ~]# history -c
[root@root@localhost ~]# history
   35  history

重启后可恢复,或者使用history -r

    我们的历史命令会保存在一个文件中,history -c只能临时清理,重启后还会将该文件中的内容加载到history命令中。history -r这个命令,则是将该文件中内容重新都取到history中。 

简单点说

  • 在当前 shell 会话中,命令历史记录保存在内存中。可以使用 history 命令查看这些历史记录。
  • 使用 history -w 命令可以强制将当前内存中的历史记录写入 ~/.bash_history 文件。
history

命令展示的是当前 shell 会话中的命令历史记录,包括内存中的未写入文件的记录以及从

~/.bash_history

文件中读取的记录。严格来说,这些内容不是缓存,而是内存中的记录和磁盘文件的结合。

** history -c && history -w**

则会将shell 会话中的命令历史记录,还有文件中的命令历史记录清除

** 拓展**

关于环境变量的读取顺序:
用户登录 ->> 加载/.bash_profile --> bash_profile中配置了首先是使/.bashrc生效。.bash_profile”文件中的命令将在该用户每次登录时被执行。.bashrc”文件中的命令会在每次加载“/bin/bash。

# 清除历史命令
vim ~/.bashrc
# 添加以下内容
echo '' > ~/.bash_history
在~/.bash_profile

~/.bashrc

中添加以上内容,就会开机自动删除历史命令

    我们可以将**echo '' > ~/.bash_history**这个命令加入到配置文件中,使其开机加载时候自动生效。我们还可以在/etc/skel/.bash_logout文件中添加下面这行**rm -f $HOME/.bash_history **。这样,当用户每次注销时,.bash_history文件都会被删除。

    此外 我们还可以设置历史命令保存条数

设置全局 HISTSIZE:

​​​​​​​sudo vim /etc/profile 

# 添加以下内容 
HISTSIZE=18

#这样历史命令只保存18条

设置当前用户 HISTSIZE:

vim ~/.bash_profile 

# 添加以下内容 
export HISTSIZE=15

历史命令保存15条

1.4终端自动注销

  TMOUT

是一个环境变量,用于指定 Bash shell 的自动注销时间(单位为秒)。如果用户在指定的时间内没有进行任何操作,Shell 会自动退出。老样子,我们还是分为当前用户配置和全局配置

以下我们以“闲置600秒后自动注销”为例

1.4.1全局配置

vi /etc/profile 
#适用于新登录用户 ,因为这个配置文件会在登录过程中读取

export TMOUT=600

1.4.2当前用户配置

[root@localhost ~]# export TMOUT=600

1.4.3取消当前用户配置

[root@localhost ~]# unset TMOUT
    需要注意的是,当正在执行程序代码编译、修改系统配置等耗时较长的操作时,应避免 设置 TMOUT 变量。必要时可以执行“**unset TMOUT**”命令取消 TMOUT 变量设置

拓展

为什么在耗时操作时避免设置

TMOUT
    在进行耗时操作(如程序编译、系统配置修改等)时,用户可能长时间不进行键盘输入。如果 
TMOUT

设置了一个较短的时间,这种长时间不活动可能会导致 Shell 在任务尚未完成时自动退出,从而中断这些操作。这种中断可能导致未保存的工作丢失或系统处于不一致状态。

举个例子

①编译开始前

    你可能已经设置了 
TMOUT=300

(5 分钟)。由于编译过程需要较长时间,而且你不需要在这段时间内进行任何操作,因此可能会导致 Shell 自动注销,编译过程被中断。

**②取消

TMOUT

设置**:

在开始编译前,执行

unset TMOUT

来取消自动注销:

unset TMOUT

③编译完成后

如果你仍希望保持自动注销功能,可以在编译完成后重新设置

TMOUT

export TMOUT=300

1.5限制su命令用户

    默认情况下,任何用户都允许使用 su 命令,从而有机会反复尝试其他用户(如 root) 的登录密码,这样带来了安全风险。为了加强 su 命令的使用控制,可以借助于 pam_wheel 认证模块,只允许极个别用户使用 su 命令进行切换。实现过程如下:将授权使用 su 命令 的用户添加到 wheel 组,修改/etc/pam.d/su 认证配置以启用 pam_wheel 认证。

配置行解释

**1.

# auth sufficient pam_rootok.so

**

它的含义如下:

  • auth: 认证模块类型,表示这是一种认证操作。
  • sufficient: 控制标志,表示如果此模块成功,那么不再需要继续检查其他模块。即,这个模块认证成功后,不需要继续其他认证步骤。
  • pam_rootok.so: 模块名称,pam_rootok 模块会检查当前用户是否是超级用户(UID 为 0)。如果当前用户是 root,则认证成功。

**启用这行的效果是,如果当前用户是 root,则不需要进行进一步的认证,可以直接使用

su

命令。**

**2.

#auth required pam_wheel.so use_uid

**

这行被注释掉了。移除

#

后它的含义如下:

  • auth: 认证模块类型,表示这是一种认证操作。
  • required: 控制标志,表示该模块必须成功通过认证才能继续其他模块。如果该模块失败,则整个认证过程会失败。
  • pam_wheel.so: 模块名称,pam_wheel 模块限制哪些用户可以使用 su 命令。
  • use_uid: 模块参数,表示在检查用户组时使用调用者的真实 UID,而不是有效 UID。

**启用这行的效果是,只有属于 wheel 组的用户才可以使用

su

命令来切换用户身份。如果调用

su

的用户不在 wheel 组中,则认证失败。**

** 拓展**

在 Linux 的 PAM(Pluggable Authentication Modules,可插拔认证模块)系统中,控制标志用于决定模块的结果如何影响整体认证过程。控制标志的设置对于 PAM 的工作方式和安全性至关重要。以下是所有控制标志及其解释:

控制标志的类型

1.required

auth required pam_unix.so

描述:该模块必须成功通过认证,否则整个 PAM 认证过程会失败。

行为:无论该模块是否成功,都会继续执行后续的 PAM 模块。但是如果该模块失败,最终的认证结果将会失败。

使用场景:通常用于关键的认证步骤,例如密码验证。

2.requisite

auth requisite pam_securetty.so

描述:该模块必须成功通过认证,否则整个 PAM 认证过程立即失败,并且不再继续后续的 PAM 模块。

行为:如果该模块失败,会立即终止认证过程,并返回失败结果。

使用场景:用于非常关键的认证步骤,一旦失败无需继续其他检查。

3.sufficient

auth sufficient pam_wheel.so trust

描述:如果该模块成功通过认证,则整个 PAM 认证过程立即成功,不再继续后续的 PAM 模块。如果该模块失败,则继续执行后续的 PAM 模块。

行为:如果该模块成功,后续模块不会被执行,认证立即成功;如果该模块失败,则不会影响最终结果,继续执行后续模块。

使用场景:用于可选的认证步骤,如果成功即可终止认证过程。

4.optional

session optional pam_motd.so

描述:该模块的成功或失败不会影响最终的认证结果,除非它是唯一指定的模块。

行为:不论该模块成功或失败,都会继续执行后续的 PAM 模块,最终结果取决于其他模块。

使用场景:用于非关键的认证步骤,例如记录日志或显示消息。

5.include

auth include common-auth

描述:该控制标志指示 PAM 去包括指定的配置文件中的所有模块。

行为:会将指定文件中的所有 PAM 模块配置包含进来,并按照包含的位置执行。

使用场景:用于复用其他 PAM 配置文件中的配置。

6.substack

auth substack common-auth

描述:类似于

include

,但会将包含的模块结果返回给调用模块,并根据控制标志处理。

行为:会将指定文件中的所有 PAM 模块配置包含进来,并根据控制标志处理结果。

使用场景:用于将一组模块作为一个子堆栈包含并控制其结果处理。

7.binding

auth binding pam_unix.so

描述:与

required

类似,但如果该模块失败,后续的模块仍会被执行。然而,如果此模块失败,会立即返回失败结果。

行为:如果模块失败,会立即标记认证失败,但不会终止后续模块的执行。

使用场景:类似于

required

,但允许后续模块继续执行。

@示例配置文件@

以下是一个示例的 PAM 配置文件,展示了不同控制标志的使用:

auth    required    pam_env.so
auth    required    pam_unix.so
auth    sufficient  pam_ldap.so
auth    requisite   pam_securetty.so
auth    optional    pam_tally2.so
account required    pam_unix.so
account sufficient  pam_localuser.so
password required   pam_unix.so
session optional    pam_motd.so

总结

  • required:关键模块,必须成功,但会继续后续模块。
  • requisite:关键模块,必须成功,失败则立即终止。
  • sufficient:可选模块,成功则立即终止,失败则继续。
  • optional:非关键模块,成功或失败都不影响结果。
  • include:包含指定配置文件中的模块。
  • substack:包含并控制结果的子堆栈模块。
  • binding:类似 required,但失败会立即返回结果,同时继续后续模块。

理解这些控制标志对于正确配置和管理 PAM 模块以确保系统的安全性和功能性至关重要。

#加入组
[root@localhost ~]# sudo gpasswd -a xiewei wheel
Adding user xiewei to group wheel
#查看组成员
[root@localhost ~]# grep wheel /etc/group
wheel:x:10:jingqingguo,xiewei

​​​​​​​

    默认情况下,任何用户都允许使用 su 命令,从而有机会反复尝试其他用户(如 root) 的登录密码,这样带来了安全风险。为了加强 su 命令的使用控制,可以借助于 pam_wheel 认证模块,只允许极个别用户使用 su 命令进行切换。

1.6PAM安全认证

1.6.1什么是 PAM(Pluggable Authentication Modules)

    PAM 是 Linux 系统中用于认证的一种灵活的机制,它允许系统管理员通过配置来选择程序的认证方式。PAM 的模块化设计使其能够动态加载和配置,以满足不同应用程序的认证需求。

1.6.2PAM 的工作原理

PAM 认证的过程通常分为以下几个步骤:

  1. 服务(Service):确定要使用 PAM 进行认证的应用程序或服务。
  2. 配置文件(PAM Configuration File):PAM 加载位于 /etc/pam.d/ 目录下的对应配置文件。
  3. 认证模块(PAM Module):根据配置文件,调用位于 /lib64/security/ 下的认证模块进行认证。

1.6.3配置 PAM 认证的过程

1.编辑配置文件

  • PAM 配置文件位于 /etc/pam.d/ 目录下,每个应用程序都有一个对应的配置文件。
  • .so 结尾的文件是 PAM 模块(动态函数库模块),这些模块定义了具体的认证方式。

2.配置文件格式: 每一行代表一个独立的认证过程,通常包含四个字段:

①认证类型(Type)

  • auth:用户身份认证,如输入密码。
  • account:检查账户属性,如账户是否过期。
  • password:用于更新用户信息,如修改密码。
  • session:管理登录会话,如挂载文件系统。

②控制标记(Control Flag)

  • required:必须成功,否则整个认证失败,但继续执行后续模块。
  • requisite:必须成功,否则立即失败,终止认证过程。
  • sufficient:成功即返回,不再执行后续模块;失败则忽略。
  • optional:结果可忽略,一般用于显示信息。

③模块路径(Module Path):默认在

/lib64/security/

下,非默认路径需填写绝对路径。

④模块参数(Module Arguments):传递给模块的参数,多个参数用空格分隔。

1.6.4关键知识点总结

  • PAM 模块化设计:允许灵活配置认证方式,提供高效和安全的用户认证。
  • 配置文件与模块:位于 /etc/pam.d//lib64/security/ 目录下,通过配置文件调用模块实现认证。
  • 认证类型与控制标记:分别定义认证的类型和控制流程,确保认证的灵活性和安全性。

1.7sudo 机制提升权限详解

1.7.1 什么是 sudo?

    在 Linux 系统中,sudo(superuser do)是一种允许普通用户以超级用户或其他用户身份执行特定命令的机制。它避免了直接使用 root 用户,从而减少了安全风险,同时又能满足部分管理权限的需求。

1.7.2 sudo 的优势

  • 权限分配精细:管理员可以精确控制哪些用户能以何种身份执行哪些命令,而无需共享 root 密码。
  • 操作追踪:sudo 可以记录执行过的命令,便于审计和跟踪。
  • 安全性:减少了直接使用 root 用户的风险,即使普通用户获得某些权限,也受到限制和监控。

1.7.3sudo 配置文件(/etc/sudoers)

sudo 的配置文件是

/etc/sudoers

,通常使用

visudo

命令编辑,而不是直接使用

vi

或其他编辑器。这是因为

visudo

工具会在保存配置文件时检查语法错误,避免出现无法访问系统的问题。

1.7.4sudoers 文件格式和基本配置

sudoers 文件中的授权记录基本格式如下:

user MACHINE=COMMANDS
  • user:指定的用户名,或者使用 %group 的形式指定用户组(例如 %admin)。
  • MACHINE:配置文件所在的主机名,通常设为 localhost 或实际主机名。
  • COMMANDS:允许用户以 sudo 方式执行的命令列表,需要使用完整的命令路径,多个命令用逗号分隔。

1.7.5sudoers 文件中的主要配置参数

  • NOPASSWD:指定用户执行某些命令时不需要输入密码。
  • PASSWD:指定用户执行某些命令时需要输入密码。
  • Runas:允许用户以某个用户的身份执行命令,常见的如 (root)

1.7.6sudo 命令的常用参数选项

  • -l:列出当前用户可以执行的以及被禁止的命令列表。
  • -v:验证用户的时间戳,如果在短时间内执行多个 sudo 命令,可以免去重复输入密码的步骤。
  • -u:指定以另一个用户的身份执行特定操作。
  • -k:删除时间戳,下一次执行 sudo 命令需要重新输入密码。

1.7.7示例和案例解析

示例一:授权用户执行特定命令

# 编辑 sudoers 文件
visudo
​
# 允许用户 wangliu 执行 /usr/sbin/useradd 和 /usr/sbin/usermod 命令
wangliu ALL=(root) /usr/sbin/useradd, /usr/sbin/usermod

示例二:允许用户临时创建网卡

# 允许用户 Tom 在 kgc 主机上以 root 身份执行 ifconfig 命令
Tom kgc=(root) NOPASSWD: /usr/sbin/ifconfig

1.7.8使用 sudo 的注意事项

  • 安全性考虑:尽量减少允许的命令范围,避免赋予不必要的权限。
  • 审计和监控:定期检查 sudoers 文件,审计用户的 sudo 使用记录。
  • 密码管理:根据安全策略设置是否要求输入密码以及时间戳的管理。

1.7.9结论

    sudo 是管理 Linux 系统中权限的重要工具,能有效降低直接使用 root 用户所带来的安全风险。通过详细配置 sudoers 文件,管理员可以精确控制用户的权限,以及执行特定命令的方式和范围。这种方式不仅提升了系统的安全性,也方便了系统管理工作的进行。

二、用户别名案例

    在管理多用户系统时,使用相同授权的用户较多,或者授权的命令较多时,可以采用集中定义的别名。用户、主机、命令部分都可以定义为别名,并通过关键字 
User_Alias

Host_Alias

Cmnd_Alias

来进行设置。这些别名通常配置在

/etc/sudoers

文件中。

2.1 查看组下面的用户

要查看某个组下的用户,可以使用以下命令:

grep "wheel" /etc/group

2.2 用户别名的语法格式

2.2.1 User_Alias 用户别名

用户别名可以包含具体用户、用户组(以

%

引导),以及其他已经定义的用户别名。例如:

User_Alias OPERATORS = zhangsan, tom, lisi

2.2.2 Host_Alias 主机别名

主机别名可以是主机名、IP 地址、网络地址或其他主机别名,可以用

!

取反。例如:

Host_Alias MAILSVRS = smtp, pop

2.2.3 Cmnd_Alias 命令别名

命令别名可以是命令路径、目录(表示此目录内的所有命令)或其他事先定义过的命令别名。例如:

Cmnd_Alias PKGTOOLS = /bin/rpm, /usr/bin/yum

2.3 在

/etc/sudoers

文件中配置别名

2.3.1 使用

visudo

命令编辑 sudoers 文件

在终端中输入以下命令以安全地编辑 sudoers 文件:

sudo visudo

2.3.2 在 sudoers 文件中定义别名

在打开的文件中,找到合适的位置添加以下别名定义。例如,可以将别名定义放在文件的顶部,方便管理:

# 用户别名
User_Alias OPERATORS = zhangsan, tom, lisi
​
# 主机别名
Host_Alias MAILSVRS = smtp, pop
​
# 命令别名
Cmnd_Alias PKGTOOLS = /bin/rpm, /usr/bin/yum

2.3.3 配置别名权限

在定义好别名后,可以在文件中进一步配置这些别名的权限。例如:

# 允许 OPERATORS 别名中的用户在 MAILSVRS 别名中的主机上无密码执行 PKGTOOLS 别名中的命令
OPERATORS MAILSVRS = NOPASSWD: PKGTOOLS

2.3.4 完整的别名配置示例

以下是一个完整的示例,展示了如何在 sudoers 文件中定义和使用别名:

# 用户别名
User_Alias OPERATORS = zhangsan, tom, lisi
​
# 主机别名
Host_Alias MAILSVRS = smtp, pop
​
# 命令别名
Cmnd_Alias PKGTOOLS = /bin/rpm, /usr/bin/yum
​
# 允许 OPERATORS 别名中的用户在 MAILSVRS 别名中的主机上无密码执行 PKGTOOLS 别名中的命令
OPERATORS MAILSVRS = NOPASSWD: PKGTOOLS

2.3.5 保存并退出

编辑完成后,按

Ctrl + X

保存并退出

visudo

编辑器。如果没有语法错误,配置将立即生效。

2.4 案例分析

案例一:定义用户、主机和命令的别名并配置权限

Host_Alias MYHOSTS = kgc, localhost
User_Alias MYUSERS = zhangsan, wangwu, lisi
Cmnd_Alias MYCMNDS = /sbin/*, !/sbin/reboot, !/sbin/poweroff, !/sbin/init, !/usr/bin/rm
MYUSERS MYHOSTS = NOPASSWD: MYCMNDS

解释

  • 定义 MYHOSTS 别名,包含 kgclocalhost 两个主机。
  • 定义 MYUSERS 别名,包含 zhangsanwangwulisi 三个用户。
  • 定义 MYCMNDS 别名,包含 /sbin 目录下的所有命令,但排除了 rebootpoweroffinitrm 命令。
  • 指定 MYUSERS 别名中的用户在 MYHOSTS 别名中的主机上,可以无密码执行 MYCMNDS 别名中的命令。

案例二:通过别名方式添加授权记录

以下操作通过别名方式添加授权记录,允许用户

wangliu

wangliu

组、

useradmin

组,并定义命令别名,在主机

smtp

pop

中执行

rpm

yum

命令。

User_Alias USERADMIN = wangliu, %wangliu, %useradmin
Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, /usr/bin/passwd, !/usr/bin/passwd root
USERADMIN ALL = (root) NOPASSWD: USERADMINCMND

解释

  • 定义 USERADMIN 别名,包含 wangliu 用户、wangliu 组和 useradmin 组。
  • 定义 USERADMINCMND 别名,包含 useraddusermoduserdelpasswd 命令,但排除了 passwd root 命令。
  • 指定 USERADMIN 别名中的用户在所有主机上可以无密码执行 USERADMINCMND 别名中的命令,作为 root 用户。
验证别名以及命令路径

验证时,可能会遇到

sudo passwd root

不能执行的问题,可以通过以下方式解决:

Cmnd_Alias USERADMINCMND = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

2.4 启用 sudo 操作日志

编辑 sudoers 文件,启用 sudo 操作日志记录,以备管理员查看:

visudo
Defaults logfile = "/var/log/sudo"

如果已经启用 sudo 日志,则可以从

/var/log/sudo

文件中看到用户的 sudo 操作记录。另外,还可以通过

/var/log/secure

日志查看 sudo 操作步骤。

2.5 查看当前用户获得的 sudo 授权

sudo -l

2.6 其他案例

    sudo 配置记录的命令部分允许使用通配符 
*

和取反符号

!

。例如,若要授权用户

syrianer

可以执行

/sbin/

目录下除

ifconfig

route

以外的其他所有命令程序,可以执行以下操作:

visudo
syrianer localhost = /sbin/*, !/sbin/ifconfig, !/sbin/route

2.7 验证 sudo 操作

    通过 sudo 执行特权命令时,只需要将正常的命令行作为 sudo 命令的参数即可。由于特权命令程序通常位于 
/sbin

/usr/sbin

等目录下,普通用户执行时应使用绝对路径。例如:

/sbin/ifconfig ens33:0 192.168.1.11/24
    在当前会话过程中,第一次通过 sudo 执行命令时,必须以用户自己的密码(不是 root 用户或其他用户的密码)进行验证。此后再次通过 sudo 执行命令时,只要与前一次 sudo 操作的间隔时间不超过 5 分钟,则不再重复验证。若要查看用户自己获得的 sudo 授权,可以执行 
sudo -l

命令。未授权的用户将会得到 “may not run sudo” 的提示,已授权的用户则可以看到自己的 sudo 配置。

例如,用户

syrianer

可以在该主机上运行以下命令:

(root) /sbin/*, (root) !/sbin/ifconfig, (root) !/sbin/route

三、:开关机安全控制

    在互联网环境中,大部分服务器是通过远程登录的方式来进行管理的,而本地引导和终端登录过程往往容易被忽视,从而留下安全隐患。特别是当服务器所在的机房环境缺乏严格、安全的管控制度时,如何防止其他用户的非授权介入就成为必须重视的问题。

    对于服务器主机,其物理环境的安全防护是非常重要的,不仅要保持机箱完好、机柜锁闭,还要严格控制机房的人员进出、硬件设备的现场接触等过程。在开关机安全控制方面,除了要做好物理安全防护以外,还要做好系统本身的一些安全措施。

3.1 限制更改GRUB引导参数

    在之前的课程中介绍过通过修改 GRUB 引导参数,对一些系统问题进行修复。从系统安全的角度来看,如果任何人都能够修改 GRUB 引导参数,对服务器本身显然是一个极大的威胁。为了加强对引导过程的安全控制,可以为 GRUB 菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。

3.1.1 使用

grub2-mkpasswd-pbkdf2

命令设置GRUB密码

    为 GRUB 菜单设置的密码建议采用 
grub2-mkpasswd-pbkdf2

命令生成,表现为经过 PBKDF2 算法加密的字符串,安全性更好。生成密码后在

/etc/grub.d/00_header

配置文件中,添加对应的用户、密码等配置。

首先,生成 GRUB 密码:

[root@kgc ~]# grub2-mkpasswd-pbkdf2
输入口令:
Reenter password:  123456
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.E96097D1B1E470345D9FB62759335832B4A0F39CD4C9A57B502BD59CF1B8C393EEA37847984E242AAD4BFBB72E4BDC2196E6A7495CE7C86BF3D2498A34CAC2B7.B2EB99ED40267AE9496357B78C0DC04CE79957980A4A3FFA577B7502D70A5412D2EAD5CE4DAAC0FE068621CB29B76E44A7645EDCC7784FF20E113AF0B95E3467i

3.1.2 配置GRUB引导文件

备份原始的 GRUB 配置文件并修改

/etc/grub.d/00_header

文件,添加密码配置:

[root@kgc ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
[root@kgc ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak
[root@kgc ~]# vim /etc/grub.d/00_header
​
cat << EOF 
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.E96097D1B1E470345D9FB62759335832B4A0F39CD4C9A57B502BD59CF1B8C393EEA37847984E242AAD4BFBB72E4BDC2196E6A7495CE7C86BF3D2498A34CAC2B7.B2EB99ED40267AE9496357B78C0DC04CE79957980A4A3FFA577B7502D70A5412D2EAD5CE4DAAC0FE068621CB29B76E44A7645EDCC7784FF20E113AF0B95E3467i
EOF

使用

grub2-mkconfig

命令生成新的

grub.cfg

配置文件。

[root@kgc ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

重启系统进入 GRUB 菜单时,按

e

键将需要输入账号密码才能修改引导参数。

3.1.3 一步到位使用

grub2-setpassword

可以使用

grub2-setpassword

命令更方便地设置 GRUB 密码:

[root@kgc ~]# grub2-setpassword
输入密码:
再次输入密码:

3.2 终端登录安全控制

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

可以通过编辑

/etc/securetty

文件,限制 root 用户只在特定的终端上登录。

vi /etc/securetty
3.2.2 禁止普通用户登录

当服务器正在进行备份或调试等维护工作时,可能不希望再有新的用户登录系统。这时候,只需要简单地建立

/etc/nologin

文件即可。

login

程序会检查

/etc/nologin

文件是否存在,如果存在,则拒绝普通用户登录系统(root 用户不受限制)。

touch /etc/nologin
    此方法实际上是利用了 
shutdown

延迟关机的限制机制,只建议在服务器维护期间临时使用。当手动删除

/etc/nologin

文件或者重新启动主机以后,即可恢复正常。

拓展

    通常情况下,在
/etc/nologin

文件存在时,系统会阻止非根用户登录,但这仅适用于普通的登录方式,如通过SSH或控制台登录。然而,在某些情况下,已经登录的用户使用

su

命令切换用户时,可能不会受到

/etc/nologin

文件的限制。

1.原因分析

**

1.1su

命令的特性**:

su

(substitute user)命令用于切换到另一个用户,并且会继承当前会话。即使

/etc/nologin

文件存在,使用

su

命令切换用户时可能不会受到影响。

1.2已经登录的会话

如果用户已经成功登录到系统,然后使用

su

命令切换到另一个用户,即使

/etc/nologin

文件存在,也不会影响已经登录的会话。

2.验证与测试

为了验证这个行为,你可以进行以下测试:

2.1尝试通过SSH或控制台登录

确保

/etc/nologin

文件存在。

尝试通过SSH或控制台直接登录

xiewei

xiewei1

用户,看看是否被阻止。

**2.2使用

su

命令切换用户**:

从已经登录的根用户或其他非根用户会话中使用

su

命令切换用户,看看是否仍然能够成功切换。

3.示例操作

创建

/etc/nologin

文件。

尝试通过SSH或控制台登录:

# 假设你使用SSH登录
ssh xiewei@localhost
# 应该会看到登录被阻止的信息

使用

su

命令切换用户:

# 从root用户会话
su - xiewei
# 仍然能够切换到xiewei用户


3.2.3 虚拟机内远程不可

    虚拟控制台的选择可以通过按下 Ctrl+Alt 键和功能键 Fn (n=1~6) 来实现(tty1-tty6)。比如 tty1 为图形界面,tty2-6 为字符界面。

注释 tty4 来限制 root 登录:

# 编辑 /etc/securetty 文件,注释掉 tty4
vi /etc/securetty
# 注释 tty4 行
#tty4

3.2.4 使用

last

命令查看用户登录情况

可以使用

last

命令显示用户或终端登录情况:

last

3.3 系统弱口令检测

为了确保系统的安全性,必须进行弱口令检测。可以使用

John the Ripper

工具进行密码检测。

3.3.1 安装

John the Ripper

首先,下载并解压

John the Ripper

工具包:

tar zxvf john-1.8.0.tar.gz -C /opt/

安装编译环境:

yum install gcc gcc-c++ -y

切换到

src

目录并编译:

cd /opt/john-1.8.0/src
make clean linux-x86-64

3.3.2 使用

John the Ripper

进行密码检测

添加测试用户并设置密码:

useradd zhangsan
passwd zhangsan
cp /etc/shadow /root/shadow.txt

切换到

run

目录并执行

John the Ripper

cd /opt/john-1.8.0/run
./john /root/shadow.txt

查看已破解的密码:

./john --show /root/shadow.txt

使用字典文件进行扫描:

./john --wordlist=./password.lst /root/shadow.txt

3.4 网络端口扫描

为了确保服务器的安全性,定期进行网络端口扫描是非常重要的。可以使用

nmap

工具进行端口扫描。

3.4.1 安装

nmap

在 CentOS/RHEL 系统中:

yum install -y nmap

3.4.2 使用

nmap

进行端口扫描

常用的

nmap

扫描类型如下:

  • -sS:TCP SYN 扫描(半开扫描)
  • -sT:TCP 连接扫描
  • -sF:TCP FIN 扫描
  • -sU:UDP 扫描
  • -sP:ICMP 扫描
  • -P0:跳过 ping 检测

示例命令:

nmap -sT 127.0.0.1        # 扫描常用的 TCP 端口
nmap -sU 127.0.0.1        # 扫描常用的 UDP 端口
nmap -sP 127.0.0.1        # ICMP 扫描
nmap -P0 192.168.10.0/24  # 跳过 ping 检测

3.4.3 永久禁用 ping

编辑配置文件

/etc/sysctl.conf

vim /etc/sysctl.conf

添加以下配置:

net.ipv4.icmp_echo_ignore_all = 1

刷新配置:

sysctl -p

启用 ping:

net.ipv4.icmp_echo_ignore_all = 0
    通过上述步骤,你可以确保系统在开关机过程中和终端登录时的安全性,并通过弱口令检测和网络端口扫描进一步提升系统的整体安全性。

注意:这是屏蔽别人对自己的ping

四、防止破解和网络监控

4.1 通过PAM模块来防止破解SSH

为了增强系统的安全性,我们可以通过PAM(Pluggable Authentication Modules,可插拔认证模块)来防止SSH登录被破解。以下是具体的配置步骤和解释:

4.1.1 配置步骤

  1. 编辑PAM配置文件:使用文本编辑器打开/etc/pam.d/sshd文件:vim /etc/pam.d/sshd
  2. 添加配置项:在文件的第一行下面添加以下内容:auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=1200该配置的作用是,当尝试登录失败超过3次时,普通用户将被锁定600秒,root用户将被锁定1200秒。

4.1.2 配置项说明

  • deny:指定最大认证错误次数。如果超过此次数,将执行后面的策略,如锁定用户。默认情况下,用户将永远锁定,除非手动解锁。
  • unlock_time:锁定的持续时间,以秒为单位。
  • even_deny_root:即使是root用户,在认证错误时也会被锁定。
  • root_unlock_time:root用户在登录失败时的锁定时间,一般与even_deny_root一起使用。

4.1.3 手动解除锁定

  1. 查看某一用户的错误登录次数pam_tally2 --user=USERNAME例如,查看work用户的错误登录次数:pam_tally2 --user=work
  2. 清空某一用户的错误登录次数pam_tally2 --user=USERNAME --reset例如,清空work用户的错误登录次数:pam_tally2 --user=work --reset

4.1.4 PAM配置文件目录

  • /etc/pam.d/:PAM认证的服务配置文件目录。
  • /etc/pam.d/sshd:通过SSH连接时的PAM配置。
  • /etc/pam.d/login:本地文本终端的PAM配置。
  • /etc/pam.d/kde:KDE图形界面的PAM配置。
  • /etc/pam.d/system-auth:调用system-auth文件的服务的PAM配置。

4.2 网络状态监控

4.2.1 使用netstat命令查看网络状态

netstat

命令用于查看当前操作系统的网络连接状态、路由表、接口统计等信息,是了解网络状态及排除网络服务故障的有效工具。

  • 查看正在运行的使用TCP协议的网络状态信息netstat -natp
  • 查看正在运行的使用UDP协议的网络状态信息netstat -naup

4.2.2 netstat命令选项

  • -n:以数字的形式显示相关的主机地址、端口等信息。
  • -r:显示路由表信息。
  • -a:显示主机中所有活动的网络连接信息(包括监听、非监听状态的服务端口)。
  • -l:显示处于监听(Listening)状态的网络连接及端口信息。
  • -t:查看TCP(传输控制协议)相关的信息。
  • -u:显示UDP(用户数据报协议)相关的信息。
  • -p:显示与网络连接相关联的进程号、进程名称信息(需要root权限)。
  • Proto:显示连接使用的协议。
  • RefCnt:表示连接到本套接口上的进程数量。
  • Types:显示套接口的类型。
  • State:显示套接口当前的状态。
  • Path:表示连接到套接口的其他进程使用的路径名。

4.3 使用lsof命令查看打开的文件和进程

lsof

命令是一个在Unix和Linux系统上用于查看当前系统中打开的文件和进程的工具。它的名字是“List Open Files”的缩写。通过

lsof

命令,你可以查看系统中当前打开的文件、网络连接、管道和设备等资源信息。

4.3.1 常见用法

  1. 列出所有打开的文件lsof
  2. 列出指定进程的打开文件lsof -p <PID><PID>替换为你希望查看的进程ID,这会列出该进程打开的所有文件和资源。
  3. 列出指定用户打开的文件lsof -u <username><username>替换为你希望查看的用户名,这会列出该用户所有进程打开的文件和资源。
  4. 列出指定文件的打开进程lsof /path/to/file/path/to/file替换为你希望查看的文件路径,这会列出当前打开该文件的进程。
  5. 列出网络连接lsof -i这会列出所有当前系统上的网络连接信息,包括TCP、UDP等。
  6. 列出Unix域套接字lsof -U这会列出所有当前系统上的Unix域套接字。

4.3.2 附加选项

  • **-c <command>**:指定进程名或命令的名称,列出该命令打开的所有文件。
  • -t:仅列出进程ID(PID),而不显示其他信息。
  • :可以根据网络连接的具体条件进行过滤查看。
  • -n:不解析主机名,加快显示速度。

4.3.3 注意事项

  • lsof命令通常需要root权限才能显示所有进程的信息,尤其是对于其他用户的进程和系统级资源。
  • lsof的输出结果可以非常庞大和详细,特别是在系统负载较高或者进程数众多的情况下,建议根据需要结合适当的选项和过滤条件使用。
  • lsof是系统管理员和开发人员调试和监视系统的有用工具,能够帮助定位和解决文件打开问题、网络连接问题以及资源占用情况等。
标签: 服务器 linux 运维

本文转载自: https://blog.csdn.net/xw2441176267/article/details/140180940
版权归原作者 爱吃糖的蠢猫 所有, 如有侵权,请联系我们删除。

“安全及应用(更新)”的评论:

还没有评论