系统安全

一、系统权限

1. 安装系统

  • 选择稳定版操作系统
  • 最小化安装
  • 不要安装gcc,make
  • 安装完系统后
  • 更新系统 ```powershell [root@localhost ~]# yum -y update 使软件版本处于稳定状态 [root@localhost ~]# yum -y update

生产环境对软件版本和内核版本要求非常精确,别没事有事随便的进行yum update操作!

Linux升级命令有两个分别是yum upgrade和yum update, 这个两个命令是有区别的:

yum -y update 升级所有包同时也升级软件和系统内核

yum -y upgrade 只升级所有包,不升级软件和系统内核

  1. <a name="46d2c5fb"></a>
  2. ### 2. 文件(目录)权限
  3. <a name="4ad4c37d"></a>
  4. #### a、基本权限 rwx
  5. - `/root 550 /tmp 1777 /etc/passwd 644 /etc/shadow 无权限`
  6. - 对于目录,默认权限 755=777-umask
  7. - 对于文件,默认权限644=666-umask(文件默认无执行权限)
  8. - 修改umask(尽量不要改)
  9. ```powershell
  10. [root@localhost ~]# vim /etc/bashrc
  11. 71 umask 002 #普通用户
  12. 72 else
  13. 73 umask 022 #超级用户
  14. 74 fi
  15. [root@localhost ~]# vim /etc/profile
  16. 60 umask 002 #普通用户
  17. 61 else
  18. 62 umask 022 #超级用户
  19. [root@localhost home]# ls -ld .
  20. drwxr-xr-x. 4 root root 74 3月 11 13:43 .
  21. [root@localhost home]# ls -ld /root
  22. dr-xr-x---. 6 root root 238 3月 11 13:01 /root 550权限
  23. [root@localhost home]# ls -ld /tmp/
  24. drwxrwxrwt. 25 root root 4096 3月 11 14:27 /tmp/ 1777 权限
  25. root@localhost home]# ls -ld /etc/passwd
  26. -rw-r--r--. 1 root root 2362 3月 10 23:43 /etc/passwd 644
  27. [root@localhost home]# ls -ld /etc/shadow
  28. ----------. 1 root root 1291 3月 10 23:43 /etc/shadow 没有权限

b、特殊权限 suid sgid sticky

1. suid 冒险位(设置位S),执行二进制文件与文件所有人有关,与谁来执行无关
  • 作用:为了让一般使用者临时具有该文件所属主/组的执行权限。让普通用户拥有可管理用户的权限
  • 比如让普通用户临时拥有管理员对该文件的执行权限
  • 冒险位一般是给二进制文件设置的(一般给命令)

只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义; 例如:/usr/bin/passwd在执行它的时候需要去修改/etc/passwd/etc/shadow等文件,这些文件除了root外,其他用户都没有写权限,但是又为了能让普通用户修改自己的密码,该怎么办呢?

答:可以临时让他们具有root的权限,而这个s权限就是用来完成这个特殊任务的。s权限只能应用在二进制的可执行文件上。

  • 基本语法: ```powershell [root@localhost home]# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

去除s权限,基本语法:

chmod u-s /usr/bin/passwd 或 chmod 0755 /usr/bin/passwd

加s权限,基本语法:

chmod u+s /usr/bin/passwd 或 chmod 4755 /usr/bin/passwd

[root@localhost network-scripts]# which less /usr/bin/less [root@localhost network-scripts]# ls -l /usr/bin/less -rwxr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less [root@localhost network-scripts]# less /etc/shadow [root@localhost network-scripts]# su - wuhe 上一次登录:四 3月 11 11:15:36 CST 2021:0 上 [wuhe@localhost ~]$ less /etc/shadow /etc/shadow: 权限不够 [wuhe@localhost ~]$ exit

[root@localhost network-scripts]# ls -l /usr/bin/less -rwxr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less [root@localhost network-scripts]# chmod 4755 /usr/bin/less [root@localhost network-scripts]# ls -l /usr/bin/less -rwsr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less [root@localhost network-scripts]# chmod 0755 /usr/bin/less [root@localhost network-scripts]# ls -l /usr/bin/less -rwxr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less [root@localhost network-scripts]# chmod u+s /usr/bin/less [root@localhost network-scripts]# ls -l /usr/bin/less -rwsr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less [root@localhost network-scripts]# chmod u-s /usr/bin/less [root@localhost network-scripts]# ls -l /usr/bin/less -rwxr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less

[root@localhost network-scripts]# chmod u+s /usr/bin/less [root@localhost network-scripts]# ls -l /usr/bin/less -rwsr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less

[root@localhost network-scripts]# su - wuhe 上一次登录:四 3月 11 15:14:38 CST 2021pts/1 上 [wuhe@localhost ~]$ ls -l /usr/bin/less -rwsr-xr-x. 1 root root 158240 7月 31 2015 /usr/bin/less [wuhe@localhost ~]$ less /etc/shadow

为了让一般使用者临时具有该文件所属主/组的执行权限。让普通用户拥有可管理用户的权限 相当于把普通用户 变成root用户 具有操作改文件的权限

[wuhe@localhost ~]$ cat /etc/shadow cat: /etc/shadow: 权限不够

文件属主的x权限,用s代替.表示被设置了SUID 如果属主位没有x权限,会显示为大写S,表示有故障(权限无效) -rwxr-xr-x. 1 root root 0 Nov 17 20:18 f1 chmod u+s -rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1 区别: -rw-r-xr-x. 1 root root 0 Nov 17 20:18 f1 chmod u+s -rwSr-xr-x. 1 root root 0 Nov 17 20:18 f1

| 数字 | 权限 | 作用 |
| --- | --- | --- |
| 0 | --- | **无任何权限** |
| 1 | --t | stick bit,针对公共目录,**只有root和文件的创建者可以删除文件**,其他人只能自己管理自己。设置方式:o+t 或 o-t 或 1xxx |
| 2 | -s- | setgid强制位,针对目录,任何在该目录里创建的任何文件的属组都继承了该目录的属组。设置方式:g+s 或 g-s 或 2xxx |
| 3 | -st |  |
| 4 | s-- | setuid冒险位,**针对二进制文件,用户临时拥有文件拥有者的权限**。设置方式:u+s 或 u-s 或 4xxx |
| 5 | s-t |  |
| 6 | ss- |  |
| 7 | sst |  |


<a name="487b6bb3"></a>
##### 2. sgid 强制位,对目录生效,在此目录中创建文件自动归入目录所在组

- 作用: **针对目录,任何在该目录里创建的任何文件的属组都继承了该目录的属组。该任何文件的属主不变**
- 基本语法
```powershell
设置方式:g+s 或 g-s 或 2xxx
chmod g+s DIR/FILE... chmod 2777 
chmod g-s DIR/FILE...

普通帐户quintin在/tmp中创建一个目录叫quintindir,添加SGID.权限777
$ chmod 2777 quintindir/
$ ll -d quintindir/
drwxrwsrwx. 2 quintin quintin 6 Nov 18 14:42 quintindir/ 

切换到普通用户user1,在quintindir目录中创建一个文件和一个目录

$ touch user1file
$ mkdir user1dir
$ ll
-rw-rw-r--. 1 user1 quintin 0 Nov 18 14:47 user1file
drwxrwsr-x. 2 user1 quintin 6 Nov 18 14:47 user1dir
  • -rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1

    文件属组的 x 权限,用 s 代替.表示被设置了SGID 如果属组位没有 x 权限,会显示为大写 S ,表示有故障(权限无效)

3. sticky 粘制位(误删除位T),目录中的文件只能被文件拥有者删除
  • 作用:只针对目录生效, 它表示只能让所属主以及root可以删除(重命名/移动)该目录下的文件。比如/tmp目录本来就是任何用户都可以读写,如果别人可以任意删除(重命名/移动)我们自己的文件,那岂不是很危险,所以这个 t 权限就是为了解决这个问题。
  • 基本语法: ```powershell [wuhe@localhost ~]$ ls -ld /tmp drwxrwxrwt. 25 root root 4096 3月 11 15:59 /tmp

去除t权限,基本语法:

chmod -R o-t /file 或 chmod 0777 /file

加t权限,基本语法:

chmod -R o+t /file 或 chmod 1755 /file

[root@localhost ~]# chmod 1777 dirname



`drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp`

> 文件other位的x权限,用 t 代替.表示被设置了Sticky
>  如果other位没有 x 权限,会显示为大写T,表示有故障(权限无效)

c、文件ACL getfacl setfacl

  • getfacl命令:查看文件的ACL策略及权限
  • setfacl命令: 给文件针对某个用户或者某个组来增加ACL策略
  • 文件移动之后文件的权限不会跟着移动
  • 对文件的权限进行附加说明的权限设定方式
  • ACL提供传统的owner/group/other的read/write/execute之外的细部权限设定。(可以针对单一的使用者,目录等等)
  • 查看 ```powershell [wuhe@localhost tmp]$ ll 如果selinux 开了会有一个 点 . -rw-r—r—. 1 root root 2865 3月 11 00:06 anaconda.log
[root@localhost ~]# ls -l
总用量 1
-rw-r--r--  1 root root   4 2月  17 20:56 test.txt
#-rw-r--r--+ 如果权限后面带有‘+’号表示有ACL权限
[root@localhost ~]# getfacl test.txt
# file: test.txt 文件名
# owner: root 文件所属者
# group: root 文件所属组
user::rw- 属主权限
group::r-- 属组权限
other::r-- 其他人权限

- 设定ACL权限
```powershell

#setfacl -m <u|g|m>:<username|groupname>:权限 filename
#setfacl -x <u|g>:<username|groupname> filename  ##去除某个用户或者组的acl
#setfacl -b         filename  ##删除文件上的权限列表

[root@localhost ~]# useradd jack
[root@localhost ~]# setfacl -m u:jack:rw test.txt


[root@localhost ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
user:jack:rw- 为jack设置rw权限
group::r--
mask::rw-
other::r--
[root@localhost ~]# ls -l test.txt
-rw-rw-r--+ 1 root root 4 2月  17 20:56 test.txt

去除某个用户或者组的acl

[root@localhost ~]# setfacl -x u:wuhe test.txt
[root@localhost ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

[root@localhost ~]# setfacl -b test.txt
[root@localhost ~]# getfacl test.txt
# file: test.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

d、文件属性 chattr lsattr +a -a +i -i -d

**有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了。chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux系统都是2.6以上内核了。**

**通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。lsattr命令是显示chattr命令设置的文件属性。**

作用:

改变文件属性,这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有一下8种模式

模式:

a: 让文件或目录仅供附加用途 b: 不更新文件或目录的最后存取时间 c: 将文件或目录压缩后存放 d:将文件或目录排除在倾倒操作之前 i: 不得任意更动文件或目录 s: 保密性删除文件或目录 S: 即时更新文件或目录 u: 预防意外删除 选项:

-R: 递归处理, 将指令目录下的所有文件以及子目录一并处理 -V: 显示指令执行过程 + :开启该项属性 - : 关闭该项属性 = :指定属性 实例:

用chattr 命令防止系统中某个关键文件被修改 chattr +i /etc/fstab //rm,mv,rename 等命令都无法操作 让某个文件只能追加内容,不能删除,一些日志文件适用于该操作。 chattr +a /data1/usr_act.log

#只能给文件添加内容,但是删除不了,属于追加
比如把/etc/passwd  只能添加用户还不能把这个文件删了
[root@localhost ~]# chattr +a /etc/passwd
[root@localhost tmp]# lsattr /etc/passwd
-----a---------- /etc/passwd
[root@localhost tmp]# rm -rf /etc/passwd

rm: 无法删除"/etc/passwd": 不允许的操作
[root@localhost ~]# chattr +a test.txt
[root@localhost ~]# echo "456" >>  test.txt
[root@localhost ~]# lsattr test.txt
-----a---------- test.txt
[root@localhost ~]# rm -rf test.txt
rm: 无法删除"test.txt": 不允许的操作
[root@localhost ~]# chattr -a test.txt


#文件不能删除,不能更改,不能移动 锁定某个文件
[root@localhost ~]# chattr +i test.txt
[root@localhost ~]# lsattr test.txt
----i----------- test.txt
[root@localhost ~]# echo 1111 >> test.txt
-bash:test.txt: 权限不够

不能添加用户
[root@localhost tmp]# chattr +i /etc/passwd
[root@localhost tmp]# lsattr /etc/passwd
----i----------- /etc/passwd
[root@localhost tmp]# useradd aa
useradd:无法打开 /etc/passwd

[root@localhost tmp]# chattr -i /etc/passwd

为了安全可以把这个命令隐藏(移动)甚至不能使用这个命令(用visudo 限制)

[root@localhost tmp]# which chattr
/usr/bin/chattr
[root@localhost tmp]# mv /usr/bin/chattr /opt/ch
[root@localhost tmp]# chattr -i /etc/passwd
-bash: /usr/bin/chattr: 没有那个文件或目录
[root@localhost tmp]# which chattr
/usr/bin/which: no chattr in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@localhost tmp]# /opt/ch -i /etc/passwd
[root@localhost tmp]# lsattr /etc/passwd
---------------- /etc/passwd

案例1:防删除,防修改、防移动

[root@localhost ~]# find /bin /sbin /usr/sbin /usr/bin /etc/shadow /etc/passwd  /etc/pam.d -type f -exec chattr +i {} \;

案例2:日志文件防删除

[root@localhost ~]# chattr +a /var/log/messages /var/log/secure
#日志切割要先去掉a属性,之后增加a属性
[root@localhost ~]# vim /etc/logrotate.d/syslog
prerotate
 chattr -a /var/log/messages
endscript
...
postrotate
 chattr +a /var/log/messages
endscript
}

netstat -anput看自己服务器被被人访问的情况

[root@localhost tmp]# netstat -anput
Active Internet connections (servers and established)
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      796/rpcbind
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1765/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1370/sshd
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1369/cupsd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1838/master
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      19932/sshd: root@pt
tcp        0      0 127.0.0.1:5900          0.0.0.0:*               LISTEN      6613/qemu-kvm
tcp        0      0 127.0.0.1:5901          0.0.0.0:*               LISTEN      6705/qemu-kvm
tcp        0      0 192.168.0.106:22        192.168.0.100:1368      ESTABLISHED 19936/sshd: root@no
tcp        0     48 192.168.0.106:22        192.168.0.100:1365      ESTABLISHED 19932/sshd: root@pt

日志文件:https://www.cnblogs.com/linux985/p/11533903.html

Linux常见的日志文件详述如下  centos redhat

1、/var/log/boot.log(该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息)
2、/var/log/cron (crontab守护进程crond所派生的子进程的动作)
3、/var/log/maillog (发送到系统或从系统发出的电子邮件的活动)

4、/var/log/syslog (它只记录警告信息,常常是系统出问题的信息,所以更应该关注该文件)
要让系统生成syslog日志文件,
在/etc/rsyslog.conf文件中加上:*.warning /var/log/syslog   
该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息

5、/var/run/utmp
该日志文件需要使用lastlog命令查看 (该日志文件记录有关当前登录的每个用户的信息)
6、/var/log/wtmp
(该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件)
因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统 用户登录的次数。
last命令就通过访问这个文件获得这些信息

[root@localhost log]# last wtmp

[root@localhost log]# last
root     pts/1        192.168.0.100    Thu Mar 11 12:40   still logged in
wuhe     :0           :0               Thu Mar 11 11:15   still logged in
root     pts/0        192.168.0.100    Thu Mar 11 10:01 - 13:01  (02:59)
root     pts/0        192.168.0.100    Thu Mar 11 10:00 - 10:01  (00:01)
reboot   system boot  3.10.0-1127.el7. Thu Mar 11 09:55 - 17:26  (07:30)
wuhe     pts/0        :0               Thu Mar 11 00:07 - crash  (09:48)
wuhe     :0           :0               Thu Mar 11 00:06 - crash  (09:49)
reboot   system boot  3.10.0-1127.el7. Wed Mar 10 23:54 - 17:26  (17:32)

wtmp begins Wed Mar 10 23:54:05 2021



7、/var/log/messages  -- 记录系统或服务程序运行的状态信息 和 错误信息 

8、/var/log/secure(安全) -- 用户登录信息
  作用:可以进行监控文件的信息,检查是否有过多失败记录
例如pop3,ssh,telnet,ftp等都会记录在此

###安装相应的服务产生的日志
1、/usr/local/apache/logs/error_log(它是记录apache的日志目录)
2、/var/log/httpd/error_log (它是记录http的日志目录)
3、/var/log/xferlog
(该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件)

e、mask umask权限

[root@localhost ~]# umask
0022
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx

f、mount 权限 -o

rw(可读可写) ro(只读)
sync(同步) async(异步)

此选项的默认模式为异步模式。在同步模式下,内存的任何修改都会实时的同步到硬盘当中,这种模式的安全性基本属于最高,但是因为内存的数据基本一直都在变化,所以这种模式会使得程序运行变得缓慢,影响效率。 而在异步模式下,虽然同步没有实时,但是现在考虑到日志文件系统的存在,所以安全性基本不用考虑,而异步模式的效率会更高,随意目前普遍使用异步模式为默认

auto(自动挂载) noauto(非自动)

合理规划权限,尽量避免777权限出现

3. 用户授权

1. su

  • 由超级用户切换为普通用户,仅切换用户,环境变量不切换,如若为普通用户,会导致命令不可用(这种不要用) ```powershell [root@localhost ~]# su wuhe [wuhe@localhost root]$ touch 1.txt touch: 无法创建”1.txt”: 权限不够

[root@localhost tmp]# su wuhe [wuhe@localhost tmp]$ exit exit [root@localhost tmp]# su - wuhe 上一次登录:四 3月 11 16:21:13 CST 2021pts/1 上 [wuhe@localhost ~]$


- 由超级用户切换为普通用户,切换用户至家目录,环境变量会发生改变
```powershell
[root@localhost ~]# su - jack
上一次登录:日 2月 17 21:48:05 CST 2019pts/1 上
[jack@localhost ~]$
  • 由普通用户切换为root用户
    [jack@localhost ~]$ su - root
    密码: #需要输入密码,可获取root全部权限,此处密码认证由PAM提供
    上一次登录:日 2月 17 20:45:56 CST 2019从 192.168.2.1pts/1 上
    [root@localhost ~]#
    

2. sudo

  • 给普通用户提升(赋予)权限的方法
    • suid,sgid (冒险位,强制位)
    • usermod (授权)
    • switching users with su (切换用户)
    • running commands as root with sudo (sudo)
  • 使用sudo提升(赋予)权限普通用户的权限
    可根据/etc/sudoers文件设置普通用户使用sudo命令时可以以root身份或其他用户身份运行命令

    • 使用vim直接编辑/etc/sudoers文件

      [root@localhost ~]# vim /etc/sudoers
      #不推荐
      
    • 使用visudo编辑/etc/sudoers
      授权配置在/etc/sudoers这个文件中,默认这个文件是只读权限,它有个专门的工具叫visudo,这个命令能不仅能编辑这个配置文件,还能对输入内容做语法检测,如果语法有误,会提示错误位置,并且不会保存到配置文件中,它还能指出语法错误。其实visudo命令相当于:vi /etc/sudoers。 ```powershell [root@localhost ~]# visudo

      推荐,会检查语法

      Sudoers allows particular users to run various commands as

      the root user, without needing the root password.

      #

      Examples are provided at the bottom of the file for collections

      of related commands, which can then be delegated out to particular

      users or groups.

      #

      This file must be edited with the ‘visudo’ command.

Host Aliases 主机别名

Groups of machines. You may prefer to use hostnames (perhaps using

wildcards for entire domains) or IP addresses instead.

Host_Alias FILESERVERS = fs1, fs2

Host_Alias MAILSERVERS = smtp, smtp2

User Aliases 用户别名

These aren’t often necessary, as you can use regular groups

(ie, from files, LDAP, NIS, etc) in this file - just use %groupname

rather than USERALIAS

User_Alias ADMINS = jsmith, mikem

Command Aliases 命令别名

These are groups of related commands…

Syntax: 语法

#

user MACHINE=COMMANDS

  用户名   主机       命令

The COMMANDS section may have other options added to it.

#

Allow root to run any commands anywhere

root ALL=(ALL) ALL

Allows members of the ‘sys’ group to run networking, software,

service management apps and more.

%sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

Allows people in group wheel to run all commands

%wheel ALL=(ALL) ALL 建议把这行注释


   - sudo语法
```powershell
#user MACHINE=(RUN_AS_USER) COMMANDS
jack ALL=ALL ALL
#允许jack用户 在任何主机上=(以任何人的身份) 执行任何命令
  • 案例
    案例1:对用户 (对比给二进制文件添加冒险位) ```powershell [root@localhost ~]# grep jack /etc/passwd jack:x:1001:1001::/home/jack:/bin/bash [root@localhost ~]# grep owen /etc/passwd owen:x:1002:1002::/home/owen:/bin/bash [root@localhost ~]# visudo jack ALL=/sbin/ip, /sbin/fdisk, /bin/less

    赋予jack用户以root的身份使用以上3个命令的权限

[root@localhost ~]# ls -l /etc/shadow —————. 1 root root 1291 3月 10 23:43 /etc/shadow [root@localhost ~]# su -jack

[jack@localhost ~]$ less /etc/shadow /etc/shadow: 权限不够 [jack@localhost ~]$ sudo less /etc/shadow

我们信任您已经从系统管理员那里了解了日常注意事项。 总结起来无外乎这三点:

#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。

[sudo] jack 的密码: [jack@localhost ~]$

[root@localhost ~]# visudo owen ALL=NOPASSWD: /bin/less

赋予owen用户使用以上1个命令的权限,切换时不需要输入密码

[root@localhost ~]# visudo jack ALL=NOPASSWD: /sbin/ip, /sbin/fdisk, !/bin/less /etc/shadow [root@localhost ~]# su - jack 上一次登录:四 3月 11 18:08:19 CST 2021pts/1 上 [jackjack@localhost ~]$ sudo less /etc/shadow 对不起,用户 jack 无权以 root 的身份在 localhost.localdomain 上执行 /bin/less /etc/shadow。

[wuhe@localhost ~]$ visudo visudo: /etc/sudoers: 权限不够 [wuhe@localhost ~]$ ll /etc/sudoers -r—r——-. 1 root root 4382 3月 11 18:16 /etc/sudoers


   - 案例2:对组
```powershell
[root@localhost ~]# groupadd smartgo
[root@localhost ~]# useradd it01 -G smartgo
[root@localhost ~]# useradd it02 -G smartgo
[root@localhost ~]# id it01
uid=1003(it01) gid=1004(it01) 组=1004(it01),1003(smartgo)
[root@localhost ~]# id it02
uid=1004(it02) gid=1005(it02) 组=1005(it02),1003(smartgo)
[root@localhost ~]# visudo
%smartgo     ALL=NOPASSWD: /sbin/ip
%smartgo     ALL=NOPASSWD: /sbin/useradd, /sbin/userdel, /bin/passwd
%smartgo     ALL=NOPASSWD: !/usr/bin/rm, !/bin/passwd root, !/bin/passwd root --stdin,!/bin/passwd --stdin root
[root@localhost ~]# su - it01
[it01@localhost ~]$ sudo passwd root
对不起,用户 it01 无权以 root 的身份在 localhost.localdomain 上执行 /bin/passwd root。
  • 案例3:别名使用
    [root@localhost ~]# visudo
    ## Host Aliases
    # Host_Alias   FILESERVERS = fs1, fs2
    Host_Alias     MAILSERVERS = smtp, smtp2
    ## User Aliases
    User_Alias ADMINS = jsmith, mikem
    ## Command Aliases
    ## These are groups of related commands...
    ## Networking
    Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
    /usr/bin/net,
    /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
    ## Installation and management of software
    Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
    ## Services
    Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
    ## Updating the locate database
    Cmnd_Alias LOCATE = /usr/bin/updatedb
    ## Storage
    Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe,
    /bin/mount, /bin/umount
    jack ALL=NOPASSWD: NETWORKING  
    %smartgo   ALL=NOPASSWD: STORAGE    
    ADMINS  ALL=NOPASSWD: NETWORKING, STORAGE
    
  • sudo日志(查看sudo 操作日志) ```powershell [root@localhost ~]# grep ‘^authpriv’ /etc/rsyslog.conf authpriv.* /var/log/secure

/var/log/secure 可以给这个日志文件加 +a 权限 [root@localhost ~]# tail -f /var/log/secure Feb 17 22:31:52 localhost passwd: pam_unix(passwd:chauthtok): password changed for root Feb 17 22:31:52 localhost passwd: gkr-pam: couldn’t update the login keyring password: no old password was entered Feb 17 22:32:15 localhost sudo: it01 : command not allowed ; TTY=pts/1 ; PWD=/home/it01 ; USER=root ; COMMAND=/bin/passwd root —stdin Feb 17 22:32:28 localhost su: pam_unix(su-l:session): session closed for user it01 Feb 17 22:33:10 localhost su: pam_unix(su-l:session): session opened for user it01 by root(uid=0) Feb 17 22:33:17 localhost sudo: it01 : command not allowed ; TTY=pts/1 ; PWD=/home/it01 ; USER=root ; COMMAND=/bin/passwd root Feb 17 22:33:30 localhost sudo: it01 : TTY=pts/1 ; PWD=/home/it01 ; USER=root ; COMMAND=/bin/passwd owen Feb 17 22:33:36 localhost passwd: pam_unix(passwd:chauthtok): password changed for owen Feb 17 22:33:36 localhost passwd: gkr-pam: couldn’t update the login keyring password: no old password was entered Feb 17 22:33:39 localhost su: pam_unix(su-l:session): session closed for user it01


<a name="75712f4b"></a>
### 4. 用户认证

<a name="6bcae55e"></a>
#### 1. 用户认证方式

- PAM(gdm/kdm桌面用户密码认证,su,ssh,ftp,samba)
- 自带数据库验证方式(MySQL,Zabbix)
- web验证方式(htpasswd)
- 集中式身份认证

<a name="9f566241"></a>
#### 2. PAM介绍

[https://blog.csdn.net/zhgn2/article/details/7531429](https://blog.csdn.net/zhgn2/article/details/7531429)

[https://blog.51cto.com/essun/1391133](https://blog.51cto.com/essun/1391133)

[https://www.infoq.cn/article/linux-pam-one/](https://www.infoq.cn/article/linux-pam-one/)

PAM(Pluggable Authentication Modules) 即可插拔式认证模块,它是一种高效而且灵活的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。<br />PAM可以根据用户的网段、时间、用户名、密码等实现认证。

<a name="f17743ac"></a>
#### 3. PAM身份认证

使用PAM做身份认证的服务有:本地(login、gdm、kdm), sshd, vsftpd,samba等<br />不使用PAM做身份认证的服务有:MySQL-Server,Zabbix等

- PAM使用帮助<br />`[root@localhost ~]# firefox /usr/share/doc/pam-1.1.8/html/Linux-PAM_SAG.html`<br />`man pam`
- PAM认证原理

```powershell
Service(进程文件) → PAM(配置文件) → pam_*.so → 模块的配置文件
/usr/sbin/sshd ->  /etc/pam.d/sshd ->

/lib64/security/pam_access.so->
/etc/security/access.conf

/lib64/security/pam_limits.so  ->
/etc/security/limits.conf

/lib64/security/pam_time.so   ->
/etc/security/time.conf


/bin/su      /etc/pam.d/su  /lib64/security/pam_rootok.so


# ps aux |grep sshd  查看进程

linux脚本中#!的作用
用来指定脚本用什么解释器来执行
#% 用于数据绑定
  • PAM认证原理案例
Service(进程文件) → PAM(配置文件) → pam_*.so → 模块的配置文件
[root@localhost ~]# ldd /usr/sbin/sshd | grep -i pam
   libpam.so.0 => /lib64/libpam.so.0 (0x00007f65d9d8e000)

[root@localhost ~]# grep -i pam /etc/ssh/sshd_config
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause
several
UsePAM yes    使用了PAM 认证
[root@localhost ~]# vim /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
#与polkit一起使用以重新授权远程会话中的用户
-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
#selinux关闭执行如下
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
#selinux开启执行如下
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常见的四种认证类型
auth          认证管理 验证使用者身份,账号和密码
account      用户管理 基于用户时间或密码有效期来决定是否允许访问
password     密码(口令)  认证管理 禁止用户反复尝试登录,在变更密码时进行密码复杂性控制
session     会话管理 进行日志记录,或者限制用户登录的次数,资源限制
  • PAM认证流程控制(流程标记)
Required (必要条件) 验证失败时仍然继续,但返回fail 用户不会知道哪里失败
Requisite (必要条件) 验证失败时则立即结束整个验证过程,返回fail 面试若不成功,马上失败,效率高
Sufficient (充分条件) 验证成功则立即返回,不再继续,否则忽略结果并继续 相当于面试中的拔高题
Optional (可选条件) 无论验证结果如何,均不会影响 常用于session类型
Include  包含另外一个配置文件中类型相同的行
substack  垂直叠加
  • PAM常用模块(ssh)
模块:pam_rootok.so
功能:用户UID是0,返回成功
示例:限制root切换用户也需要密码
[root@localhost ~]# head -1 /etc/pam.d/su
# auth sufficient pam_rootok.so  这行如果注释,管理员切普通用户则需要密码
示例:sshd不需要密码登录
[root@localhost ~]# head -1 /etc/pam.d/sshd
auth sufficient pam_rootok.so
#放在文件的第一行


模块:pam_access.so
功能:访问控制,默认配置文件/etc/security/access.conf
通常作用于登录程序,如su,login,gdm,sshd,

例如:限制用户从哪些网段登录sshd
示例:不允许root从192.168.1.0/24登录sshd

 (跳板机的时候可以限制登陆)
[root@localhost ~]# grep access.so /etc/pam.d/sshd
auth  required  pam_access.so  如果没有则把这个模块加入/etc/pam.d/sshd中

[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

[root@localhost pam.d]# vim /etc/pam.d/sshd
#%PAM-1.0
auth      required  pam_access.so   第一行加入pam_access.so模块
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions

使用了这个模块之后再改这个模块的配置文件
[root@localhost ~]# vim /etc/security/access.conf
-:root:192.168.122.2     #拒接ssh连接root用户在192.168.122.2 登录
-:root:192.168.122.0/24

-:root:ALL EXCEPT 192.168.1.0/24   (IP的CIDR写法)
-:root:192.168.122.0/24 EXCEPT 192.168.122.1
  (拒绝192.168.122.0/24的所有ip除了192.168.122.1)

+ 代表允许  - 代表拒绝

# User "root" should be allowed to get access from hosts with ip addresses.
#+:root:192.168.200.1 192.168.200.4 192.168.200.9


示例:使用不同的模块配置文件也可以完成上面的操作,不同的用户不同的配置


[root@localhost ~]# grep access /etc/pam.d/login
在这个文件/etc/pam.d/login 的第一行 加下面这行
auth  required  pam_access.so accessfile=/accessfile2
[root@localhost pam.d]# cat /etc/pam.d/login
#%PAM-1.0
auth  required  pam_access.so accessfile=/accessfile2  加的
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule

[root@localhost ~]# vim /accessfile2
-:jack:tty5 tty6     #拒绝jack 这个用户在tty5 tty6  终端登录
[root@localhost ~]# grep jack /accessfile2
-:jack:tty5 tty6
===========================================================================
[root@localhost ~]# grep access.so /etc/pam.d/sshd
auth  requisite  pam_access.so accessfile=/accessfile1
[root@localhost ~]# grep 110 /accessfile1
-:root:ALL EXCEPT 192.168.2.110

模块:pam_listfile.so
功能:基于自定义文件允许或拒绝(黑名单或白名单)

使用pam_listfile.so模块配置的格式分为五个部分:分别是item、sense、file、onerr以及apply。 其中:

item=[tty|user|rhost|ruser|group|shell]:定义了对哪些列出的目标或者条件采用规则,显然,这里可以指定多种不同的条件。
onerr=succeed|fail:定义了当出现错误(比如无法打开配置文件)时的缺省返回值。
sense=allow|deny:定义了当在配置文件中找到符合条件的项目时的控制方式。如果没有找到符合条件的项目,则一般验证都会通过。
file=filename:用于指定配置文件的全路径名称。
apply=user|@group:定义规则适用的用户类型(用户或者组)。


示例:vsftpd黑名单或白名单
[root@localhost ~]# yum -y  install vsftpd
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers(黑名单文件)  user_list(黑白名单)  vsftpd.conf vsftpd_conf_migrate.sh
===================================================
[root@localhost ~]# grep listfile /etc/pam.d/vsftpd
auth    required   pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers  onerr=succeed

示例:sshd黑名单或白名单
[root@localhost ~]# grep listfile /etc/pam.d/sshd
auth    required   pam_listfile.so item=user sense=allow file=/etc/ssh_users  onerr=fail
[root@localhost ~]#vim /etc/ssh_users
root
jack    (只有 root 和jack 可以ssh 登陆)
#[root@localhost ~]# echo root > /etc/ssh_users
当/etc/ssh_users不存在时,fail

ssh连接测试:
[root@localhost ~]# ssh jack@登录的主机IP

模块:pam_time.so
功能:基于时间的访问控制,默认文件/etc/security/time.conf
示例:基于时间限制sshd的访问
[root@localhost ~]# grep time /etc/pam.d/sshd
account  required   pam_time.so
[root@localhost ~]# 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_time.so    加入这行
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth

去这个/etc/security/time.conf 加入这行 sshd;*;*;MoTuWeThFr0800-1100
[root@localhost ~]# grep 0800 /etc/security/time.conf
sshd;*;*;MoTuWeThFr0800-1100   #周一到周五8点到11点

进程:终端:用户:时间(取决于服务器的时间)
测试:ssh  终端测试


模块:pam_tally2.so
功能:登录统计
示例:实现防止对sshd暴力破解
[root@localhost vsftpd]# cat /etc/pam.d/sshd
#%PAM-1.0
auth    required  pam_tally2.so deny=2 even_deny_root root_unlock_time=60
unlock_time=60    加入这行 
auth       required     pam_sepermit.so
auth       substack     password-auth
auth       include      postlogin


[root@localhost ~]# grep tally2 /etc/pam.d/sshd
auth    required  pam_tally2.so deny=2 even_deny_root root_unlock_time=60
unlock_time=60
#deny=2 连续错误登录最大次数,超过最大次数,将被锁定
#even_deny_root root用户也被要求锁定
#root_unlock_time root用户被锁定后等待的时间,单为秒
#unlock_time 普通用户被锁定后等待的时间,单为秒
[root@localhost ~]# pam_tally2 -u root
#查看用户错误登录次数
[root@localhost ~]# pam_tally2 --reset -u root
#清除用户错误登录次数

测试:
root@localhost ~]# ssh root@服务器ip

4. PAM资源限制

PAM资源限制主要是对用户进行系统资源使用的限制
PAM资源限制默认已使用,我们只需要调整相应限制值即可。

模块:pam_limits.so
功能:限制用户会话过程中对各种资源的使用情况。缺省情况下该模块的配置文件是
/etc/security/limits.conf
/etc/security/limits.d/*.conf

PAM资源限制案例

案例1:设置用户最大打开文件数

[root@localhost ~]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14806
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024   打开文件的数量
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited   cpu 时间限制
max user processes              (-u) 14806
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

[root@localhost ~]# ulimit -n
1024
[jack@localhost ~]$ ulimit -n
1024
[root@localhost ~]# vim /etc/security/limits.conf
#<domain>      <type>   <item>         <value>
#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

#domain (域:用户或用户组)  type (软硬限制)   nofile      value
*                   soft           nofile      10240
*                   hard           nofile      20480
[root@localhost ~]# ulimit -n
 -S
[root@localhost ~]# ulimit -n
 -H


[root@localhost ~]# cd /etc/security/limits.d/
[root@localhost limits.d]# ls
20-nproc.conf
[root@localhost limits.d]# cat 20-nproc.conf
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

案例2:设置用户最大创建的进程数
[jack@localhost ~]$ ulimit -u
1024
[root@localhost ~]# vim /etc/security/limits.d/90-nproc.conf
*     soft  nproc   10240
*     hard  nproc   10240

案例3:设置用户jack最大使用CPU的时间
[root@localhost ~]# vim /etc/security/limits.conf
jack      hard  cpu

PAM资源限制针对用户,不针对进程,如果需要实现进程资源限制,可以考虑使用Cgroup

5. 扩展:控制组(CGroups)

Control Group(CGroup)资源限制组

控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免多个容器同时运行时对宿主机系统的资源竞争。控制组可以提供对容器的内存、CPU、磁盘IO等资源进行限制和计费管理。控制组的设计目标是为不同的应用情况提供统一的接口,从控制单一进程(比如nice工具)到系统级虚拟化(包括OpenVZ、Linux-VServer、LXC等)。
具体来看,控制组提供:
资源限制(Resource limiting):可以将组设置为不超过设定的内存限制。比如:内存子系统可以为进程组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发Out of Memory警告。

优先级(Prioritization):通过优先级让一些组优先得到更多的CPU等资源。

资源审计(Accounting):用来统计系统实际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。

隔离(isolation):为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统。

控制(Control):挂起、恢复和
重启动等操作。

cgroups: Control Groups 基于进程的限制,而非用户,因此对于超户运行的进程也是一样

cgroup将各种子系统定义为资源,命名为controller: 可配额/可度量 - Control Groups (cgroups)
cgroups实现了对资源的配额和度量九大子系统的资源

1. blkio 限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb
2. cpu 限制使用cpu比例
3. cpuacct 产生cgroup任务的cpu资源报告。
4. cpuset 多核心的cpu时为cgroup任务分配单独的cpu和内存
5. devices 允许或拒绝对设备的访问。
6. freezer 暂停和恢复cgroup任务。
7. memory 设置内存限制以及产生内存资源报告。
8. net_cls 标记每个网络包。
9. ns 名称空间子系统

例如:对某个进程使用内存进行限制步骤:

  1. 需要在controller memory下建立cgroup,如nginx_mem控制组,并针对该控制组nginx_mem设置相应的内存
    限制参数
  2. 将进程Nginx分配到 memory controller的控制组(nginx_mem),没有使用controller则不会限制。

Cgroup实现资源限制的方法:

  • a. cgexec 手动分配
  • b. cgred 自动分配

Cgroup部署方法:

[root@localhost ~]# yum -y install libcgroup    #升级
[root@localhost ~]# systemct l enable cgconfig
[root@localhost ~]# systemctl start cgconfig
[root@localhost ~]# man cgconfig.conf

Cgroup限制步骤:

  1. 创建cgroup,定义相应的限制
  2. 分配程序到cgroup

案例1:限制进程使用CPU

  1. 使用cpu子系统创建两个cgroup
[root@localhost ~]#vim /etc/cgconfig.conf 
group lesscpu {
    cpu {
        cpu.shares="200"; #200等份
    }
}
group morecpu {
    cpu {
        cpu.shares="800";
    }
}
[root@localhost ~]#systemctl restart cgconfig

2.将程序分配到相应的group 实验中,为了让两个进程抢CPU时间片,故意只留一个CPU在线

[root@localhost ~]#lscpu
[root@localhost ~]#echo 0 > /sys/devices/system/cpu/cpu0/online
[root@localhost ~]#echo 1 > /sys/devices/system/cpu/cpu1/online

手动分配:

[root@localhost ~]#cgexec -g cpu:lesscpu sha1sum /dev/zero
[root@localhost ~]#cgexec -g cpu:morecpu md5sum /dev/zero
[root@localhost ~]#top
以上三条命令请在三个shell终端中打开,观察各进程所占用CPU情况。

案例2:限制进程使用Memory

  • 添加cgroup
      [root@localhost ~]#vim /etc/cgconfig.conf 
      group lessmem {
          memory {
              memory.limit_in_bytes=268435465; //物理内存限制256M
          }    
      }
    
  [root@localhost ~]#systemctl restart cgconfig
  • 创建内存盘

    [root@localhost ~]# mkdir /mnt/mem_test
    [root@localhost ~]# mount -t tmpfs /dev/shm /mnt/mem_test
    [root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200  //OK
    [root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=500  //OK
    [root@localhost ~]# free -m
    
    结果为失败
    
  • 创建cgroup

    [root@localhost ~]#vim /etc/cgconfig.conf 
    group poormem{
        memory{
            memory.limit_in_bytes=268435465; //物理内存限制256M
            memory.memsw.limit_in_bytes=268435465; //总内存限制,物理+SWAP
          }
      }
    [root@localhost ~]#systemctl restart cgconfig
    
  • 创建内存盘并测试

    [root@localhost ~]# mkdir /mnt/mem_test
    [root@localhost ~]# mount -t tmpfs /dev/shm /mnt/mem_test
    [root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200  //OK
    [root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=500  //Fail
    [root@localhost ~]# free -m
    

Linux Cgroup 入门教程:CPU

https://fuckcloudnative.io/posts/understanding-cgroups-part-2-cpu/

Linux Cgroup 入门教程:cpuset

https://www.cnblogs.com/ryanyangcs/p/12604382.html

6. 扩展:LDAP集中式身份认证

运维安全作用:

  • 减少故障,保证在线服务器的时长
  • 减少企业运营风险

安全威胁

  • 硬件漏洞
  • 应用软件漏洞
  • 系统漏洞
  • 病毒(生物,恶意代码)
  • 木马
  • DOS 攻击(向服务器发送大量的访问)。SYN Flood 、http Flood 攻击
  • DDOS: 分布式拒绝服务器的攻击(分布式DOS攻击)
  • 跨站攻击(用户输入过滤不足、跨站请求攻击)
  • 密码攻击(密码窃取、密码攻击)
  • SQL 注入
  • 0DAY(在安全补丁没有发布出来之前,发现了一个危害的漏洞)
  • 社会工程学

物理安全

  • 机房
  • 设备
  • 制度