安全机制
对称和非对称加密
散列算法
gpg
PKI和CA
openssl
证书管理
ssh服务和dropbear
aide
Sudo
TCPWrappers
PAM模块
墨菲定律
- 墨菲定律:一种心理学效应,是由爱德华墨菲(EdwardA. Murphy)提出的, 原话:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导 致灾难,则必定有人会做出这种选择
- 主要内容:
- 任何事都没有表面看起来那么简单
- 所有的事都会比你预计的时间长
- 会出错的事总会出错
- 如果你担心某种情况发生,那么它就更有可能发生
安全机制
- 信息安全防护的目标
- 保密性 Confidentiality
- 完整性 Integrity
- 可用性 Usability
- 可控制性 Controlability
- 不可否认性 Non-repudiation
- 安全防护环节
- 物理安全:各种设备/主机、机房环境
- 系统安全:主机或设备的操作系统
- 应用安全:各种网络服务、应用程序
- 网络安全:对网络访问的控制、防火墙规则
- 数据安全:信息的备份与恢复、加密解密
- 管理安全:各种保障性的规范、流程、方法
安全
- 安全攻击: STRIDE
- Spoofing假冒
- Tampering篡改
- Repudiation 否认
- Information Disclosure 信息泄漏
- Denial of Service 拒绝服务
- Elevation of Privilege 提升权限
安全设计基本原则
- 使用成熟的安全系统
- 以小人之心度输入数据
- 外部系统是不安全的
- 最小授权
- 减少外部接口
- 缺省使用安全模式
- 安全不是似是而非
- 从STRIDE思考
- 在入口处检查
- 从管理上保护好你的系统
安全算法
- 常用安全技术
- 认证
- 授权
- 审计
- 安全通信
- 密码算法和协议
- 对称加密
- 公钥加密
- 单向加密
- 认证协议
对称加密算法
- 对称加密:加密和解密使用同一个密钥DES:
- Data Encryption Standard,56bits
- 3DES:
- AES:Advanced (128, 192, 256bits) Blowfish,Twofish IDEA,RC6,CAST5
- 特性:
- 1、加密、解密使用同一个密钥,效率高
- 2、将原始数据分割成固定大小的块,逐个进行加密
- 缺陷:
- 1、密钥过多
- 2、密钥分发
- 3、数据来源无法确认
非对称加密算法
- 公钥加密:密钥是成对出现
- 公钥:公开给所有人;publickey
- 私钥:自己留存,必须保证其私密性;secretkey
- 特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
- 功能:
- 数字签名:主要在于让接收方确认发送方身份
- 对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
- 数据加密:适合加密较小数据
- 缺点:密钥长,加密解密效率低下
- 算法:
- RSA(加密,数字签名)
- DSA( 数 字 签 名 )
- ELGamal
非对称加密
- 基于一对公钥/密钥对
- 用密钥对中的一个加密,另一个解密
- 实现加密:
- 接收者
- 生成公钥/密钥对:P和S
- 公开公钥P,保密密钥S
- 接收者
- 发送者
- 使用接收者的公钥来加密消息M
- 将P(M)发送给接收者
- 接收者
- 使用密钥S来解密:M=S(P(M))
- 实现数字签名:
- 发送者
- 生成公钥/密钥对:P和S
- 公开公钥P,保密密钥S
- 使用密钥S来加密消息M
- 发送给接收者S(M)
- 接收者
- 使用发送者的公钥来解密M=P(S(M))
- 发送者
- 结合签名和加密
- 分离签名
单向散列
- 将任意数据缩小成固定大小的“指纹”
- 任意长度输入
- 固定长度输出
- 若修改数据,指纹也会改变(“不会产生冲突”)
- 无法从指纹中重新生成数据(“单向”)
- 功能:数据完整性
- 常见算法
- md5: 128bits、sha1: 160bits、sha224 、sha256、sha384、sha512
- 常用工具
- md5sum| sha1sum [ –check ] file
- openssl、gpg
- rpm -V
数字签名
密钥交换
- 密钥交换:IKE(Internet Key Exchange )
- 公钥加密:
- DH (Deffie-Hellman):生成会话密钥,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表
- 参看:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
- 公钥加密:
- DH:
- A:g,p 协商生成公开的整数g, 大素数p;B: g,p
- A:生成隐私数据 :a (a<p),计算得出 g^a%p,发送给B;B:生成隐私数据 :b,计算得出 g^b%p,发送给A
- A:计算得出 [(g^b%p)^a]%p = g^ab%p,生成为密钥;B:计算得出 [(g^a%p)^b] %p = g^ab%p,生成为密钥
应用程序:RPM
- 文件完整性的两种实施方式
- 被安装的文件
- MD5单向散列
- rpm –verify package_name (or -V)
- 发行的软件包文件
- GPG公钥签名
- rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
- rpm –checksig pakage_file_name (or -K)
使用gpg实现对称加密
- 对称加密file文件
- gpg -c file
- ls file.gpg
- 在另一台主机上解密file
- gpg -o file -dgpg
使用gpg工具实现公钥加密
- 在hostB主机上用公钥加密,在hostA主机上解密
- 在hostA主机上生成公钥/私钥对
- gpg –gen-key
- 在hostA主机上查看公钥
- gpg–list-keys
- 在hostA主机上导出公钥到duan.pubkey
- gpg -a –export -o duan.pubkey
- 从hostA主机上复制公钥文件到需加密的B主机上
- scp duan.pubkey hostB:
- 在需加密数据的hostB主机上生成公钥/私钥对
- gpg–list-keys
- gpg –gen-key
- 在hostB主机上导入公钥
- gpg –import duan.pubkey
- gpg –list-keys
- 用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
- gpg -e -r duanxin file
- file file.gpg
- 复制加密文件到hostA主机
- scp fstab.gpghostA:
- 在hostA主机解密文件
- gpg -dgpg
- gpg -o file -d file.gpg
- 删除公钥和私钥
- gpg –delete-keys duanxin
- gpg –delete-secret-keys duanxin
中间人攻击
CA和证书
- PKI: Public KeyInfrastructure
- 签证机构:CA(Certificate Authority)
- 注册机构:RA
- 证书吊销列表:CRL
- 证书存取库:
- X.509:定义了证书的结构以及认证协议标准
- 版 本 号
- 序 列 号
- 签名算法
- 颁 发 者
- 有效期限
- 主体名称
- 主体公钥
- CRL分发点
- 扩 展 信 息
- 发行者签名
证书获取
- 证书类型:
- 证书授权机构的证书
- 服 务 器
- 用户证书
- 获取证书两种方法:
- 使用证书授权机构
- 生成签名请求(csr)
- 将csr发送给CA
- 从CA处接收签名
- 使用证书授权机构
- 自签名的证书
- 自已签发自己的公钥
安全协议
- SSL: Secure Socket Layer,TLS: Transport LayerSecurity
- 1995:SSL 2.0 Netscape
- 1996: SSL 3.0
- 1999: TLS 1.0
- 2006: TLS 1.1 IETF(Internet工程任务组) RFC 4346
- 2008:TLS 1.2 当前使用
- 2015: TLS 1.3
- 功能:机密性,认证,完整性,重放保护
- 两阶段协议,分为握手阶段和应用阶段
- 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使 用的所有密钥都是通过MasterSecret生成。
- 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密 钥进行安全通信
SSL/TLS
- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
- ChangeCipherSpec协议:一条消息表明握手协议已经完成
- Alert协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别, fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续, 只是会给出错误警告
- Record协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
- HTTPS协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输
HTTPS结构
HTTPS工作过程
OpenSSL
- OpenSSL:开源项目
- 三个组件:
- openssl: 多用途的命令行工具,包openssl
- libcrypto: 加 密 算 法 库 , 包 openssl-libs
- libssl:加密模块应用库,实现了ssl及tls,包nss
- 三个组件:
- openssl命令:
- 两种运行模式:交互模式和批处理模式
- openssl version:程序版本号
- 标准命令、消息摘要命令、加密命令
- 标准命令:
- enc, ca, req, …
openssl命令
- 对称加密:
- 工具:openssl enc, gpg
- 算法:3des, aes, blowfish, twofish
- enc命令:
- 帮助:man enc
- 加密:
- openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
- 解密:
- openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
- openssl ?
- 单向加密:
- 工具:md5sum, sha1sum, sha224sum,sha256sum…
- openssl dgst
- dgst命令:
- 帮助:man dgst
- openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
- openssl dgst -md5 testfile
- md5sum /PATH/TO/SOMEFILE
- MAC:Message Authentication Code,单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
- CBC-MAC
- HMAC:使用md5或sha1算法
- 生成用户密码:
- passwd命令:
- 帮助:man sslpasswd
- openssl passwd -1 -salt SALT(最多8位)
- openssl passwd -1 –salt centos
- 生成随机数:
- 帮助:man sslrand
- openssl rand -base64|-hex NUM
- NUM: 表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2
- 公钥加密:
- 算法:RSA, ELGamal
- 工具:gpg, openssl rsautl(man rsautl)
- 数字签名:
- 算法:RSA, DSA, ELGamal
- 密钥交换:
- 算法:dh
- DSA: Digital Signature Algorithm
- DSS:Digital Signature Standard
- RSA:
- 生成密钥对儿:mangenrsa
- 生成私钥
- openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS (umask 077; openssl genrsa –out test.key –des 2048) openssl rsa -in test.key –out test2.key 将加密key解密
- 从私钥中提取出公钥
- openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
- openssl rsa –in test.key –pubout –out test.key.pub
- 随机数生成器:伪随机
- 数字键盘和鼠标,块设备中断
- /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
- /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
OpenSSL
- PKI:Public KeyInfrastructure
- CA
- RA
- CRL
- 证书存取库
- 建立私有CA:
- OpenCA
- openssl
- 证书申请及签署步骤:
- 1、生成申请请求
- 2、RA核验
- 3、CA签署
- 4、获取证书
创建CA和申请证书
- 创建私有CA:
- openssl的配置文件:/etc/pki/tls/openssl.cnf
- 三种策略:匹配、支持和可选
- 匹配指要求申请填写的信息跟CA设置信息必须一致,支持指必须填写这项申请信息,可选指可有可无
- 1、创建所需要的文件
- touch /etc/pki/CA/index.txt 生成证书索引数据库文件
- echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号
- 2、 CA自签证书
- 生成私钥
- cd /etc/pki/CA/
- (umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
- 生成自签名证书
- openssl req -new -x509 –key
- /etc/pki/CA/private/cakey.pem -days 7300 -out
- /etc/pki/CA/cacert.pem
- -new: 生成新证书签署请求
- -x509: 专用于CA生成自签证书
- -key: 生成请求时用到的私钥文件
- -days n:证书的有效期限
- -out /PATH/TO/SOMECERTFILE: 证书的保存路径
- 3、颁发证书
- 在需要使用证书的主机生成证书请求给web服务器生成私钥
- (umask 066; openssl genrsa -out
- /etc/pki/tls/private/test.key 2048)
- 生成证书申请文件
- openssl req -new -key /etc/pki/tls/private/test.key -days 365 -out etc/pki/tls/test.csr
- 将证书请求文件传输给CA
- CA签署证书,并将证书颁发给请求者
- openssl ca -in /tmp/test.csr–out /etc/pki/CA/certs/test.crt -days 365
- 注意:默认国家,省,公司名称三项必须和CA一致
- 在需要使用证书的主机生成证书请求给web服务器生成私钥
创建CA和证书管理
- 查看证书中的信息:
- openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
- openssl ca -status SERIAL 查看指定编号的证书状态
- 4、吊销证书
- 在客户端获取要吊销的证书的serial
- openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
- 在CA上,根据客户提交的serial与subject信息,对比检验是否与txt文件中的信息一致,
- 吊销证书:
- openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
- 指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
- echo 01 > /etc/pki/CA/crlnumber
- 更新证书吊销列表
- openssl ca -gencrl -out /etc/pki/CA/crl.pem
- 查看crl文件:
- openssl crl -in /etc/pki/CA/crl.pem -noout -text
SSH
- ssh:secure shell, protocol, 22/tcp, 安全的远程登录
- 具体的软件实现:
- OpenSSH: ssh协议的开源实现,CentOS默认安装
- dropbear:另一个开源实现
- SSH协议版本
- v1: 基于CRC-32做MAC,不安全;man-in-middle
- v2:双方主机协议选择安全的MAC方式
- 基于DH算法做密钥交换,基于RSA或DSA实现身份认证
- 两种方式的用户登录认证:
- 基于password
- 基于key
Openssh软件组成
- OpenSSH介绍
- 相关包:
- openssh
- openssh-clients
- openssh-server
- 工具:
- 基于C/S结构
- Client: ssh, scp, sftp,slogin
- Windows客户端:
- xshell, putty, securecrt, sshsecureshellclient Server: sshd
- 基于C/S结构
ssh客户端
- 客户端组件:
- ssh,配置文件:/etc/ssh/ssh_config
- Host PATTERN
- StrictHostKeyChecking no 首次登录不显示检查提示
- Host PATTERN
- 格式:
- ssh[user@]host [COMMAND]
- ssh [-l user] host [COMMAND]
- 常见选项
- -p port:远程服务器监听的端口
- -b:指定连接的源IP
- -v:调试模式
- -C:压缩方式
- -X:支持x11转发
- -t:强制伪tty分配
- ssh -t remoteserver1 ssh remoteserver2
- 允许实现对远程系统经验证地加密安全访问
- 当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的
~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
ssh服务登录验证
- ssh服务登录验证方式:
- 用户/口令
- 基于密钥
- 基于用户和口令登录验证
- 1客户端发起ssh请求,服务器会把自己的公钥发送给用户
- 2用户会根据服务器发来的公钥对密码进行加密
- 3加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
- 基于用户名口令登录验证
- 基于密钥的登录方式
- 1首先在客户端生成一对密钥(ssh-keygen)
- 2并将客户端的公钥ssh-copy-id 拷贝到服务端
- 3当客户端再次发送一个连接请求,包括ip、用户名
- 4服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:acdf
- 5服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
- 6得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
- 7服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致, 就允许免密码登录
- 基于密钥的登录方式
- 基于密钥的认证:
- (1)在客户端生成密钥对
- ssh-keygen -t rsa [-P ”] [-f “~/.ssh/id_rsa”]
- (2)把公钥文件传输至远程服务器对应用户的家目录ssh-copy-id [-i [identity_file]] [user@]host
- (3)测试
- (4)在SecureCRT或Xshell实现基于key验证
- 在SecureCRT工具—>创建公钥—>生成Identity.pub文件
- 转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh 主机上执行:
- ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys
- (5)重设私钥口令:
- ssh-keygen –p
- (6)验证代理(authenticationagent)保密解密后的密钥
- 这样口令就只需要输入一次
- 在GNOME中,代理被自动提供给root用户
- 否则运行ssh-agentbash
- (1)在客户端生成密钥对
- (7)钥匙通过命令添加给代理
- ssh-add
scp命令
- scp命令:
- scp [options] SRC…DEST/
- 两种方式:
- scp [options] [user@]host:/sourcefile /destpath
- scp [options] /sourcefile [user@]host:/destpath
- 常用选项:
- -C 压缩数据流
- -r 递归复制
- -p 保持原文件的属性信息
- -q 静默模式
- -P PORT 指明remote host的监听的端口
rsync命令
- 基于ssh和rsh服务实现高效率的远程系统之间复制文件
- 使用安全的shell连接做为传输方式
- rsync–av /etc server1:/tmp 复制目录和目录下文件
- rsync–av /etc/ server1:/tmp 只复制目录下文件
- 比scp更快,只复制不同的文件
- 选项:
- -n 模拟复制过程
- -v 显示详细过程
- -r 递归复制目录树
- -p 保留权限
- -t 保留时间戳
- -g 保留组信息
- -o 保留所有者信息
- -l 将软链接文件本身进行复制(默认)
- -L 将软链接文件指向的文件复制
- -a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
sftp命令
- 交互式文件传输工具
- 用法和传统的ftp工具相似
- 利用ssh服务实现安全的文件上传和下载
- 使用lscd mkdir rmdir pwd get put等指令,可用?或help获取帮助信息
- sftp [user@]host
- sftp> help
pssh工具
- pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制
- 选项如下:
- –version:查看版本
- -h:主机文件列表,内容格式”[user@]host[:port]”
- -H:主机字符串,内容格式”[user@]host[:port]”
- -A:手动输入密码模式
- -i:每个服务器内部处理信息输出
- -l:登录使用的用户名
- -p:并发的线程数【可选】
- -o:输出的文件目录【可选】
- -e:错误输入文件【可选】
- -t:TIMEOUT超时时间设置,0无限制【可选】
- -O:SSH的选项
- -P:打印出服务器返回信息
- -v:详细模式
pssh示例
- 通过pssh批量关闭seLinux
- pssh-H root@192.168.1.10 -i “sed -i “s/SELINUX=enforcing/SELINUX=disabled/” /etc/selinux/config” 批量发送指令
- pssh-H root@192.168.1.10 -i setenforce 0
- pssh-H xuewb@192.168.1.10 -i hostname
- 当不支持ssh的key认证时,通过 -A选项,使用密码认证批量执行指令
- pssh-H xuewb@192.168.1.10 -A -i hostname
- 将标准错误和标准正确重定向都保存至/app目录下
- pssh -H 192.168.1.10 -o /app-e /app -i “hostname”
pscp.pssh命令
- pssh功能是将本地文件批量复制到远程主机
- pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] local remote
- Pscp-pssh选项
- -v 显示复制过程
- -r 递归复制目录
- 将本地sh复制到/app/目录
- pscp.pssh -H 192.168.1.10 /root/test/curl.sh /app/
- pscp.pssh -h host.txt /root/test/curl.sh /app/
- 将本地多个文件批量复制到/app/目录
- pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /app/
- 将本地目录批量复制到/app/目录
- pscp.pssh -H 192.168.1.10 -r /root/test/ /app/
pslurp命令
- pslurp功能是将远程主机的文件批量复制到本地
- pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-Llocaldir] remote local(本地名)
- Pslurp选项
- -L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
- -r 递归复制目录
- 批量下载目标服务器的passwd文件至/app下,并更名为user
- pslurp -H 192.168.1.10 -L /app/ /etc/passwduser
SSH端口转发
- SSH端口转发
- SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP, LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是 允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
- SSH 端口转发能够提供两大功能:
- 加密 SSHClient 端至 SSH Server 端之间的通讯数据
- 突破防火墙的限制完成一些之前无法建立的 TCP连接
- 本地转发:
- -L localport:remotehost:remotehostport sshserver
- 选项:
- -f 后台启用
- -N 不打开远程shell,处于等待状态
- -g 启用网关功能
- 示例
- ssh –L 9527:telnetsrv:23 -N sshsrv
- telnet 127.0.0.1 9527
- 当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23
- data← →localhost:9527← →localhost:XXXXX← →sshsrv:22← →sshsrv:YYYYY← →telnetsrv:23
- 远程转发:
- -R sshserverport:remotehost:remotehostport sshserver
- 示例:
- ssh –R 9527:telnetsrv:23 –N sshsrv
- 让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23
- Data← →sshsrv:9527← →sshsrv:22← →localhost:XXXXX← →localhost:YYYYY← →telnetsrv:23
- 动态端口转发:
- 当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet
- ssh -D 1080 root@sshserver
- 在本机firefox设置代理socket proxy:127.0.0.1:1080
- curl –socks5 127.0.0.1:1080 http://www.qq.com
X协议转发
- 所有图形化应用程序都是X客户程序
- 能够通过tcp/ip连接远程X服务器
- 数据没有加密机,但是它通过ssh连接隧道安全进行
- ssh -X user@remotehostgedit
- remotehost主机上的gedit工具,将会显示在本机的X服务器上
- 传输的数据将通过ssh连接加密
ssh服务器
- 服务器端:sshd,配置文件: /etc/ssh/sshd_config
- 常用参数:
- Port
- ListenAddress ip
- LoginGraceTime 2m
- PermitRootLogin yes
- StrictModesyes 检查.ssh/文件的所有者,权限等
- MaxAuthTries 6
- MaxSessions 10 同一个连接最大会话
- PubkeyAuthentication yes
- PermitEmptyPasswords no
- PasswordAuthentication yes
常用参数
- GatewayPortsno
- ClientAliveInterval:单位:秒
- ClientAliveCountMax:默认3
- UseDNSyes
- GSSAPIAuthenticationyes 提高速度可改为no
- MaxStartups 未认证连接最大值,默认值10
- Banner/path/file
- 限制可登录用户的办法:
- AllowUsers user1 user2 user3
- DenyUsers
- AllowGroups
- DenyGroups
ssh服务的最佳实践
- 建议使用非默认端口
- 禁止使用protocolversion 1
- 限制可登录用户
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址
- 基于口令认证时,使用强密码策略
- tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
- 使用基于密钥的认证
- 禁止使用空密码
- 禁止root用户直接登录
- 限制ssh的访问频度和并发在线数
- 经常分析日志
编译安装dropbear示例
- ssh协议的另一个实现:dropbear
- 源码编译安装:
- 1、安装开发包组:yumgroupinstall “Development tools”
- 2、下载dropbear-2017.75.tar.bz2
- 3、tarxf dropbear-2017.75.tar.bz2
- 4、lessINSTALL README
- 5、./configure
- 6、makePROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp”
- 7、makePROGRAMS=”dropbear dbclient dropbearkey dropbearconvert scp” install
- 启动ssh服务:
- 8、ls/usr/local/sbin/ /usr/local/bin/
- 9、/usr/local/sbin/dropbear -h
- 10、mkdir/etc/dropbear
- 11、dropbearkey-t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
- 12、dropbearkey -tdss -f /etc/dropbear/dropbear_dsa_host_key
- 13、dropbear-p :2222 -F –E #前台运行dropbear -p :2222 #后台运行
- 客户端访问:
- 14、ssh-p 2222 root@127.0.0.1
- 15、dbclient-p 2222 root@127.0.0.1
AIDE
- 当一个入侵者进入了你的系统并且种植了木马,通常会想办法来隐蔽这个木马(除了木马自身的一些隐蔽特性外,他会尽量给你检查系统的过程设置障碍), 通常入侵者会修改一些文件,比如管理员通常用ps -aux来查看系统进程,那么入侵者很可能用自己经过修改的ps程序来替换掉你系统上的ps程序,以使用ps命令查不到正在运行的木马程序。如果入侵者发现管理员正在运行crontab 作业,也有可能替换掉crontab程序等等。所以由此可以看出对于系统文件或是关键文件的检查是很必要的。目前就系统完整性检查的工具用的比较多的有两款:Tripwire和AIDE,前者是一款商业软件,后者是一款免费的但功能也很强大的工具
- AIDE(Advanced Intrusion DetectionEnvironment)
- 高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那些文件被更改过了。
- AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性,包括:权限(permission)、索引节点序号(inodenumber)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以及连接数。AIDE还能够使用下列算法: sha1、md5、rmd160、tiger,以密文形式建立每个文件的校验码或散列号.
- 这个数据库不应该保存那些经常变动的文件信息,例如:日志文件、邮件、/proc文件 系统、用户起始目录以及临时目录.
- 安装
- yum install aide
- 修改配置文件
- vim /etc/aide.conf (指定对哪些文件进行检测)
- /test/chameleon R
- /bin/ps R+a
- /usr/bin/crontab R+a
- /etc PERMS
- !/etc/mtab #“!”表示忽略这个文件的检查
- R=p+i+n+u+g+s+m+c+md5 权限+索引节点+链接数+用户+组+大小+ 最后一次修改时间+创建时间+md5校验值
- NORMAL = R+rmd60+sha256
- vim /etc/aide.conf (指定对哪些文件进行检测)
- 初始化默认的AIDE的库:
- /usr/local/bin/aide –init
- 生成检查数据库(建议初始数据库存放到安全的地方)
- cd /var/lib/aide
- mv aide.db.new.gz aide.db.gz
- 检测:
- /usr/local/bin/aide –check
- 更新数据库
- aide –update
更改身份
- su切换身份:su –l username –c ‘command’
- sudo
- 来自sudo包,man5 sudoers
- sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
- sudo可以提供日志,记录每个用户使用sudo操作
- sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机
- sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券”
- 通过visudo命令编辑配置文件,具有语法检查功能
- visudo–c 检查语法
- visudo -f /etc/sudoers.d/test
sudo
- 配置文件:/etc/sudoers, /etc/sudoers.d/
- 时间戳文件:/var/db/sudo
- 日志文件:/var/log/secure
- 配置文件支持使用通配符glob:
- ?:任意单一字符
- * :匹配任意长度字符
- [wxc]:匹配其中一个字符
- [!wxc]:除了这三个字符的其它字符
- \x : 转义
- [[alpha]] :字母 示例: /bin/ls [[alpha]]*
- 配置文件规则有两类;
- 1、别名定义:不是必须的
- 2、授权规则:必须的
sudoers
- 授权规则格式:
- 用户 登入主机=(代表用户) 命令
- 示例:
- root ALL=(ALL) ALL
- 格式说明:
- user: 运行命令者的身份
- host: 通过哪些主机(runas):以哪个用户的身份
- command: 运行哪些命令
别名
- Users和runas:
- username
- #uid
- %group_name
- %#gid
- user_alias|runas_alias
- host:
- ip 或 hostname
- network(/netmask)
- host_alias
- command:
- command name
- directory
- sudoedit
- Cmnd_Alias
sudo别名和示例
- 别名有四种类型: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
- %wheel ALL=(ALL) ALL
- 示例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
- 示例4
- User_Alias SYSADER=wang,mage,%admins
- User_Alias DISKADER=tom
- Host_Alias SERS=www.magedu.com,172.16.0.0/24
- Runas_Alias OP=root
- Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod
- Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk
- SYSADER SERS= SYDCMD,DSKCMD
- DISKADER ALL=(OP) DSKCMD
- 示例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
- 示例5
- Defaults:wang runas_default=tom
- duan ALL=(tom,jerry) ALL
- 示例6
- duan 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd
- 示例7
- duan ALL=(ALL) /bin/cat /var/log/messages*
sudo命令
- ls -l/usr/bin/sudo
- sudo–i –u wang 切换身份
- sudo [-u user]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_Wrappers介绍
- 作者:WiesteVenema,IBM,Google
- 工作在第四层(传输层)的TCP协议
- 对有状态连接的特定服务进行安全检测并实现访问控制
- 以库文件形式实现
- 某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的
- 判断服务程序是否能够由tcp_wrapper进行访问控制的方法:
- ldd /PATH/TO/PROGRAM|grepso
- strings PATH/TO/PROGRAM|grep libwrap.so
TCP_Wrappers使用
- 配置文件:/etc/hosts.allow, /etc/hosts.deny
- 帮助参考:man5 hosts_access,man 5 hosts_options
- 检查顺序:allow,hosts.deny(默认允许) 注意:一旦前面规则匹配,直接生效,将不再继续
- 基本语法:
- 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 168.1.
- 基于主机名:magedu.com .magedu.com 较少用
- 基于网络/掩码:192.168.0.0/255.255.255.0
- 基于net/prefixlen: 168.1.0/24(CentOS7)
- 基于网络组(NIS域):@mynetwork
- 内置ACL:ALL,LOCAL,KNOWN,UNKNOWN,PARANOID
- EXCEPT用法:
- 示例:
- vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
- 示例:
- 示例:只允许168.1.0/24的主机访问sshd
- /etc/hosts.allow
- sshd: 192.168.1.
- /etc/hosts.deny
- sshd :ALL
- /etc/hosts.allow
- 示例:只允许168.1.0/24的主机访问telnet和vsftpd服务
- /etc/hosts.allow
- vsftpd,in.telnetd: 192.168.1.
- /etc/host.deny
- vsftpd,in.telnetd: ALL
- /etc/hosts.allow
- [:options]选项:
- 帮助:man5 hosts_options
- deny 主要用在/etc/hosts.allow定义“拒绝”规则如:vsftpd: 172.16. :deny
- allow 主要用在/etc/hosts.deny定义“允许”规则如:vsftpd:172.16. :allow
- spawn 启动一个外部程序完成执行的操作
- twist 实际动作是拒绝访问,使用指定的操作替换当前服务,标准I/O和ERROR 发送到客户端,默认至/dev/null
- 测试工具:
- tcpdmatch [-d] daemon[@host] client
- -d 测试当前目录下的hosts.allow和hosts.deny
示例
- sshd: ALL :spawn echo “$(date+%%F) login attempt from %c to %s,%d” >>/var/log/sshd.log
- 说明:
- 在/etc/hosts.allow中添加,允许登录,并记录日志
- 在/etc/hosts.deny中添加,拒绝登录,并记录日志
- %c客户端信息
- %s服务器端信息
- %d服务名
- %p 守护进程的PID
- %% 表示%
- vsftpd:16. :twist /bin/echo “connection prohibited”
练习
- 仅开放本机两个IP地址中的一个地址172.16.0.X上绑定的sshd和vsftpd服务给172.16.0.0/16网络中除了172.16.0.0/24网络中的主机之外的所有主机,但允许172.16.0.200访问,每次的用户访问都要记录于日志文件中注:其中X为学号
- 编写脚本/root/bin/checkip.sh,每5分钟检查一次,如果发现通过ssh登录失败次数超过10次,自动将此远程IP放入TcpWrapper的黑名单中予以禁止防问
PAM认证机制
- PAM:Pluggable AuthenticationModules
- 认证库:文本文件,MySQL,NIS,LDAP等
- Sun公司于1995 年开发的一种与认证相关的通用框架机制
- PAM是关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开
- 使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序
- 一种认证框架,自身不做认证
- 它提供了对所有服务进行认证的中央机制,适用于login,远程登录(telnet,rlogin,fsh,ftp,点对点协议(PPP)),su等应用程序中。系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来
PAM架构
PAM认证机制
- PAM相关文件
- 模块文件目录:/lib64/security/*.so
- 环境相关的设置:/etc/security/
- 主配置文件:/etc/pam.conf,默认不存在
- 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
- 注意:如/etc/pam.d存在,/etc/pam.conf将失效
PAM认证原理
- PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
- PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib/security下)进行安全认证
PAM认证机制
- PAM认证过程:
- 使用者执行/usr/bin/passwd 程序,并输入密码
- passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
- 经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
- 将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)
- 通用配置文件/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与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)
- Password用户修改密码时密码复杂度检查机制等功能
- Session用户获取到服务之前或使用服务完成之后需要进行一些附加的操作, 如:记录打开/关闭数据的信息,监视目录等
- -type表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
- Control:
- PAM库如何处理与该服务相关的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
- 注意:修改PAM配置文件将马上生效
- 建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
- Arguments 用来传递给该模块的参数
pam文档说明
- /user/share/doc/pam-*
- rpm -qdpam
- man –kpam_
- man模块名 如man rootok
- 《TheLinux-PAM System Administrators’ Guide》
PAM模块示例
- 模块:pam_shells
- 功能:检查有效shell
- manpam_shells
- 示例:不允许使用/bin/csh的用户本地登录
- vim/etc/pam.d/login
- auth required pam_shells.so
- vim /etc/shells
- 去掉 /bin/csh
- useradd –s /bin/csh testuser
- testuser将不可登录
- tail /var/log/secure
- vim/etc/pam.d/login
- 模块:pam_securetty.so
- 功能:只允许root用户在/etc/securetty列出的安全终端上登陆
- 示例:允许root在telnet登陆
- vi /etc/pam.d/remote
- #auth required pam_securetty.so #将这一行加上注释
- 或者/etc/securetty文件中加入
- pts/0,pts/1…pts/n
- vi /etc/pam.d/remote
- 模块:pam_nologin.so
- 功能:
- 如果/etc/nologin文件存在,将导致非root用户不能登陆
- 如果用户shell是/sbin/nologin时,当该用户登陆时,会显示/etc/nologin 文件内容,并拒绝登陆
- 模块:pam_limits.so
- 功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
- 修改限制的实现方式:
- (1)ulimit命令,立即生效,但无法保存
- -n 最多的打开的文件描述符个数
- -u 最大用户进程数
- -S 使用 soft(软)资源限制
- -H 使用 hard(硬)资源限制
- (2)配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
- (1)ulimit命令,立即生效,但无法保存
- 配置文件:每行一个定义;
- <domain> <type> <item> <value>
PAM认证机制
pam_limits.so
- <domain> 应用于哪些对象
- Username单个用户
- @group组内所有用户
- * 所有用户
- <type>限制的类型
- Soft 软限制,普通用户自己可以修改
- Hard硬限制,由root用户设定,且通过kernel强制生效
- – 二者同时限定
- <item> 限制的资源
- nofile所能够同时打开的最大文件数量,默认为1024
- nproc 所能够同时运行的进程的最大数量,默认为1024
- <value> 指定具体值
示例:pam_limits.so
- 限制用户最多打开的文件数和运行进程数
- /etc/pam.d/system-auth
- session required pam_limits.so
- vim/etc/security/limits.conf
- apache – nofile 10240 用户apache可打开10240个文件
- student hard nproc 20 用户student不能运行超过20个进程
练习
- 1、限制centos用户只能够在工作时间通过ssh远程连接本机
- 2、限制只有admins组内的用户可ssh到本机