- SSH服务器
- dropbear
- AIDE
- sudo
- TCP-Wrapper
- PAM认证机制
一、SSH服务器:
服务器端:sshd, 配置文件: /etc/ssh/sshd_config
常用参数:
Port 22 //默认端口号
ListenAddress ip //监听地址,可以设置成内部地址,防止攻击
LoginGraceTime 2m //登录超时时间
PermitRootLogin yes //允许root账户登录
StrictModes yes //登录前检查用户家目录和文件的权限以及所有者信息
MaxAuthTries 6 //登录认证最多尝试次数,尝试次数=设置次数/2
MaxSessions 10 //每个网络连接的最大会话连接数
PubkeyAuthentication yes //允许基于Key的验证
PermitEmptyPasswords no //不允许空密码
PasswordAuthentication yes //允许基于密码验证
ClientAliveInterval //长期没有数据连接的时间(单位:秒)算作一次
ClientAliveCountMax //长期没有数据连接的次数达到设置次数(默认3)断开
UseDNS yes //将ip反向解析为域名,改为no可以提高连接速度
GSSAPIAuthentication yes //GSSAPI验证,改为no可以提高连接速度
MaxStartups 10:30:100 //控制用户连接个数,10个以上的连接按照30%的概率被杀死,100个以上的连接全部杀死
Banner /path/file //提示信息文件
AllowUsers user1 user2 user3 //允许登录用户
DenyUsers user1 user2 user3 //禁止登录用户
AllowGroups groups groups2 //允许登录组
DenyGroups groups groups2 //禁止登录组
- ssh服务器推荐的设置
- 要使用默认端口
- 禁止使用protocol version 1
- 限制可登录用户
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址
- 基于口令认证时,使用强密码策略
- 使用基于密钥的认证
- 禁止使用空密码
- 禁止root用户直接登录
- 限制ssh的访问频度和并发在线数
- 做好日志,经常分析 /etc/log/secure
二、dropbear:
dropbear:ssh协议的轻量级实现
-
编译安装dropbear
- 安装准备:
(1) 安装开发包组:yum groupinstall "Development Tools"
(2) 下载dropbear-2017.75.tar.bz2
(3) 解压缩:tar xf dropbear-2017.75.tar.bz2
(4) 进入解压缩目录:cd dropbear-2017.75
(5) 查看帮助文件:less INSTALL
less README
- 编译安装过程
(1) ./configure
(2) make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
(3) make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
- 安装准备:
启动ssh服务
(1) 建立公钥和私钥的存放目录:mkdir /etc/dropbear
(2) 生成密钥对:dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
dropbearkey -t dsa -f /etc/dropbear/dropbear_dsa_host_key
(3) 修改端口号:
(4) 启动服务:dropbear -p :2222 -F -E
-F: 前台运行, -E: 显示日志信息
dropbear -p :2222
后台运行客户端登录
dbclient -p 2222 user@ip_addr
三、AIDE:
(一)AIDE基本概念:
定义:AIDE(Advanced Intrusion Detection Environment)高级入侵检测环境,用于检查文件完整性,审计哪些文件被修改过
配置文件:/etc/aide.conf,可以规定监控的文件范围
工作原理:构造指定文件的数据库,可以存储文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小、散列值等。通过将当前文件的属性与数据库中做对比,审计文件的修改情况。
不应监控经常变动的数据,基本不变的二进制程序应该监控。
(二)配置监控文件范围
格式:
文件路径 监控属性代码
!文件路径
忽略对专门文件的监控监控属性代码:
p 权限
i 索引节点
n 链接数
u 用户
g 组
s 大小
m 最后一次修改时间
c 创建时间
md5 md5校验值
R=p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5
(三)监控操作
初始化默认的AIDE的库:
aide --init
生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
检测:
aide --check
更新数据库:
aide --update
-
实验:AIDE监控
监控/usr/bin和/usr/sbin目录下文件(排除/usr/sbin/chroot)的权限、索引节点、所有者、所属组、大小、最近的修改时间、创建时间、sha512值的变化- 编辑文件:/etc/aide.conf,添加如下内容
/usr/bin p+i+u+g+s+m+c+sha512
/usr/sbin p+i+u+g+s+m+c+sha512
!/usr/sbin/chroot
- 初始化数据库:
aide --init
- 修改文件/usr/bin/ls,/usr/sbin/passwd, /usr/sbin/chroot,做好备份
cp -a /usr/bin/ls{,.bak}
cp -a /usr/sbin/fdisk{,.bak}
cp -a /usr/sbin/chroot{,.bak}
echo >> /usr/bin/ls
echo >> /usr/sbin/fdisk
echo >> /usr/sbin/chroot
- 生成检查数据库:
cd /var/lib/aide
进入数据库存放目录
cp aide.db.new.gz aide.db.gz
原数据库备份 - 检查检测结果:
aide --check
- 编辑文件:/etc/aide.conf,添加如下内容
四、sudo
(一)功能:
- 授权指定用户在指定主机执行指定命令
- 管理员通过配置文件集中管理用户的使用权限
- 通过日志文件记录sudo操作
- 通过时间戳允许用户在规定时间范围内无需重复输入用户密码,默认5分钟
(二)配置sudo
(1)配置文件
- 配置文件:
/etc/sudoers
(只读文件)
配置文件存储路径:/etc/sudoer.d/
- 时间戳文件:
/var/db/sudo
- 日志文件:
/var/log/secure
- 通过visudo命令编辑配置文件,可以检查配置文件语法错误:
visudo -c
- 配置文件的规则分为别名定义和授权规则,前者非必要,后者必要
(2)授权规则:
- 格式:
user host=(runas) command
(支持通配符glob)- user:运行命令者的身份
- host:通过哪些主机
- runas:以哪个用户的身份
- command:运行哪些命令
(3)别名定义:
别名有四种类型:User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias
命名规则:
[A-Z]([A-Z][0-9]_)*
(必须以大写字母开头,后面接任意个大写字母、数字和下划线的组合)别名定义格式:
Alias_Type NAME1 = item1, item2, item3 : NAME2 = item4, item5
示例1:
student ALL = (ALL) ALL
授权用户student在所有主机代表所有用户执行任意操作
%wheel ALL = (ALL) ALL
授权属于wheel组的用户在所有主机代表所有用户执行任意操作示例2:
student ALL = (root) /sbin/pidof,/sbin/ifconfig
多条命令用逗号","分隔
%wheel ALL = (ALL) NOPASSWD: ALL
执行授权操作时不用输入密码示例3
User_Alias NETADMIN = netuser1,netuser2
定义用户别名
Cmnd_Alias NETCMD = /usr/sbin/ip
定义命令别名
NETADMIN ALL =(root)NETCMD
引用别名,允许netuser1和netuser2在所有主机代表root用户执行ip的命令示例4
User_Alias ADMINUSER = adminuser1,adminuser2
定义用户别名
Cmnd_Alias ADMINCMD = /usr/sbin/useradd, /usr/sbin/usermod, /usr/bin/passwd[a-zA-Z]*, !/usr/bin/passwd root
定义命令别名,!表示排除
ADMINUSER ALL=(root) NOPASSWD: ADMINCMD,PASSWD: /usr/sbin/userdel
允许adminuser1, adminuser2用户在所有主机代表root用户可以不需输入密码执行useradd, usermod, passwd命令(不允许修改root密码),可以输入密码后执行userdel命令示例5
defaults: wang runas_default=tom
当sudo不指定用户时默认为tom
wang ALL=(tom, jerry) ALL
允许wang用户在所有主机代表tom或jerry执行所有命令示例6
wang 192.168.175.136,192.168.175.138=(root) /usr/sbin/, !/usr/sbin/useradd
允许wang用户在192.168.175.136,192.168.175.138地址的主机上代表root用户执行系统管理员命令(useradd除外)示例7
wang ALL=(ALL) /bin/cat /var/log/messages*
一般理解:允许wang用户在所有主机代表所有人执行查看/var/log/目录下以messages开头的文件
但是:*指代任意多个字符,当wang用户执行cat /var/log/messages /etc/shadow
命令时同样符合授权设置,使wang用户能够访问大量root用户不希望让其看到的文件,将造成重大安全问题,不可以这样设置
(三)sudo命令
sudo -i -u wang 切换身份
sudo [options] COMMAND
-V 显示版本信息等配置信息
-u user 默认为root
-l,ll 列出用户在主机上可用的和被禁止的命令
-v 再延长密码有效期限5分钟,更新时间戳
-k 清除时间戳(恢复至1970-01-01),下次需要重新输密码
-K 与-k类似,还要删除时间戳文件
-b 在后台执行指令
-p 改变询问密码的提示符号
示例:-p "password on %h for user %p: "
五、TCP-Wrapper
(一)基本介绍
工作在传输层的TCP协议上,实现对特定服务的安全监测和访问控制
以库文件的形式实现,服务是否支持由TCP-Wrapper控制取决于编译时是否针对libwrap编译
判断程序是否支持由TCP-Wrapper进行访问控制
查看文件程序是否依赖libwrap.so库文件
which command
查看命令所在的程序路径
ldd /PATH/TO/PROGRAM | grep libwrap.so
查询程序的依赖库文件
(二)配置TCP-Wrapper
配置文件路径:
/etc/hosts.allow
和/etc/hosts.deny
检查顺序:hosts.allow,hosts.deny
注意:一旦前面规则匹配,直接生效,将不再继续。若都不匹配,则默认允许。帮助:
man 5 hosts_access
和man 5 hosts_options
语法格式:
daemon_list@host: client_list[ :options:option… ]
-
daemon_list@host格式
- 单个应用程序的二进制文件名,而非服务名,例如vsftpd
- 以逗号或空格分隔的应用程序文件名列表,如sshd,vsftpd
- ALL表示所有接受tcp_wrapper控制的服务程序
- 主机有多个IP,可用@hostIP来实现控制
-
client_list格式
- 以逗号或空格分隔的客户端列表
- 基于IP地址:192.168.10.1 192.168.1.(表示192.168.1.0/24网段)
- 基于网络/掩码:192.168.0.0/255.255.255.0
- 基于net/prefixlen: 192.168.1.0/24(CentOS7)
- 内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
EXCEPT用法:否定前面的描述,可以多次使用
/etc/hosts.deny
vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
禁止172.16.0.0/16网段的主机登录vsftpd服务,但其中172.16.100.0/24网段的主机可以登录vsftpd服务,但是其中IP为172.16.100.1的主机不能登录vsftpd-
[:option]选项
deny:主要用在/etc/hosts.allow定义“拒绝”规则
如:vsftpd: 172.16. :deny
禁止172.16.0.0/16网段的主机登录vsftpdallow:主要用在/etc/hosts.deny定义“允许”规则
如:vsftpd:172.16. :allow
允许172.16.0.0/16网段的主机登录vsftpd-
spawn 启动一个外部程序完成执行的操作
如:sshd: ALL :spawn echo "$(date) login attempt from %c to %s,%d" >> /var/log/sshd.log
允许任意主机登录sshd服务,将每一登录的信息按照"时间 login attempt from 客户端 to 服务器端,服务名"的格式记录到/var/log/sshd.log文件中(扩展常量%在man hosts_access中查询) twist 实际动作是拒绝访问,使用指定的操作替换当前服务,标准I/O和ERROR发送到客户端,默认至/dev/null
vsftpd: 172.16. :twist /bin/echo "connection prohibited"
拒绝来自172.16.0.0/16网段主机登录vsftpd服务,并在客户端输出"connection prohibited"的信息
测试工具:
tcpdmatch [-d] daemon[@host] client
-d 测试当前目录下的hosts.allow和hosts.deny
六、PAM认证机制
(一)基本概念
PAM (Pluggable Authentication Modules):一种与认证相关的通用框架机制,自身不做认证
PAM 关注如何为服务验证用户的API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序
-
认证机制:
- 系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略
- 应用程序开发者通过在服务程序中使用PAM API来实现对认证方法的调用
- 而PAM服务模块的开发者则利用PAM SPI来编写模块,将不同的认证机制加入到系统中
- PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来
(二)PAM认证机制
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证
PAM认证过程:
(1) 程序开始呼叫PAM模块,PAM模块会搜寻程序的PAM相关设置,设置文件一般为/etc/pam.d/目录下与程序同名的文件
(2) 通过查看设置文件,取用PAM所提供的相关模块来进行验证
(3) 将验证结果回传给程序,程序根据PAM回传的结果决定下一个动作
(三)PAM认证设置
-
PAM相关文件:
- 模块文件目录:/lib64/security/*.so
- 环境相关的设置:/etc/security/
- 主配置文件:/etc/pam.conf,默认不存在
建议为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
注意:如/etc/pam.d存在,/etc/pam.conf将失效
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误通用配置文件/etc/pam.conf格式(不推荐使用)
application type control module-path arguments
专用配置文件/etc/pam.d/*格式
type control module-path arguments
-
格式说明:
- application 服务名
如telnet,login,ftp等,"OTHER"代表所有未在该文件中明确配置的其它服务 - module-type 模块类型
- control PAM库处理与该服务相关的PAM模块成功或失败情况的策略
- module-path 指明本模块对应的程序文件的路径名
- arguments 传递给该模块的参数
- application 服务名
-
module-type: 模块类型
- auth 账号的认证和授权
- account 与账号管理相关的非认证类的功能
- password 用户修改密码时密码复杂度检查机制等功能
- session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
-
control: PAM处理认证成功或失败的情况的策略
- 两种方式实现:简单和复杂
- 简单方式实现:一个关健词实现
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序,即为一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件
- optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
- include:调用其他的配置文件中定义的配置信息
- 复杂方式实现:使用一个或多个"status=action"
[status1=action1 status2=action …]
- Status:检查结果的返回状态
- Action:采取行为ok, done, die, bad, ignore, reset
ok 模块通过,继续检查 done 模块通过,返回最后结果给应用 bad 结果失败,继续检查 die 结果失败,返回失败结果给应用 ignore 结果忽略,不影响最后结果 reset 忽略已经得到的结果
-
module-path: 模块路径
- 相对路径:
/lib64/security目录下的模块可使用相对路径
如:pam_shells.so、pam_limits.so - 绝对路径:
模块通过读取配置文件(/etc/security/*.conf)完成用户对系统资源的使用控制
- 相对路径:
arguments: 传递给该模块的参数,查询帮助文件
-
PAM文档说明
- /usr/share/doc/pam-*
- rpm -qd pam
- man -k pam_
- man 模块名,如man pam_rootok
- 《The Linux-PAM System Administrators' Guide》
-
案例:典型PAM模块
案例1:pam_shells模块,只允许使用/etc/shells文件中列明的shell登录
(1)编辑/etc/pam.d/login文件,行首增加auth required pam_shells.so
,表明登录时需要验证pam_shells.so模块,并且一票否决(2)编辑/etc/shells文件,去掉行
/bin/csh
(3)新建用户testlogin,指定使用csh:useradd testlogin -s /bin/csh
,并配置密码
(4)使用testlogin用户登录系统,登录失败(5)查询安全日志文件,发现认证失败记录
案例2:pam_securetty模块,只允许root用户在/etc/securetty文件列出的安全终端登录。现在修改配置,使root能够登录telnet服务。
方法1:注销/etc/pam.d/remote中module_path为pam_securetty.so这一行方法2:在/etc/securetty文件中添加若干伪终端
案例3:pam_nologin模块,如果/etc/nologin文件存在,将导致非root用户不能登陆,如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin.txt文件内容,并拒绝登陆
(1)建立/etc/nologin文件:
touch /etc/nologin
(2)建立/etc/nologin.txt文件,内容为"NO LOGIN":
echo "NO LOGIN" > /etc/nologin.txt
(3)创立用户testnologin,指定shell路径为/sbin/nologin,
useradd testnologin -s /sbin/nologin
,指定密码:passwd testnologin
(4)普通用户登录,发现登录失败。testnologin用户登录,发现登录失败,并显示提示信息"NO LOGIN"
案例4:pam_limits模块,在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
-
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存
-n 最多的打开的文件描述符个数
-u 最大用户进程数
-S 使用soft(软)资源限制
-H 使用hard(硬)资源限制(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
配置文件:每行一个定义:<domain> <type> <item> <value>
<domain> //应用于哪些对象 username //单个用户 @group //组内所有用户 * //所有用户 <type> //限制的类型 Soft //软限制,普通用户自己可以修改 Hard //硬限制,由root用户设定,且通过kernel强制生效 - //二者同时限定 <item> //限制的资源 nofile //所能够同时打开的最大文件数量,默认为1024 nproc //所能够同时运行的进程的最大数量,默认为1024 <value> //指定具体值
例如:限制用户最多打开的文件数和运行进程数
/etc/pam.d/system-auth文件中已经引入了pam_limits.so模块
在其他主机对本机的httpd服务进行ab测试,发现打开文件过多
ab -c 3000 -n 10000 http://192.168.136.229/
编辑/etc/security/limits.conf文件,添加如下内容:
apache - nofile 10240
apache用户可打开10240个文件再次在其他主机对本机的httpd服务进行ab测试,这次通过了压力测试
-