墨菲定律
墨菲定律:一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的,
原话:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导
致灾难,则必定有人会做出这种选择
主要内容:
任何事都没有表面看起来那么简单
所有的事都会比你预计的时间长
会出错的事总会出错
如果你担心某种情况发生,那么它就更有可能发生
安全机制
信息安全防护的目标
保密性 Confidentiality
完整性 Integrity:数据确定完好,不能被篡改
可用性 Usability:read5(高可用性)系统的总体运行时间占全部时间的百分比,百分比越 高,可用性越高,百分比按年计算,%99.9 当机10小时
可控制性Controlability
不可否认性 Non-repudiation
安全防护环节
物理安全:各种设备/主机、机房环境
系统安全:主机或设备的操作系统
应用安全:各种网络服务、应用程序 (文件共享)
网络安全:对网络访问的控制、防火墙规则(iptables -vnL iptables -F)
数据安全:信息的备份与恢复、加密解密
管理安全:各种保障性的规范、流程、方法
安全攻击: STRIDE
1 Spoofing 假冒 (钓鱼网站,可以通过看域名辨别)
2 Tampering 篡改 (发邮件给tom mail -s test tom .或者ctrl+d保存退出邮件,,)
3 Repudiation 否认
4 Information Disclosure 信息泄漏
Denial of Service 拒绝服务DDOS攻击 ping -f(尽对方cpu所能去ping对方)-s 34428 5 ddos"分布式攻击",网络黑客发送大量的访问请求,耗尽资源,网络对方无法进行服务
6 Elevation of Privilege 提升权限(把普通用户的权限设置为管理员权限)
centos5上:1:useradd wang 2:su - wang
安全设计基本原则
1 使用成熟的安全系统 :
2 以小人之心度输入数据 :用户输入的数据有可能是错误的数据,绕过密码的检查
select *(*表示所有字段) from user (查询user表中有没有用户账号)
SQL(注入攻击)where username=‘toot’ and(shall中的&&) password=‘ ’ or ‘1’ = ‘1’
username=root
password=magedu (只要一个为真全为真)
password= ‘ or(shall中的或) ‘ 1’ = ‘ 1 ’ (构造了一个奇怪的口令绕过密码检查)
3 外部系统是不安全的,防火墙:非军事化区(DMZ) 军事化区:严禁外部访问
防水墙:防止企业内部安全的攻击,拒接用户随意的访问企业内部
4 最小授权,
5 减少外部接口
6 缺省使用安全模式:考虑使用SElinux
7 安全不是似是而非
8 从STRIDE(攻击方式)思考
9 在入口处检查:如地铁的入口检查
10 从管理上保护好你的系统
安全算法 3A(认证,授权,审计)
常用安全技术
认证 :验证身份方法:用户名,口令等
授权 :用户账号不一样授权不一样
审计 : 记录和安全相关的操作
安全通信
不安全的传统协议
telnet、FTP、POP3等等;不安全密码
http、smtp、NFS等等;不安全信息
Ldap、NIS、rsh等等;不安全验证
密码算法和协议:
对称加密
公钥加密
单向加密
认证协议
对称加密算法
对称加密:加密和解密使用同一个密钥 key1=key2
eg:A (data) 明文 key1 (data) 密文 --------(传输) ------ key2( key1 (data)) B
DES:Data Encryption Standard(数据加密标准),56bits(56位)
补充:ascii码:把所有的数字或字母,符号等编写为ascii码,转化为二进制使得计算机识别
3DES: DES加密3次
AES:Advanced(高级) (128, 192, 256bits)主流的加密
Blowfish,Twofish (商业算法)
IDEA,RC6,CAST5
特性:
1、加密、解密使用同一个密钥,效率高,适合加密大量的数据
2、将原始数据分割成固定大小的块,逐个进行加密
缺陷:
1、密钥过多
2、密钥分发
3、数据来源无法确认:(可能会收到假冒的加密数据)
非对称加密算法
非对称加密算法 key1 ! = key2 安全通行,数据来源确认
public key (公钥,公开,到处发放) A pa sa
secret key (私钥,私有的) B pb sb
eg 1A用 {pb加密(data)}------(传输) ----- B用sb解密(data)
eg 2 Alice 发送 BOb
基于一对公钥/密钥对, 用密钥对中的一个加密,另一个解密
• 接收者BOb
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
• 发送者
Alice
使用接收者的公钥来加密消息M
将P(M)发送给接收者
• 接收者
BOb
使用密钥S来解密:M=S(P(M))
Alice :Pa公钥,Sa私钥
BOb :Pb公钥,Sb私钥
加密(Pb)------解密(Sb) Alice 发送 BOb ,,BOb只能解密,其他解不了
加密(Sa)------解密(Pa) Alice 发送 多用户 ,,判断出发出数据这是谁
公钥加密:密钥是成对出现 拿到公钥是推算不出私钥的,公钥可以通过私钥推出
公钥:公开给所有人;public key
私钥:自己留存,必须保证其私密性;secret key
特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
功能:
数字签名:主要在于让接收方确认发送方身份
对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
数据加密:适合加密较小数据
缺点: 密钥长,加密解密效率低下
算法:
RSA(加密,数字签名) DES 加密1G数据 加密完2G 4m 8m
DSA(数字签名) DES 加密1G数据 加密完1G 1m 64小时
ELGamal
eg:,1 确定数据安全的传输对方,确定数据传输的来源,用非对称加密算法实现
Pb {Sa(data}) 用sa签名,再用pb加密-----用sb解密后,再用pa解密
eg: 2 确定数据安全的传输对方,确定数据传输的来源,用组合加密算法实现
key(data+Sa(data))+pb(key) 解释:
1 A用 key(data)对称秘钥加密+pb(key)再用B的公钥加密key,B用私钥解密key,得到数据
1 再用A的公钥解密数据,在和解密Key的数据进行比对,确认数据的来源
实现数字签名:(只要用私钥加密就是数字签名)
• 发送者
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
使用密钥S来加密消息M
发送给接收者S(M)
• 接收者
使用发送者的公钥来解密M=P(S(M))
结合签名和加密
分离签名
单向散列(hash运算)数据不一样,hash值不同,实现数据的完整性检验
将任意数据缩小成固定大小的“指纹”
• 任意长度输入
• 固定长度输出
• 若修改数据,指纹也会改变(“不会产生冲突”)
• 无法从指纹中重新生成数据(“单向”)
功能: 数据完整性检验
md5: 128bits、sha1: 160bits、sha224
sum,sha256、sha384、sha512
进行下面的数据比较得到数据完整性的校验
eg: md5sum /etc/fstab /etc/passwd > md5.log"将多个文件保存到一个文件中"
md5sum --check
md5sum -C md5.log :保存文件的hash值确认数据有没有改变
md5.log
将现有的文件和已经存好的文件进行比对,出现ok数据就没有被改过
常用工具
• md5sum | sha1sum [ --check ] file
• openssl、gpg
• rpm -V
eg:实现对称,非对称,hash,进行加密:如下:1身份验证,2数据安全
key(data+Sa{hash(data)})+Pb(key)
1 :A用对称加密算法,进行签名并做hash运算,再用B的公钥加密key
2: B用自己的公钥解开key得到: (data+Sa{hash(data)})
3:用A的公钥解密得到hash(data) 再用原数据data做hash运算两者进行比较,确定数据
的来源,如果两者数据一样。,那就确认数据包的来源是A
密钥交换
密钥交换: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)^x] %p = g^ab%p,生成为密钥
B:计算得出 [(g^a%p)^y] %p = g^ab%p,生成为密钥
应用程序:RPM
文件完整性的两种实施方式
被安装的文件
• MD5单向散列
• rpm --verify package_name (or -V) rpm -V检验数据包的每个文件,每次用rpm安装的包,每个数据包的文件的hash值或者初始值存在数据库中,过段时间,用-V检查数据库中得的每个文件的hash值,比对当前文件的hash值,如果不一样,就会报提示:
发行的软件包文件
• GPG公钥签名
• rpm --import(导入公钥) /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
• rpm --checksig pakage_file_name (or -K) rpm -k 检验数据包的每个文件
使用gpg实现对称加密
对称加密file文件
cp /etc/fstab /app/f1/
gpg -c file
ls file.gpg
在另一台主机上解密file
gpg -o file -d file.gpg
实验: 1:[root@centos7 ~]# cd /data
2:[root@centos7 /data]# cp /etc/fstab .
3:[root@centos7 /data]# gpg -c fstab 加密数据
输入口令
4:[root@centos7 /data]# ll
total 8
-rw-r--r--. 1 root root 541 Jul 9 21:23 fstab
-rw-r--r--. 1 root root 311 Jul 9 21:25 fstab.gpg
5:[root@centos7 /data]# scp fstab.gpg 192.168.1.8: 发送加密的数据到另一主机
6:[root@centos6 ~]# file fstab.gpg 产看文件类型,格式
fstab.gpg: data
7:[root@centos6 ~]# gpg -d fstab.gpg 解密
8:[root@centos6 ~]# gpg -o fstab fstab.gpg (-0相当于重定向,生成文件)
使用gpg工具实现公钥加密
在hostB主机上用公钥加密,在hostA主机上解密
在hostA主机上生成公钥/私钥对
gpg --gen-key
在hostA主机上查看公钥
cd .gnupg/ 查看生成的公钥
gpg --list-keys
在hostA主机上导出公钥到wang.pubkey
gpg -a --export -o wang.pubkey
从hostA主机上复制公钥文件到需加密的B主机上
scp wang.pubkey hostB: 如:scp wang.pubkey 172.18.56.56:/app/f1
在需加密数据的hostB主机上生成公钥/私钥对
gpg --list-keys
gpg --gen-key
在hostB主机上导入公钥
gpg --import wang.pubkey
gpg --list-keys
用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
gpg -e -r wangxiaochun file -e表示加密 -r:用谁的公钥加密
file file.gpg
使用gpg工具实现公钥加密
复制加密文件到hostA主机
scp fstab.gpg hostA:
在hostA主机解密文件
gpg -d file.gpg
gpg -o file(解密的新的文件) -d file.gpg
删除公钥和私钥
gpg --delete-keys wangxiaochun 删除公钥
gpg --delete-secret-keys wangxiaochun 删除私钥
实验1 :[root@centos6 ~]# gpg --gen-key 在centos6上生成秘钥对
Please select what kind of key you want: (那种算法加密,默认RSA)
What keysize do you want? (2048) 1024 (用多少位加密,默认1024)
Key is valid for? (0) (有限期,默认十天)
Real name: wangjin (起一个用户的名字)
Email address: (邮箱)
Comment: (描述)
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o(0确定)
2:输入秘钥:(担心私钥被窃取,地私钥用对称秘钥加密)空口令
3:[root@centos6 ~]# cd ~/.gnupg
4:[root@centos6 ~/.gnupg]# gpg --list -keys (查看生成的公钥)
5: [root@centos6 ~/.gnupg]# gpg -a --export -o wang.pubkey (-a用ascii码的文本方式导出 -o指定文件名 wang.pubkey 是自己起的文件名)
6:[root@centos6 ~/.gnupg]#scp wang.pubkey 192.168.56.56: (传到centos7)
7:时间同步
centos6
ntpdate 172.18.0.1
vim /etc/ntp.conf
server 172.18.0.1 iburst
chkconfig ntpd on
service ntpd start
centos7
vim /etc/chrony.conf
systemctl start chronyd
systemctl is-enabled chronyd
systemctl enable chronyd
8:[root@centos7 /data]#cp /root/wang.pubkey .
9:[root@centos7 /data]# gpg -e -r wangjin fstab -e表示加密 -r:用谁的公钥加密
10:[root@centos7 /data]#scp fstab.gpg 192.168.1.8:
11:[root@centos6 ~]#gpg -o -d fstab.gpg 解密生成文件
CA和证书 :系统中内置根证书,免费申请证书的网站https://freessl.org
Base64:A-Z a-z 0-9 + / 共64位
PKI(公共的秘钥体系 公钥,私钥,证书 实现): Public Key Infrastructure
签证机构:CA(Certificate Authority) 证书颁发机构,证明通讯双方是合法连接的
注册机构:RA
证书吊销列表:CRL
证书存取库:
X.509:定义了证书的结构以及认证协议标准
版本号 序列号 签名算法 颁发者 有效期限
主体名称 主体公钥 CRL分发点 扩展信息 发行者签名
证书获取
证书类型:
证书授权机构的证书 (CA)
服务器 (淘宝或天猫等,给计算机用)
用户证书 (用户用)
获取证书两种方法:
• 使用证书授权机构
生成签名请求(csr)
将csr发送给CA
从CA处接收签名
• 自签名的证书 (根CA)
自已签发自己的公钥
安全协议 https 底层是依赖LLS协议
1 SSL(SSL协议: 安全套阶层): Secure Socket Layer
TLS: Transport Layer Security
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
功能:机密性,认证,完整性,重放保护
2 两阶段协议,分为握手阶段和应用阶段
1
握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书 进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成。
2
应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
SSL/TLS
Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
ChangeCipherSpec 协议:一条消息表明握手协议已经完成
Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP overSSL”或“HTTP over TLS”,对http 协议的文本数据进行加密处理后,成为二进制形式传输
文字描述:client(客户端) server(服务器端) ca
1:https://server (客户端发请求到服务器端)
2:server-----client (服务器端传自己的证书到客户端用CA的私钥签名服务器的公钥,)
Sca(Pserver)+CA+server+expir (证书签名,包括CA的证书,有效期之类的)
3:client (客户端信任CA,所有提前装系统的时候拿到CA的公钥)
Pca( Sca(Pserver))(用CA的公钥进行解密)--------Pserver(得到服务器的公钥)
4:client 客户端生成一个随机数 random 12345
5:Pserver(12345)用获取的服务器的公钥把12345进行加密-----------server
6:Server(Pserver(12345))(服务器用自己的私钥解密获取12345)
7:client
12345(data)《-----》 服务器端和客户端共同获得12345,以此传输数据
OpenSSL
OpenSSL:开源项目
三个组件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss
openssl命令:
两种运行模式:交互模式和批处理模式
openssl version:程序版本号
标准命令、消息摘要命令、加密命令
标准命令:
enc, ca, req, ...
1:对称加密:
工具:
openssl enc, gpg
算法:3des, aes, blowfish, twofish
2:enc命令:
帮助:man enc
加密:openssl enc -e -des3 -a -salt -in testfile-out testfile.cipher
(-e加密 -des3=3DES 对称秘钥的加密算法; -a=bese64编码 -salt加盐,盐就是随机数
解密:openssl enc -d -des3 -a -salt –in testfile.cipher-out testfile
eg:[root@centos7 ~/data]# openssl enc -e -des3 -a -salt -in fstab -out fstab.des3
[root@centos7 ~/data]# openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab.des2
openssl ?
3:单向加密:
工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst
4:dgst命令:
帮助:man dgst
openssl dgst -md5
[-hex默认] /PATH/SOMEFILE
openssl dgst -md5 testfile
md5sum /PATH/TO/SOMEFILE
eg:[root@centos7 ~/data]# openssl dgst sha1 fstab
sha1: No such file or directory
MD5(fstab)= ea10eb7312d3130f651eef33b184e79f
[root@centos7 ~/data]# openssl dgst -sha1 fstab
SHA1(fstab)= 69f52e22db64aaec6131513ff9fcb41791d80e80 16进制数
[root@centos7 ~/data]# sha1sum fstab
69f52e22db64aaec6131513ff9fcb41791d80e80 fstab 16进制数
5:MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现
网络通信中保证所传输数据的完整性机制
CBC-MAC
HMAC:使用md5或sha1算法
6:生成用户密码:
passwd命令:
帮助:man sslpasswd
openssl passwd -1 -salt SALT(最多8位) # -1是基于MD5加密算法
openssl passwd -1 –salt centos
eg:[root@centos7 ~/data]# openssl passwd -1 #只要定义了盐,那么相同的口令生成密码一样
Password:
Verifying - Password:
$1$pfpVILIm$LV0tZ2Htptke5GHCKi0wi.
[root@centos7 ~/data]# openssl passwd -1 -salt pfpVILIm
Password:
$1$pfpVILIm$LV0tZ2Htptke5GHCKi0wi.
7:生成随机数:
帮助:man sslrand
openssl rand -base64|-hex NUM
eg:[root@centos7 ~/data]# openssl rand -base64 9
xTZ4ZCM5s41M
[root@centos7 ~/data]# openssl rand -base64 20
OTVrh/ZyOx3MaorxPfrdd6v+SUg=
生成8位只需要大小写字母,数字,其余过滤
Pm41SKzy[root@centos7 ~/data]# openssl rand -base64 20 |tr -d '+/=' |head -c8
NUM: 表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出
现的字符数为NUM*2
eg:创建10个账号,每个账号有随机口令
1:for i in {1..10};do useradd user$i;passwd=`openssl rand -base64 20 |tr -d '+/=' |head -c8`;echo $passwd |passwd --stdin user$i &> /dev/null;done
:2:getent passwd 查看创建的用户
3:[root@centos7 ~]# getent shadow 查看口令
4:[root@centos7 ~]# for i in {1..10};do userdel -r user$i;done 删除创建
8:公钥加密:
算法:RSA, ELGamal
工具:gpg, openssl rsautl(man rsautl)
9:数字签名:
算法:RSA, DSA, ELGamal
10:密钥交换:
算法:dh
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA
11:生成密钥对儿:man genrsa
生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS(-out后面跟上生成的文件径)
(umask 077; openssl genrsa –out test.key –des 2048) ( –des 2048对私钥进行加密)
openssl rsa
-in test.key –out test2.key 将加密key解密 取消口令
eg:openssl genrsa -out test2.key -des 1024 加密完要输入口令,如果不想每次都输口令,则
改变权限,如:[root@centos7 /data]# ( umask 066 ; openssl genrsa -out test4.key 1024 )
结果: -rw-------. 1 root root 887 Jul 10 03:41 test4.key #加括号相当于开启了字shall,执行
完后,umask不会变
从私钥中提取出公钥
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
openssl rsa –in test.key –pubout –out test.key.pub
eg:[root@centos7 /data]# openssl rsa -in test3.key -pubout -out test3.pubkey
writing RSA key
随机数生成器:伪随机数字
键盘和鼠标,块设备中断
/dev/random:仅从shang熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
eg:[root@centos7 /data]# cat /dev/urandom |tr -dc 'a-zA-Z0-9' |head -c8
12:PKI:Public Key Infrastructure (互联网付费CA)
CA
RA
CRL
证书存取库
建立私有CA:
OpenCA
openssl
证书申请及签署步骤:
1、生成申请请求
2、RA核验
3、CA签署
4、获取证书
实验:centos模拟创建CA和申请证书
总流程:
1、创建所需要的文件
touch /etc/pki/CA/index.txt 生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号
2、 CA自签证书,在centos7中生成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、颁发证书
A 在需要使用证书的主机生成证书请求,在centos6上充当客户端申请证书
给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
B 将证书请求文件传输给CA
C CA签署证书,并将证书颁发给请求者
openssl ca -in /tmp/test.csr –out /etc/pki/CA/certs/test.crt -days 365
注意:默认国家,省,公司名称三项必须和CA一致
D 查看证书中的信息:
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信息,对比检验是否与index.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
跳过第一步,先执行第二步,看看它会如何报错,具体步骤如下
① centos7模拟web服务器,生成密钥并加密,这样权限也就设置的比较严格
② 利用上面生成的私钥生成一个自签名的证书
③ centos6模拟客户端去向centos7申请证书
④ 利用私钥文件生成请求文件,一般以.csr后缀,默认国家、省会和公司必须和CA一致
⑤ 把请求文件放到CA证书存放路径(也就是把请求文件从centos6传到centos7)
⑥ CA审核请求,并颁发证书(会有报错情况,因为我们开始时跳过了第一步)、
根据报错,创建index.txt文件,发现依旧报错,缺少serial文件
⑦ 创建seiral文件,文件齐全,无报错情况,再执行审核命令,证书颁发成功
看一下数据库,出现证书信息
这次用编号10,下个证书编号是11,如果用了99,则下一个9A而不会是100,到此证书颁发完毕
⑧ 把颁发好的证书传给客户端centos6,让它使用
切换至客户端,这时已经收到证书了
查看证书部分内容
查看证书状态
SSH 服务
1:ssh: secure shell, protocol, 22/tcp,
安全的远程管理,远程连接,系统默认自带的服务
# client/server :客户端主动连接服务端时,服务器端的地址一般是固定不变的
# socket:套接字 标识应用唯一地址 实际上是tcp/udp 的端口号+ip
# http tcp/80 ssh tcp/22
2:具体的软件实现:
OpenSSH: ssh协议的开源实现,CentOS默认安装
dropbear:另一个开源实现
3:SSH协议版本
v1: 基于CRC-32做MAC,不安全;man-in-middle
v2:双方主机协议选择安全的MAC方式
基于DH算法做密钥交换,基于RSA或DSA实现身份认证
4:两种方式的用户登录认证:
基于password
基于key
Openssh软件组成
OpenSSH介绍
相关包:
openssh
openssh-clients 客户端
openssh-server 服务器端 user/sbin/sshd
工具:
基于C/S结构
Client: ssh, scp, sftp,slogin
Windows客户端:
xshell, putty, securecrt, sshsecureshellclient
Server: sshd
ssh客户端
1 客户端组件:
2 ssh, 配置文件:/etc/ssh/ssh_config
Host PATTERN
StrictHostKeyChecking no 首次登录不显示检查提示
3 格式:ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
4 常见选项
-p port:远程服务器监听的端口
-b:指定连接的源IP
-v:调试模式
-C:压缩方式
-X: 支持x11转发
-Y:支持信任x11转发
ForwardX11Trusted yes
-t: 强制伪tty分配
ssh -t remoteserver1 ssh remoteserver2
5:允许实现对远程系统经验证地加密安全访问
6:当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub
(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
ssh服务登录验证
ssh服务登录验证方式:
用户/口令
基于密钥
基于用户和口令登录验证
1 客户端发起ssh请求,服务器会把自己的公钥发送给用户
2 用户会根据服务器发来的公钥对密码进行加密
3 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则
用户登录成功
ssh服务登录验证
基于密钥的登录方式
1 首先在客户端生成一对密钥(ssh-keygen)
2 并将客户端的公钥ssh-copy-id 拷贝到服务端
3 当客户端再次发送一个连接请求,包括ip、用户名
4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP
和用户,就会随机生成一个字符串,例如:acdf
5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的
字符串发送给服务端
7服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,
就允许免密码登录
基于key认证
基于密钥的认证:
(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
基于key认证
(5)重设私钥口令:
ssh-keygen –p
(6)验证代理(authentication agent)保密解密后的密钥
• 这样口令就只需要输入一次
• 在GNOME中,代理被自动提供给root用户
• 否则运行ssh-agent bash
(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服务实现安全的文件上传和下载
使用ls cd 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命令
pscp.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 递归复制目录
将本地curl.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.PSSH命令
pslurp.pssh功能是将远程主机的文件批量复制到本地
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] [-L localdir]
remote local(本地名)
Pslurp-pssh选项
-L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
-r 递归复制目录
批量下载目标服务器的passwd文件至/app下,并更名为user
pslurp -H 192.168.1.10 -L /app/ /etc/passwd user
SSH端口转发
SSH端口转发
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH
还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的
加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为
其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,
LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文
传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是
允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
加密 SSH Client 端至 SSH Server 端之间的通讯数据
突破防火墙的限制完成一些之前无法建立的 TCP 连接
SSH端口转发
本地转发:
-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
SSH端口转发
远程转发:
-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
SSH端口转发
动态端口转发:
当用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@remotehost gedit
remotehost主机上的gedit工具,将会显示在本机的X服务器上
传输的数据将通过ssh连接加密
ssh服务器
服务器端:sshd, 配置文件: /etc/ssh/sshd_config
常用参数:
Port
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes
StrictModes yes 检查.ssh/文件的所有者,权限等
MaxAuthTries 6
MaxSessions 10 同一个连接最大会话
PubkeyAuthentication yes
PermitEmptyPasswords no
PasswordAuthentication yes
常用参数
GatewayPorts no
ClientAliveInterval:单位:秒
ClientAliveCountMax:默认3
UseDNS yes
GSSAPIAuthentication yes 提高速度可改为no
MaxStartups 未认证连接最大值,默认值10
Banner /path/file
限制可登录用户的办法:
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroups
ssh服务的最佳实践
建议使用非默认端口
禁止使用protocol version 1
限制可登录用户
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址
基于口令认证时,使用强密码策略
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志
编译安装dropbear示例
ssh协议的另一个实现:dropbear
源码编译安装:
• 1、安装开发包组:yum groupinstall “Development tools”
• 2、下载dropbear-2017.75.tar.bz2
• 3、tar xf dropbear-2017.75.tar.bz2
• 4、less INSTALL README
• 5、./configure
• 6、make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert
scp"
• 7、make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert
scp" install
dropbear
启动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 -t dss -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
• AIDE(Advanced Intrusion Detection Environment)
• 高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机
上的那些文件被更改过了。
• AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE数据库
能够保存文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、
所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间
(ctime)、最后访问时间(atime)、增加的大小以及连接数。AIDE还能够使用下列算法:
sha1、md5、rmd160、tiger,以密文形式建立每个文件的校验码或散列号.
• 这个数据库不应该保存那些经常变动的文件信息,例如:日志文件、邮件、/proc文件
系统、用户起始目录以及临时目录.
AIDE
安装
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
AIDE
初始化默认的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包
• man 5 sudoers
• sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使
用 sudo,会提示联系管理员
• sudo可以提供日志,记录每个用户使用sudo操作
• sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限
和使用的主机
• sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入
场券”
• 通过visudo命令编辑配置文件,具有语法检查功能
visudo –c 检查语法
visudo -f /etc/sudoers.d/tes
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
sudo示例
示例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
sudo示例
示例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
wang ALL=(tom,jerry) ALL
示例6
wang 192.168.175.136,192.168.175.138=(root) /usr/sbin/,!/usr/sbin/useradd
示例7
wang 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介绍
作者:Wieste Venema,IBM,Google
工作在第四层(传输层)的TCP协议
对有状态连接的特定服务进行安全检测并实现访问控制
以库文件形式实现
某进程是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对
libwrap进行编译的
判断服务程序是否能够由tcp_wrapper进行访问控制的方法:
ldd /PATH/TO/PROGRAM|grep libwrap.so
strings PATH/TO/PROGRAM|grep libwrap.so
TCP_Wrappers的使用
配置文件:/etc/hosts.allow, /etc/hosts.deny
帮助参考:man 5 hosts_access,man 5 hosts_options
检查顺序:hosts.allow,hosts.deny(默认允许)
注意:一旦前面规则匹配,直接生效,将不再继续
基本语法:
daemon_list@host: client_list [ :options :option… ]
Daemon_list@host格式
单个应用程序的二进制文件名,而非服务名,例如vsftpd
以逗号或空格分隔的应用程序文件名列表,如:sshd,vsftpd
ALL表示所有接受tcp_wrapper控制的服务程序
主机有多个IP,可用@hostIP来实现控制
如:in.telnetd@192.168.0.254
TCP_Wrappers的使用
客户端Client_list格式
以逗号或空格分隔的客户端列表
基于IP地址:192.168.10.1 192.168.1.
基于主机名:www.magedu.com .magedu.com 较少用
基于网络/掩码:192.168.0.0/255.255.255.0
基于net/prefixlen: 192.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
示例
示例:只允许192.168.1.0/24的主机访问sshd
/etc/hosts.allow
sshd: 192.168.1.
/etc/hosts.deny
sshd :ALL
示例:只允许192.168.1.0/24的主机访问telnet和vsftpd服务
/etc/hosts.allow
vsftpd,in.telnetd: 192.168.1.
/etc/host.deny
vsftpd,in.telnetd: ALL
TCP_Wrappers的使用
[:options]选项:
帮助:man 5 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: 172.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放入Tcp Wrapper的黑名单中予以禁止防问
PAM认证机制
PAM:Pluggable Authentication Modules
认证库:文本文件,MySQL,NIS,LDAP等
Sun公司于1995 年开发的一种与认证相关的通用框架机制
PAM 是关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统
一的API,将系统提供的服务和该服务的认证方式分开
使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无
需更改服务程序
一种认证框架,自身不做认证
PAM认证机制
它提供了对所有服务进行认证的中央机制,适用于login,远程登录
(telnet,rlogin,fsh,ftp,点对点协议(PPP)),su等应用程序中。系统管理员
通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过
在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服
务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供
PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则
读取配置文件,将应用程序和相应的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认证过程:
1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,
这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻
/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验
证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果
决定下一个动作(重新输入密码或者通过验证)
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 用来传递给该模块的参数
PAM认证机制
模块类型(module-type)
Auth 账号的认证和授权
Account 与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个
服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户
的位置(例如:root用户只能从控制台登录)
Password 用户修改密码时密码复杂度检查机制等功能
Session 用户获取到服务之前或使用服务完成之后需要进行一些附加的操作,
如:记录打开/关闭数据的信息,监视目录等
-type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是
安装在系统上的模块有用
PAM认证机制
Control:
PAM库如何处理与该服务相关的PAM模块成功或失败情况
两种方式实现:
简单和复杂
简单方式实现:一个关健词实现
required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该
模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所
有模块全部执行完毕再将失败结果返回给应用程序。即为必要条件
PAM认证机制
requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返
回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程
序。是一个必要条件
sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执
行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件
optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,
其返回值一般被忽略
include: 调用其他的配置文件中定义的配置信息
PAM认证机制
复杂详细实现:使用一个或多个“status=action”
[status1=action1 status2=action …]
Status:检查结果的返回状态
Action:采取行为 ok,done,die,bad,ignore,reset
ok 模块通过,继续检查
done 模块通过,返回最后结果给应用
bad 结果失败,继续检查
die 结果失败,返回失败结果给应用
ignore 结果忽略,不影响最后结果
reset 忽略已经得到的结果
PAM认证机制
module-path: 模块路径
相对路径:
/lib64/security目录下的模块可使用相对路径
如:pam_shells.so、pam_limits.so
绝对路径:
模块通过读取配置文件完成用户对系统资源的使用控制
/etc/security/*.conf
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
Arguments 用来传递给该模块的参数
pam文档说明
/user/share/doc/pam-*
rpm -qd pam
man –k pam_
man 模块名 如man rootok
《The Linux-PAM System Administrators' Guide》
PAM模块示例
模块:pam_shells
功能:检查有效shell
man pam_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
PAM模块示例
模块: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
PAM模块示例
模块:pam_nologin.so
功能:
如果/etc/nologin文件存在,将导致非root用户不能登陆
如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin文件内
容,并拒绝登陆
PAM模块示例
模块:pam_limits.so
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,
可运行的进程数量,可用内存空间
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存
-n 最多的打开的文件描述符个数
-u 最大用户进程数
-S 使用 soft(软)资源限制
-H 使用 hard(硬)资源限制
(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
配置文件:每行一个定义;
<domain> <type> <item> <value>
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 不能运行超过20个进程
练习
1、限制centos用户只能够在工作时间通过ssh远程连接本机
2、限制只有admins组内的用户可ssh到本机
实验:expect 实现批量的ssh-key
[root@centos6 ~]#cat hostlist.txt
192.168.30.7 root centos
192.168.30.17 root magedu
[root@centos6 ~]#cat pushkey.sh
#!/bin/bash
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &> /dev/null && echo "Ssh key is created"
while read line;do
ip=`echo $line|awk '{print $1}'`
user=`echo $line|awk '{print $2}'`
password=`echo $line|awk '{print $3}'`
expect <<-EOF
set timeout 50
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect eof
EOF
echo "$ip is finished"
done < hostlist.txt
实验:分析ssh连接日志
awk '/Failed password/{ip[$(NF-3)]++}END{for(i in ip){if(ip[i]>5){system("iptables -A INPUT -s " i " -j REJECT")}}}' /var/log/secure
实验:ssh端口转发
-L
-R
-D
实验:aide实现安全监控
实验:sudo 通配符*的安全漏洞
wang ALL=(ALL) /bin/cat /var/log/messages*