一般端口号小于1023的进程只有管理员有权限运行,因为很多都是与外部程序进行通信的进程,这类进程很容易收到网络攻击。所以这类程序一般都是由管理启动,再切换给普通用户;或者使用chroot给其显示权限和活动范围。
OpenSSH:
ssh:secure shell,protocol (协议), 监听于tcp/22,提供安全的远程登录功能。
openssh:ssh协议的开源实现。
服务器端进程构建C/S架构终端,服务器端能够接受客户端基于网络发来的数据包。
早期使用telnet实现,
telnet:服务器端运行telnet server,客户端运行telnet程序。二者可以基于telnet协议进行通信。tcp/23。telnet没有加密功能,意味着我们登录程序时输入的帐号和密码都是明文发送的。
后来使用ssh协议实现
如何再linux主机上使用telnet:
服务器端程序:
[root@server1 ~]# yum install telnet-server
启动telnet
[root@server1 ~]# chkconfig telnet on
[root@server1 ~]# /etc/init.d/xinetd restart
使用chkconfig --list 可以看到如下内容
xinetd是超级守护进程,其它为瞬时守护进程。
客户端程序
[root@server2 ~]# yum install telnet
使用客户端去连接服务端
[root@server2 ~]# telnet 172.25.44.1 这里会让我们使用户和密码进行登录,由于telnet是明文的,不能加密,所以不可以使用管理员身份去登录
所以我们在服务端创建以个普通用户gentoo
[root@server1 ~]# useradd gentoo
[root@server1 ~]# passwd gentoo
在客户端使用此普通用户身份去登录就可以成功登录了
SSH协议:
客户端生成一对密钥,将生成的公钥放在要登录用户的家目录下的.ssh目录下,客户端要登录,它把公钥拿出来看客户端能不能解密,能解密,则身份通过认证,不发送密码直接就登录了。
由两种用户认证方式:基于password、基于key。
OPenssh:
C/S
C:linux:ssh,scp,sftp。
windows客户端:xshell,putty
S:sshd
客户端组件:ssh,配置文件:/etc/ssh/ssh_config
服务端组件:sshd 配置文件:/etc/ssh/sshd_config
格式:ssh [user@] host [COMMAND] 或 ssh [-l user] host [COMMAND]
-p port
省略用户表示以当前系统所处用户身份去登录。
例如我们修改sshd监听端口为1234
[root@server2 ~]# vim /etc/ssh/sshd_config
Port 1234
重启服务使其生效
然后再使用客户端连接时就要指明端口了
客户端如何生成一对密钥:
ssh-keygen:会交互
不使用交互
-t rsa 使用rsa这种加密方式
-P ‘ ‘ 密码为空
-f ‘/path ‘将生成的密钥保存在哪
将公钥传输至远程服务器对应用户的家目录
你想要登录对方的哪个用户后面就跟哪个用户
公钥保存在.ssh/authorized_keys里
scp 常用选项:
-r:递归复制
-p:保持源文件的属性信息
-q:静默模式
-P port:指明remote host的端口
sftp命令:
sftp [user@]host
服务端:
sshd:配置文件 /etc/ssh/sshd_config
常用参数:
Port #;
ListenAddress ip:监听哪些地址
PereitRootLogin
限制可登陆用户:AllowUsers ,AllowGroups
ssh服务的最佳实践:
1、不要使用默认端口
2、禁止使用protocol version 1:
3、限制可登陆用户
4、设置空闲会话超时时长
5、利用防火墙设置ssh的访问策略
6、仅监听特定ip地址
7、基于口令认证,使用强密码策略
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
8、使用基于密钥的认证
9、禁止使用空密码
10、禁止root用户直接登录
11、显示ssh访问频度和并发在线数
12、做好日志,经常分析
OpenSSL:ssl协议的实现
密码算法和协议:
-
对称加密:加密时使用的密钥与解密是所用的密钥相同。
特性: 1、加密解密使用同一密钥; 2、将原始数据分割成固定大小的块逐个进行加密; 缺陷: 1、密钥过多 2、密钥分发过程中可能会被截获
-
公钥加密:密钥成对出现。
公钥:公开给所有人 ,pubkey 私钥:自己留存,必须保证其私密性,secret key 特性:使用公钥加密的数据,只能使用与之配对的私钥解密;反之,使用私钥加密的也只能使用与之配对的公钥进行解密。 用途: 数字签名:主要用于接收方认证发送方的身份。(A给B发数据,为了让B确信这个数据确实是A发的,而不是其它人) A向B发数据,将自己的公钥给B,B拿到公钥能解密则就确信这时来自于A的主句,但公钥在发送途中可能会被C截获,C再做一个伪装,将自己的公钥给B。这是极其不安全的。CA:证书颁发机构。证书里面有公钥。 密钥交换:A给B发数据,A用B的公钥加密一个对称密钥,并发送给B 数据加密
-
单向加密:只能加密,不能解密;提取数据特征码
特性:定长输出、雪崩效应 算法:md5 128bits,shal 160bits等 功能:保证数据完整性
-
认证协议
-
整个发送过程
A想给B发邮件,A使用单向加密算法提取此邮件数据的特征码,用自己的私钥密码此特征码并附加再文件后面,A再使用对称加密算法加密整个数据。然后A再使用B的公钥加密这个对称密钥。
然后将整个数据发送给B
A使用自己私钥解密数据,然后再借助于解密算法解密对称加密,然后就得到加密特征码和明文数据,然后用A的公钥解密的特征码,然后再用同样的算法计算这个明文数据的特征码。
用A的公钥能解密特征码证明确实是A发送的,如果B自己计算出来的特征码与A发过来的特征码相同,则证明文件是完整的,在传输途中没有变动过。
密钥交换:IKE
公钥加密:
DH(Deffie-Hellman)
PKI:Public Key Infrastructure
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
X.509:定义了证书结构以及认证协议标准
版本号:
序列号:
签署算法ID
发行者名称
有效期限
主体名称
主体公钥
发行者唯一标识
主体唯一标识
扩展信息
发行者签名
web服务器支持https访问,为了建立https会话,服务器会发证书给客户端。
SSL:Secure Socket Layer
其内部使用分层实现:
1、最底层:基础算法原语的实现,aes,rsa,md5
2、向上一层:各种算法的实现
3、再向上一层:组合算法实现的半成品
4、用各种组件拼装而成的种种成品密码学协议软件;
tls,ssh
Linux系统:Openssl,gpg
gpg是pgp协议的实现
三个组件:
openssl:多用途的命令行工具
libcrypto:加密解密库
libssl:库,真正实现了ssl及tsl
SSL会话的建立:
双方建立tcp会话(三次握手),然后建立ssl的握手认证:服务器发送认证给客户端,客户端验证证书(1、用自己本地的发行者的公钥去解密证书,能解密就证明确实是发行者的证书 2、检查证书的主体名称访问的网站名称是否一致3、检查证书的完整性4、检查证书是否在吊销列表中)。做密钥交换。服务器端再用客户端发送的一次性密钥加密响应报文响应给客户端。
openssl命令:
查看openssl的版本号 openssl version
对称加密:
[root@server1 mnt]# man enc
工具:openssl enc,gpg
算法:3des,aes,blowfish,twofish
加密:
-e 算法 -a salt:加点杂质 -in file:对哪个文件加密 -out file:加密后的文件保存在哪
[root@server1 mnt]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:
[root@server1 mnt]# openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
单向加密:
对当前目录下的fstab文件计算特征码
[root@server1 mnt]# openssl dgst -md5 fstab
不同的工具对同一文件使用同一算法得到的结果是一样的
生成用户密码
[root@server1 mnt]# openssl dgst -md5 fstab
生成随机数
openssl rand -base64|-hex #
#:表示字节数
-hex时每个字符4位,出现的字符数为#*2
公钥加密:
加密:
算法:RSA,ELGamal
工具:gpg,openssl rsault
数字签名:
算法:RSA,DSA,ELGamal
密钥交换:
算法:DH
生成密钥对:
创建密钥,120位
从私钥中提取公钥
私钥一般只允许自己可读,所以要修改权限
也可以在创建这样做:
()表示只对子shell(当前命令)生效。可以看到shell环境的umask值依然为0022
随机数生成器:
熵池
/dev/random:仅从熵池中返回随机数,随机数用尽,阻塞
/dev/urandom:从熵池返回随机数,随机数用尽,则利用软件生成伪随机数,非阻塞。
自己私下使用时建立私有CA
OpenCA
Openssl
证书申请及签署步骤
1、生成申请请求;
2、RA核验
3、CA签署
4、获取证书
如何建立私有CA
openssl配置文件:/etc/pki/tls/openssl.cnf
工作目录:
/etc/pki/CA/certs/:存放已签署的CA
/etc/pki/CA/crl/:证书吊销列表
$dir/index.txt:证书索引文件
new_certs_dir = $dir/newcerts:刚签完的证书存放位置
certificate = $dir/cacert.pem :CA自己的证书
private_key = $dir/private/cakey.pem# The private key:CA的私钥
证书都是具有序列号的
serial = $dir/serial # The current serial number #已经了第几个序列号了
crlnumber = $dir/crlnumber :吊销的证书序列号
(1)创建所需要的文件
[root@server1 CA]# touch index.txt
[root@server1 CA]# echo 01 > serial
(2)CA自签证书
生成私钥文件
2048表示私钥长度。
[root@server1 CA]# (umask 007; openssl genrsa > private/cakey.pem 2048)
从私钥中抽取公钥,
-new:生成新证书签署请求
-x509:表示自签,签一般证书时则不需要加此选项,因为除CA外自己给自己签署的证书都是无效的
-key:生成请求时用到的私钥文件
[root@server1 CA]# openssl req -new -x509 -key private/cakey.pem -days 3650 > /etc/pki/CA/cacert.pem
Common Name (eg, your name or your server's hostname) []:server1
此处一定要与服务器dns解析的名字保持一致。
(3)发证书
a、用到证书的主机生成证书请求
b、把请求文件传输给CA
c、CA签署证书,并将证书发回给请求者。
假如server3需要生成证书
(1)[root@server3 ~]# mkdir /etc/httpd/ssl
(2)[root@server3 ~]# cd /etc/httpd/ssl/
生成私钥
[root@server3 ssl]# (uamsk 007; openssl genrsa > httpd.key 1024)
从私钥中抽取公钥并生成证书签署请求请求,生成的文件为.csr文件
[root@server3 ssl]# openssl req -new -key httpd.key -days 365 > httpd.csr
注意:因为这里使用私有CA签发证书,所以这里的Country Name, State or Province Name等都要与私有CA保持一致,否则不被认可。
完成后会生成http.csr文件,http.csr文件为证书签发请求文件
传送证书签发请求文件到私有CA所在服务器
root@server3 ssl]# scp httpd.csr 172.25.44.1:/mnt
核验并签署证书,生成的证书为http.crt
[root@server1 CA]# openssl ca -in /mnt/httpd.csr > /mnt/httpd.crt -days 365
index.txt文件已经生成,在newcerts目录下也生成了证书,其内容与httpd,crt文件一致
将证书发还给客户端
[root@server1 CA]# scp /mnt/httpd.crt server3:/etc/httpd/ssl
查看证书信息
openssl x509 -in httpd.crt -noout -subjice | -text | -serial
吊销证书:
(1)客户端获取要吊销的证书的serial
[root@server3 ssl]# openssl x509 -in httpd.crt -noout -serial
(2)CA端
先根据客户端提交的serial与subject信息,对比检验是否与index.text的信息一致;
吊销证书:
[root@server1 CA]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem
生成吊销证书的编号(CA第一次吊销一个证书时需要这么做)
[root@server1 CA]# echo 01 > /etc/pki/CA/crlnumber
更新证书吊销列表
[root@server1 CA]# openssl ca -gencrl > thisca.crl
查看crl文件:
[root@server1 CA]# openssl crl -in thisca.crl -noout -text