Content One: Display all users’ password login, password deny and last-login
# lslogins
Content Two: Display a user’s password login, password deny and last-login
# lslogins <user>
# lslogins
# lslogins <user>
(步骤略)
(步骤略)
(步骤略)
rescue login:root
(步骤略)
(
补充:
1) 物理分区可以使用 lsblk 命令、fdisk -l 或 cat /proc/partitions 命令辅助确定
2) 逻辑分区还可以可以使用 pvs 命令、lvs 命令或 lvdisplay 命令辅助确定
)
tty1:rescue:~ # mount <root spartition> /mnt
(
补充:
1) 如果是物理分区,系统的根 “/” 分区就在救援模式的 /dev/ 目录里,例如救援模式的 /dev/sda1
2) 如果是逻辑分区,Rocky Linux & RHEL 的系统根 “/” 分区就是救援模式里的 /dev// 例如救援模式里的 /dev/vg/lv,openSUSE & SLES 的系统根 “/” 分区就是救援模式里的 /dev/mapper/- 例如救援模式里的 /dev/mapper/vg-lv
)
tty1:rescue:~ # mount --rbind /dev /mnt/dev
(
补充:
1) 此时所有对救援模式的 /mnt/dev 目录的访问都会变成对救援模式的 /dev 目录的访问
2) 步骤 4.2、步骤 4.3 和步骤 4.4 也可以用以下命令代替:
tty1:rescue:~ # for i in proc sys dev; do mount --rbind /$i /mnt/$i ; done
)
tty1:rescue:~ # mount --rbind /proc /mnt/proc
(
补充:
1) 此时所有对救援模式的 /mnt/proc 目录的访问都会变成对救援模式的 /proc 目录的访问
2) 步骤 4.2、步骤 4.3 和步骤 4.4 也可以用以下命令代替:
tty1:rescue:~ # for i in proc sys dev; do mount --rbind /$i /mnt/$i ; done
)
tty1:rescue:~ # mount --rbind /sys /mnt/sys
(
补充:
1) 此时所有对救援模式的 /mnt/sys 目录的访问都会变成对救援模式的 /sys 目录的访问
2) 步骤 4.2、步骤 4.3 和步骤 4.4 也可以用以下命令代替:
tty1:rescue:~ # for i in proc sys dev; do mount --rbind /$i /mnt/$i ; done
)
tty1:rescue:~ # mount --rbind /run /mnt/run
(补充:此时所有对救援模式的 /mnt/run 目录的访问都会变成对救援模式的 /run 目录的访问)
tty1:rescue:~ # chroot /mnt
(补充:这里以 /mnt 作为系统根 “/” 目录为例)
bash-4.3# mount -a
bash-4.3# ls
bin boot dev home lib lib64 mnt opt proc root run sbin selinux srv sys tmp usr var
(补充:这里显示的是常见的 Linux 根 “/” 目录 下的目录)
tty1:rescue:~ # mkdir /mnt/bin
tty1:rescue:~ # mkdir /media
tty1:rescue:~ # mount /dev/dvd /media
tty1:rescue:~ # cp /media/suse/x86_64/kernel-default-3.10.0-693.el7.x86_64.rpm .
(补充:这里以拷贝 /media/suse/x86_64/kernel-default-3.10.0-693.el7.x86_64.rpm 为例)
tty1:rescue:~ # rpm -ivh kernel-default-3.10.0-693.el7.x86_64.rpm
(补充:这里以安装 /media/suse/x86_64/kernel-default-3.10.0-693.el7.x86_64.rpm 为例)
(步骤略)
(
补充:
1) 物理分区可以使用 lsblk 命令、fdisk -l 或 cat /proc/partitions 命令辅助确定
2) 逻辑分区还可以可以使用 pvs 命令、lvs 命令或 lvdisplay 命令辅助确定
)
bash-4.3# grub2-install <disk which GRUB2 in>
bash-4.3# grub2-mkconfig -o /boot/grub2/grub.cfg
bash-4.3# exit
tty1:rescue:~ # reboot
如果以上步骤都不起作用,且 /boot 是单独分区的话,则可能是 boot 分区的文件系统损坏,可以尝试以下补充:
1) 重复本文步骤五和之前步骤的内容
2) 将 /boot 目录里的内容全部拷贝出来
3) 取消挂载 /boot 目录的分区
4) 将挂载 /boot 目录的分区重新格式化成 ext4 格式
5) 格式化后分区的 UUID 会改变,所以需要更新 /etc/fstab 文件中挂载 /boot 目录分区的 UUID
6) 将格式化后的分区重新挂载 /boot 目录
7) 将刚刚从 /boot 目录拷贝出来的内容拷贝回 /boot 目录
8) 重复此文的步骤六
(注意:不建议使用 Btrfs 文件系统给 /boot 目录分区)
https://www.suse.com/support/kb/doc/?id=000018770
# service auditd restart
# auditctl -s
# chkconfig auditd on
# chkconfig --list auditd
# auditctl -l
# vi /etc/audit/audit.rules
删除里面的所有内容
# service auditd restart
或者:
# augenrules
# auditctl -D
(补充:此操作重启后失效)
# auditctl -W <policy>
(补充:此操作重启后失效)
# auditctl -d <policy>
(补充:此操作重启后失效)
# cat /var/log/audit/audit.log
# ausearch -f <file/directory>
# ausearch -k <key_name>
# aureport -k
-w <file/directory> -p <previlege> -k <key_name>
(
补充:
1) 文件名或目录名,需要绝对路径
2) 监控的权限,可以是 rwxa 其中的任意 1 个或多个,r 代表读权限、w 代表写权限,x 代表执行权限,a 代表文件类型
3) 此类日志的关键词
)
# auditctl -w <file/directory> -p <previlege> -k <key_name>
# vim /etc/audit/audit.rules
添加以下内容:
......
-w <file/directory> -p <previlege> -k <key_name>
(
注意:永久添加的规则后要重启 auditd 服务后才会生效
# service auditd restart
或者:
# augenrules
)
# auditctl -w /etc/nginx/nginx.conf
(补充:这里以临时添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化的规则为例)
# auditctl -w /etc/nginx/nginx.conf -p rwxa -k 'nginx'
(补充:这里以临时添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化,并设置关键词为 nginx 的规则为例)
-a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>
(
补充:
1) 和 用于确定事件被记录, 的值可以是 always 或者 never, 的值可以是 task、exit、user 或者 exclude
2) 是系统调用,Linux 系统调用的名称在 /usr/include/asm/unistd_64.h 文件中,可以将多个系统调用放在一个规则里,例:-S <system_call> -S <system_call> ……,或者 -S <system_call>,<system_call>……
3) 和 是过略条件,可以将多个过略条件放在一个规则里,-F <field>=<value> -F <field>=<value> ……
4) 是此类日志的关键词
)
# auditctl -a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>
# vim /etc/audit/audit.rules
添加以下内容:
......
-a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>
(
注意:永久添加的规则后要重启 auditd 服务后才会生效
# service auditd restart
或者:
# augenrules
)
# auditctl -a always,exit -S rmdir -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=unset -F auid!=4294967295 -k delete
(补充:这里以临时监控所有 UID 大于 1000 的用户删除操作为例)
(注意:这里的 -F auid!=4294967295 是为了排除 login UID 没有被设置的用户)
# auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=unset -F auid!=4294967295 -k delete
(补充:这里以临时监控所有 UID 大于 1000 的用户删除操作为例)
(注意:这里的 -F auid!=4294967295 是为了排除 login UID 没有被设置的用户)
# auditctl -a always,exit -F arch=b64 -S socket
# auditctl -a always,exit -F arch=b64 -S connect
# auditctl -a always,exit -F arch=b64 -S sendmmsg
# auditctl -a always,exit -F arch=b64 -S sendmsg
# auditctl -a always,exit -F arch=b64 -S bind
# auditctl -a always,exit -F arch=b64 -S recvmsg
# auditctl -a always,exit -F arch=b64 -S close
(补充:这里以监控所有网络连接为例)
空设备,任何进入此文件的数据都会被删除,一般用于删除输出内容
# rm -f /dev/null;mknod /dev/null c 1 3;chmod 666 /dev/null
二进制的零流,可以连续不断地产生二进制零流,一般用于对设备和文件进行初始化
# rm -f /dev/zero;mknod /dev/zero c 1 5;chmod 666 /dev/zero
随机数流,可以连续不断地产生随机数流,一般用于清除机密数据,用随机的数据完全覆盖磁盘
# rm -f /dev/random;mknod /dev/random c 1 8;chmod 666 /dev/random
1) /etc/shadow 文件存储着用户的密码和与之相关的信息
2) /etc/shadow 文件以冒号 “:” 作为分隔符,分类 8 段
/etc/shadow 文件的第 1 段存储的是用户名,和 /etc/passwd 文件中的用户名是一一对应的
1) 如果是奇怪的字符串则代表是加密过的密码,格式是 $id$salt$hashed,其中 $id 是指加密算法。如果字符串:以 $1$ 开头则代表是用 MD5 加密,以 $2a$ 开头则代表是用 Blowfish 加密,以 $2y$ 开头则代表是用另一种算法长度的 Blowfish 加密,以 $5$ 开头则代表是用 SHA-256 加密,以 $6$ 开头则代表是用 SHA-512 加密
2) 如果是 2 个感叹号 “!!” 则代表从来都没有设置过密码
3) 如果为空则代表没有设置密码
4) 如果是 1 个星号 “*” 则代表用户被锁定,但是其它登陆方式不受限制,例 SSH 登陆
5) 如果是 1 个感叹号 “!” 则代表用户被锁定,但是其它登陆方式不受限制,例 SSH 登陆
6) 如果以 1 个感叹号开头 “!” 则代表用户被锁定
7) 如果以 2 个感叹号开头 “!!” 则代表用户被锁定
# cut -d: -f1,7
# passwd <user>
密码最后修改的日期于 1970 年 1 月 1 日相距的天数
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,3
或者:
# chage -l <user> | grep 'Last password change'
# chage -d <date> <user>
或者:
# chage --lastday <date> <user>
两次修改密码最短天数间隔
1) 如果是 0 则代表随时可以修改密码
2) 如果是 99999 则代表永远都不能修改密码
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,4
或者:
# chage -l <user> | grep 'Minimum number of days between password change'
# chage -m <days> <user>
或者:
# chage --mindays <days> <user>
修改密码后过多少天会过期
1) 如果是 99999 则代表永远都不会过期
2) 如果密码只是过期但是没有失效的话,则可以使用过期的密码更改密码再使用新密码登陆,如果密码失效的话则此密码不能再使用
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,5
或者:
# chage -l <user> | grep 'Maximum number of days between password change'
# chage -M <days> <user>
或者:
# chage --maxdays <days> <user>
密码过期前,提前多少天发出警告
如果为空则代表不发出警告
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,6
或者:
# chage -l <user> | grep 'Number of days of warning before password expires'
# chage -W <days> <user>
或者:
# chage --warndays <days> <user>
密码过期后过多少天会失效
1) 如果是 99999 则代表永远都不会失效
2) 如果密码只是过期但是没有失效的话,则可以使用过期的密码更改密码再使用新密码登陆,如果密码失效的话则此密码不能再使用
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,7
或者:
# chage -l <user> | grep 'Password inactive'
# chage -I <days> <user>
或者:
# chage --inactive <days> <user>
用户的失效日期于 1970 年 1 月 1 日相距的天数
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,8
或者:
# chage -l <user> | grep 'Account expires'
# chage -E <date> <user>
或者:
# chage --expiredate <date> <user>
这是一个保留位,目前没有作用