PKI:Public Key Infrastucture
openssl: 套件,开源程序
libcrypto通用功能的加密库
libssl用于实现TLS/SSL的功能
openssl多功能命令行工具
openssl可用于:生成密钥、创建数字证书、手动加密解密数据
加密解密技术常用的功能及算法:
对称加密:(用于加密数据)
算法:DES, 3DES, AES, Blowfish, Twofish, RC6, CAST5
工具:gpg, openssl enc
# openssl enc -des3 -a -salt -in /path/to/input_file -out /path/to/cipher_file
# openssl enc -d -des3 -a -salt -in /path/to/cipher_file -out /path/to/clear_file
单向加密:(抽取数据特征码,用于验证数据的完整性)
特性:
One-Way
Collision-free
算法:
md5128bits
sha1160bits
sha512512bits
工具:sha1sum, md5sum, cksum, openssl dgst
# openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-out filename] /path/to/somefile
MAC: 消息摘要码,单向加密的延伸应用(在单向加密的基础上再对抽取的数据特征码进行加密)
应用:用于实现在网络通信中保证所传输的数据完整性;
机制:
CBC-MAC
HMAC:使用md5和sha1算法;
用户认证:
工具:passwd, openssl passwd
# openssl passwd -1
公钥加密:公钥加密、私钥解密
密钥对儿:
公钥:pkey
私钥:skey
算法:RSA, EIGamal
工具:gpg, openssl rsautl
数字签名:私钥加密、公钥解密
算法:RSA, EIGamal, DSA
DSA: Digital Signature Algorithm
DSS: Digital Signature Standard
密钥交换:IKE
算法:DH, 公钥加密
Diffie-Hellman
数字证书:
证书格式:x509、pkcs
x509格式:
公钥和有效期限;
持有者的个人合法身份信息;(主机名)
证书的使用方式;
CA的信息;
CA的数字签名;
谁给CA发证:自签署证书
配置文件:/etc/pki/tls/openssl.cnf
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept CA工作目录
certs = $dir/certs # Where the issued certs are kept 签署证书存放目录
crl_dir = $dir/crl # Where the issued crl are kept 吊销列表存放目录
database = $dir/index.txt # database index file. 索引数据库
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs. 新证书存放目录
certificate = $dir/cacert.pem # The CA certificate CA自签署证书
serial = $dir/serial # The current serial number 证书的序列号
crlnumber = $dir/crlnumber # the current crl number 吊销列表的序列号
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL 正用吊销列表
private_key = $dir/private/cakey.pem# The private key CA自己的私钥
RANDFILE = $dir/private/.rand # private random number file 随机数文件
x509_extensions = usr_cert # The extentions to add to the cert
用openssl实现私有CA:
生成密钥对儿:
# (umask 077; openssl genrsa -out private/cakey.pem 2048)
如果想查看公钥:
# openssl rsa -in private/cakey.pem -pubout -text
生成自签证书:
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
创建需要的文件:
# touch index.txt serial crlnumber
用openssl实现证书申请:
在主机上生成密钥,保存至应用此证书的服务的配置文件目录下, 例如:
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out httpd.key 1024)
生成证书签署请求:
# openssl req -new -key httpd.key -out httpd.csr
将请求文件发往CA;
CA签署证书:
签署:
# openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days DAYS
将证书传回请求者
吊销证书:
# openssl ca -revoke /path/to/somefile.crt
openssl: 多用途的命令行工具
标准命令:enc, dgst, genrsa, rsautl, req, ca, rsa, passwd
speed: 基准性能测试工具
version:版本查看
s_client:SSL/TLS client program
rand: 生成伪随机数
# openssl rand -hex #
ssl:
NetScape 网景
Secure Socket Layer
SSLv2, SSLv3
TLS: Transport Layer Security
TLSv1
http --> https
ldap --> ldaps
ftp --> ftps
smtp --> smtps
pop3 --> pop3s
imap --> imaps
openssl补充材料:
openssl中有如下后缀名的文件
.key格式:私有的密钥
.crt格式:证书文件,certificate的缩写
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
常用证书协议
x509v3: IETF的证书标准
x.500:目录的标准
SCEP: 简单证书申请协议,用http来进行申请,数据有PKCS#7封装,数据其实格式也是PKCS#10的
PKCS#7: 是封装数据的标准,可以放置证书和一些请求信息
PKCS#10: 用于离线证书申请的证书申请的数据格式,注意数据包是使用PKCS#7封装这个数据
PKCS#12: 用于一个单一文件中交换公共和私有对象,就是公钥,私钥和证书,这些信息进行打包,加密放在存储目录中,CISCO放在NVRAM中,用户可以导出,以防证书服务器挂掉可以进行相应恢复。思科是.p12,微软是.pfx
ssh: Secure SHell
监听tcp协议的22号端口
ssh文本协议:字符通信
sshv1, sshv2
由于sshv1是基于CRC-32做MAC,因此,不安全,建议勿用;
sshv2基于双方主机协商选择最安全的MAC实现机制;
加密机制及MAC机制是双方协商选定;
基于DH实现密钥交换,基于RSA或DSA实现身份认证;
客户通过检查服务端的主机密钥来判定是否与其进一步通信;
OpenSSH (C/S)
Server: 程序(服务)监听tcp:22
Client: 程序
Windows客户端:xmanager(xshell)、SecureCRT、putty、sshshellclient
openssh客户端组件:
ssh:
ssh Username@HOST [COMMAND]
ssh -l Username HOST [COMMAND]
-p PORT: 指定要连入端口;
ssh认证机制:
基于口令
基于密钥
客户端在本地生成一对密钥;
客户端将公钥复制到服务端,要登录的用户的家目录下的隐藏目录.ssh中的一个名为authorized_keys或authorized_keys2文件中
配置过程:
1、生成密钥对儿
# ssh-keygen -t rsa
生成的密钥默认保存至当前用户家目录下的.ssh目录的id_rsa文件中,公钥在id_rsa.pub文件中
2、复制密钥至远程主机
# ssh-copy-id [-i /path/to/pubkey_file] Username@HOST
scp: 类cp命令,基于ssh协议跨主机复制
scp SRC1 SRC2 ... DEST
分两种情况:
1、源文件在本机,目标为远程
# scp /path/to/somefile ... Username@HOST:/path/to/somewhere
2、源文件在远程,目标为本机
# scp Username@HOST:/path/to/somefile /path/to/somewhere
-r: 源文件为目录时使用,以实现递归复制
-p: 保留源文件的复制及修改时间戳,以及权限;
-q: 静默模式
-P PORT:指定服务端端口;
sftp: 是基于ssh的ftp协议
只要OpenSSH的服务器端配置文件中启用了如下项:
Subsystemsftp/usr/libexec/openssh/sftp-server
用法:# sftp [username@]HOST
服务器端:sshd
配置文件:/etc/ssh/sshd_config
服务脚本:/etc/rc.d/init.d/sshd
脚本配置文件:/etc/sysconfig/sshd
各配置参数:# man sshd_config
Port
ListenAddress: IP
Protocol
PermitRootLogin
AllowUsers user1,user2,...: 用户白名单
AllowGroups
DenyUsers : 用户黑名单
使用SSH的最佳实践:
1、Only Use SSH Protocol 2
2、Limit Users' SSH Access
AllowUsers root vivek jerry
白名单
DenyUsers saroj anjali foo
黑名单
3、Configure Idle Log Out Timeout Interval
ClientAliveInterval 300
ClientAliveCountMax 0
设定空闲会话超时时长;
4、Firewall SSH Port # 22
使用iptables设置ssh服务安全访问策略;
5、Change SSH Port and Limit IP Binding
Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
勿使用默认22端口;
6、Use Strong SSH Passwords and Passphrase
genpasswd() {
local l=$1
[ "$l" == "" ] && l=20
tr -dc A-Za-z0-9_ < /dev/urandom | head -c ${l} | xargs
}
使用足够长、足够复杂的密码,且定期更换;
7、Use Public Key Based Authentication
使用公钥认证
8、Disable Empty Passwords
9、Thwart SSH Crackers (Brute Force Attack)
google: ssh best practice
10、 Rate-limit Incoming Port # 22 Connections
限制ssh访问频度;
11、Use Log Analyzer
记录好日志,经常做日志分析;
用户登录信息获取:
/var/log/wtmp:用户成功登录的日志信息
last
/var/log/btmp: 用户登录尝试失败的日志信息
lastb
lastlog: 每个用户最近一次成功登录的信息;
bash编程的信号捕获:
kill -l
KILL无法捕捉;
trap 'COMMAND' SIGNAL,
信号捕捉用于:在中途中止时做一些清理操作;
使用示例:
#!/bin/bash
#
trap 'echo "quit"; exit 5' INT
for i in {1..254}; do
if ping -w 1 -c 1 172.16.254.$i &> /dev/null; then
echo "172.16.254.$i is up."
else
echo "172.16.254.$i is down."
fi
done