linux-doc-运维安全

用户和组

用户和组信息查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 查看所有用户信息
cat /etc/passwd

# 查看指定用户信息
cat /etc/passwd | grep 用户名

# 查看所有不可以登录的用户
cat /etc/passwd | grep nologin

# 查看所有允许登录的用户
cat /etc/passwd | grep -v nologin

# 查看所有用户组信息
cat /etc/group

# 查看指定用户组信息
cat /etc/group|grep 组名

# 查看当前登录用户的组内成员
groups

# 查看指定用户所在的组,以及组内成员
groups 用户名

# 查看当前登录用户名
whoami

用户安全

系统安装的时候会带有很多不需要的用户和组,需要我们自己根据情况处理。

1
2
3
4
5
# 可删除用户
adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher等

# 可删除用户组
adm、lp、news、uucp、games、dip、pppusers、popusers、slipusers等

对于这些系统安装带有的用户和用户组,我们选择使用userdel 用户groupdel 用户组命令来删除,但更建议的是使用usermod -s /sbin/nologin 用户来禁止用户进行登录。

禁止不需要登录的用户
1
2
3
4
5
6
7
8
9
usermod -s /sbin/nologin adm
usermod -s /sbin/nologin lp
usermod -s /sbin/nologin sync
usermod -s /sbin/nologin shutdown
usermod -s /sbin/nologin halt
usermod -s /sbin/nologin news
usermod -s /sbin/nologin uucp
usermod -s /sbin/nologin games
usermod -s /sbin/nologin gopher

Kali Linux 渗透系统

介绍

  • Kali Linux是一个基于Debian的Linux发行版,
  • 集成了300多个安全和取证方面的相关工具, 专为渗透测试人员准备,
  • Kali Linux的前身是BackTrack Linux发行版。
  • Back Track是基于Ubuntu的一个Linux发行版。(补充: ubuntu也是基于Debian的Linux发型版)
  • 它由Offensive Security Ltd维护和资助,最先由Offensive Security的MatiAharoni和Devon Kearns通过重写Back Track来完成。
  • Kali Linux有32位和64位的镜像,可用于x86指令集。同时它还有基于ARM架构的镜像,可用于树莓派和三星的ARM Chromebook。用户可通过硬盘、Live CD或Live USB来运行Kali Linux操作系统。

kali默认自带的字典

1
ls /usr/share/wordlists/rockyou.txt

安装

Kali Linux 下载地址 https://www.kali.org/downloads/

系统更新

  • 执行lsb_release -a命令查看当前操作系统的所有版本信息

  • 配置软件源, 国内建议选择“中科大”的源,(综合来书,中科大的源还是比较靠谱)

    1
    2
    3
    4
    5
    vim /etc/apt/sources.list
    # 修改域名为
    http://mirrors.ustc.edu.cn/kali
    # 更新软件源
    apt update
  • 软件更新apt-get dist-upgrade

nessus 扫漏洞工具

Nessus 国外流行的漏洞扫描工具。多用来发现系统漏洞。

官网 https://zh-cn.tenable.com/

洞信息共享平台
https://nvd.nist.gov/
http://cve.mitre.org/
http://www.cnvd.org.cn/

暴力破解

暴力破解就是对用户的口令进行穷举尝试,直到尝试出正确的密钥为止。

hydra

Hydra 是Kali Linux中一款很受欢迎的密码破解工具,支持多种协议的攻击, 基本用法可以通过man hydra 来查看,在hydra工具中, 如果用户名不知道,需要使用用户字典, 但会增加暴力破解难度。 因此,隐藏用户名也是一种好的防护手段。

1
2
3
4
5
6
7
8
9
10
hydra  -l 用户 -P 密码字典 -t 32  -e nsr  -vV  -o ssh_ok.log IP ssh

-l/-L 指定用户名-l, 或者-L 指定用户名字典(用户名列表)
-p/-P 指定用户口令-p,或者-P 指定用户口令字典(用户口令列表)
-t : 指定并行任务数量,默认16
-e: 额外检查,n 代表空口令, s代码用户名, r代码用户名称逆序(反向)
-vV: 显示详细过程
-o: 输出login/passwd 对到指定的文件
IP: 靶机IP地址
ssh: 被攻击的协议(服务名称, telnet、ftp、pop3、ssh...)

crunch

crunch是用来给定一个字符集生成一个全集的字典

1
2
3
4
5
crunch <min-len> <max-len> [<charset string>] [options] 
min-len:生成口令的最小长度
max-len:生成口令的最大长度
charset string : 生成口令的字符集
比如abc这3个字符能够组成的2位密码有9个:aa ab ac ba bb bc ca cb cc

cupp

生成字符集字典的工具

1
2
3
4
5
# 从仓库去下载一些字典
cupp -l

# 跟用户做问答最后生成一个字典
cupp -i

暴力破解的防御

禁止root登录

修改/etc/ssh/sshd_config文件: 禁用root登录

1
2
3
vi /etc/ssh/sshd_config
# PermitRootLogin yes 改为
PermitRootLogin no

限定可登录的用户列表

对于多普通用户的场景,建议可远程登录用户许可,可远程登录的用户越少,Attacker猜对用户名的概率越低, 相应来说,越安全。

可通过白名单黑名单, 控制登录的用户列表。

1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/ssh/sshd_config

# 添加白名单用户
AllowUsers xxxuser1 xxxuser2

# 添加黑名单用户
DenyUsers root xxxuser1 xxxuser2

# 重启ssh服务1
/etc/init.d/ssh restart
# 重启ssh服务2
systemctl restart ssh.service

ssh服务鉴权次数限定

对于允许登录的用户,可以通过ssh鉴权失败次数,来增加对抗暴力破解的难度

1
2
3
4
vi /etc/ssh/sshd_config

# 添加(默认6次)
MaxAuthTries 3

这个选项的作用,在口令输入错误超过设定次数后, 主动断开链接,但允许client端再次发起链接。

此种方式在应对口令破解中,可以增加破解的时间开销, 并不能完全避免口令被暴力破解。 但是,由于口令破解的时间加长,也就给了IDS/IPS(入侵检测系统)反应的时间。便于系统运维人员采取措施。

shadow文件破解

将/etc/shadow文件拷贝一份到某个文件比如1.txt

使用vim进行编辑只留下第二列的内容,如下:

1
2
3
4
root:$6$WQJmEIbE$u5gns7kaUXd6GdTgNpoFNDGpmdU4O7qPf3DgNCHg57wgOIuwEXKorlZczhBWVoNV6EG8DvkajzYeP8Sgye8Vq1:18015:0:99999:7:::

# 第二列就是该用户密码的哈希值
$6$WQJmEIbE$u5gns7kaUXd6GdTgNpoFNDGpmdU4O7qPf3DgNCHg57wgOIuwEXKorlZczhBWVoNV6EG8DvkajzYeP8Sgye8Vq1

使用准备一个字典文件dict.txt,最后使用如下命令进行破解

1
hashcat –m 1800 1.txt   dict.txt

PAM

Pluggable Authentication Modules , 可插拔的鉴权模块, sun提出的一种鉴权机制。

它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。

中文文档 https://blog.csdn.net/shenlan211314/article/details/6569592

使用PAM

Pam使用非常简单, 就是修改相应配置文件,添加pam 模块的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ls /etc/pam.d/

# 关于pam配置相关的帮助信息
man pam.conf

# 以 common-password 配置文件简单介绍配置方式
vi /etc/pam.d/common-password
# retry=3 键入口令错误时,重复次数
# minlen=8 口令最小长度
# lcredit=-1 小写字符至少为1 ,负数表示至少多少个
# ucredit=-1 大写字母至少为1,负数表示至少多少个
# dcredit=-1 数字至少为1
# ocredit=-1 特殊字符至少为1
# difok=3 新旧口令差别至少3个字符
# 原密码:123456
# 新密码:234567
# reject_username 口令中,不允许包括用户名称(正序和逆序)

PAM配置格式

配置文件有许多配置项(每行对应一个配置项)组成,每一行又分为四列(每列对应一栏):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 服务名栏(隐藏)
表示哪个服务,比如login|su|passwd等,一般只有将配置都写在pam.conf文件中才要指定是哪个服务,但是在pam.d目录下都有相应服务对应的pam配置文件,所以不是在/etc/pam.conf中配置可以省略(或者使用other)。 如果存在/etc/pam.d,那么pam.conf这个配置文件将被忽略

# 第一栏,认证鉴别接口类型:(四类接口)
oauth:表示鉴别类接口模块类型用于检查用户和密码,并分配权限
oaccount:表示账户类接口,主要负责账户合法性检查,确认帐号是否过期,是否有权限登录系统等;
osession:会话类接口。实现从用户登录成功到退出的会话控制;
password:口令类接口。控制用户更改密码的全过程。
每行只能指定一种接口类型

# 第二栏,control_flag控制位:
他的四种可能的取值分别为required、Requisite、sufficient或_optional:
orequired:表示该行以及所涉及模块的成功是用户通过鉴别的必要条件,只有当对应于应用程序的所有带 required标记的模块全部成功后,该程序才能通过鉴别。

orequisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。

osufficient:表示该行以及所涉及模块验证成功是用户通过鉴别的充分条件。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。

ooptional:他表示即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也就是说即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。

[value1=action1 value2=action2 ... default=defaultValue]:
最后一个(default)能够用来设置上面的返回值无法表达的行为
actionN可以是一个非负整数或者是下面的记号之一:ignore、ok、done、bad、die和reset。如果是非负整数n,就表示需要忽略后面n个同样类型的模块。通过这种方式,系统管理者可以更加灵活地设置层叠模块,模块的层叠路径由单个模块的反应决定。
关于这几个记号的详细解释:
ignore:如果使用层叠模块,那么这个模块的返回值将被忽略,不会被应用程序知道。
bad:他表示这个返回码应该被看作是模块验证失败的标志。如果这个模块是层叠模块的第一个验证失败的模块,那么他的状态值就是整个层叠模块验证的状态值和结果。
die:终止层叠模块验证过程,立刻返回到应用程序。
ok:告诉PAM这个模块的返回值将直接作为所有层叠模块的返回值。也就是说,如果这个模块前面的模块返回状态是PAM_SUCCESS,那这个返回值就会覆盖前面的返回状态。注意:如果前面的模块的返回状态表示模块验证失败,那么不能使用这个返回值再加以覆盖。
done:终止后续层叠模块的验证,把控制权立刻交回应用程序。
reset:清除所有层叠模块的返回状态,从下一个层叠模块重新开始验证。

# 第三栏,module_path即所使用模块的全路径名称

# 第四栏,options用于向特定模块传递相关的选项,然后由模块分析解释这些选项。

常用的PAM模块,如下表:

模块 结合管理类型 说明
pam_unix.so auth 提示用户输入密码,并与/etc/shadow文件相比对.匹配返回0
pam_unix.so account 检查用户的账号信息(包括是否过期等).帐号可用时,返回0.
pam_unix.so password 修改用户的密码. 将用户输入的密码,作为用户的新密码更新shadow文件
pam_shells.so auth account 如果用户想登录系统,那么它的shell必须是在/etc/shells文件中之一的shell
pam_deny.so account auth password session 该模块可用于拒绝访问
pam_permit.so auth account password session 模块任何时候都返回成功.
pam_securetty.so auth 如果用户要以root登录时,则登录的tty必须在/etc/securetty之中.
pam_listfile.so auth account password session 访问应用程的控制开关
pam_cracklib.so password 这个模块可以插入到一个程序的密码栈中,用于检查密码的强度.
pam_limits.so session 定义使用系统资源的上限,root用户也会受此限制,可以通过/etc/security/limits.conf或/etc/security/limits.d/*.conf来设定

实例:弱口令防护

弱口令防护,简单说就是增加口令复杂度

  • 口令长度不小于8位
  • 口令是大、小字母、数字和特殊字符组成
  • 口令不得与账户名相同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi /etc/pam.d/common-password
password required pam_cracklib.so retry=3 minlen=8 difok=3 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 reject_username

# man pam_cracklib 查看cracklib 选项信息
# 注意如果没有找到pam_cracklib,那么需要手动使用apt安装
sudo apt install libpam-cracklib

# 配置描述
# oretry=3 键入口令错误时,重复次数
# ominlen=8 口令最小长度
# olcredit=-1 小写字符至少为1
# oucredit=-1 大写字母至少为1
# odcredit=-1 数字至少为1
# oocredit=-1 特殊字符至少为1
# odifok=3 新旧口令差别至少3个字符
# oreject_username 口令中,不允许包括用户名称(正序和逆序)