ssh(secure shell)是一个协议,监听在tcp的22号端口,提供安全的远程登录,openSSH是ssh协议的开源实现,另外dropbear也是ssh协议的开源实现,常在嵌入式环境中使用。
telnet也是一个远程登录协议,监听在tcp的23号端口,telnet没有加密功能,都是明文发送
ssh有两个版本,v1和v2,目前主要使用的v2版本,v1版本不安全,容易收到中间人攻击
- v1: 基于CRC-32做MAC(消息认证码),不安全,容易受到man-in-middle攻击
- v2:双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA算法实现身份认证,客户端通过检查服务器端的主机密钥来判断是否能够继续通信
ssh协议支持两种方式进行用户登录认证:基于password和基于key的认证
OpenSSH 是一组用于安全地访问远程计算机的连接工具。 它可以作为 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。 更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。OpenSSH 由 OpenBSD project 维护。
登录过程和使用 rlogin 或 telnet 建立的会话非常类似。 在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。 只有在第一次连接时, 用户会被要求输入 yes。 之后的连接将会验证预先保存下来的密钥指纹。 如果保存的指纹与登录时接收到的不符, 则将会给出警告。 指纹保存在 ~/.ssh/known_hosts 中, 对于 SSH v2 指纹, 则是 ~/.ssh/known_hosts2。
默认情况下, 较新版本的 OpenSSH 只接受 SSH v2 连接。 如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。 此外, 也可以通过命令行参数 -1 或 -2 来相应地强制使用版本 1 或 2。 保持客户端的版本 1 能力是为了考虑较早版本的兼容性。
OpenSSH的客户端使用ssh程序,服务端使用sshd程序。在客户端还有其他的程序如scp和sftp,在windows中,还有xshell、putty、securecrt、sshsecureshellclient等客户端
ssh客户端的配置文件在/etc/ssh/ssh_config
ssh客户端程序的一般使用格式:ssh [user@]host [COMMAND]
-p 指明远程服务器监听的端口
-X 启用X11转发
-Y 支持信任的x11转发
基于密钥的方式登录远程主机
(1)生成密钥对:ssh-keygen -t rsa
(2)把生成的公钥传输至远程服务器对应用户的家目录ssh-copy-id [-i [identity_file]] [user@machine]
(3)测试
scp命令是一个跨主机的复制命令,基于ssh协议,scp的一般使用格式scp [options] SRC... DEST/
- PUSH:源文件在本机,目标为远程
scp [options] /PATH/FROM/SOMEFILE [user@]host:/PATH/TO/SOMEWHERE
- PULL:源文件在远程,本地为目标
scp [options][user@]host:/remote/file /PATH/TO/SOMEWHERE
-r: 递归复制;
-p: 保持原文件的属性信息,包括mode和timestamp
-q: 静默模式
-P PORT: 指明remote host的监听的端口;
sftp是基于ssh的ftp服务,一般格式为sftp USERNAME@HOST
ssh服务端的配置文件在/etc/ssh/sshd_config,服务脚本在/etc/rc.d/init.d/sshd,脚本配置文件:/etc/sysconfig/sshd
在ssh的配置文件中,注释的行实际也是生效的,生效的是默认配置
为了安全起见,不要让ssh监听在默认的端口上,所以建议修改默认的端口,还需要修改的有LinstenAddress,只监听企业内部的网络,另外也不要允许root用户直接登录
ssh服务的最佳实践:
1、不要使用默认端口;
2、禁止使用protocol version 1;
3、限制可登录用户;
白名单使用AllowUsers user1 user2 ...或AllowGroups grp1 grp2...
黑名单使用DenyUsers或DenyGroups
4、设定空闲会话超时时长;
ClientAliveInterval 300
ClientAliveCountMax 0
5、利用防火墙设置ssh访问策略;
6、仅监听特定的IP地址;
7、基于口令认证时,使用强密码策略;tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
8、使用基于密钥的认证;
9、禁止使用空密码;
10、禁止root用户直接登录;
11、限制ssh的访问频度和并发在线数;
12、做好日志,经常分析;
证书申请及签署步骤:
1、生成申请请求
2、RA核验
3、CA签署
4、获取证书
openssl作为CA的配置文件在/etc/pki/tls/openssl.cnf
(1)创建所需要的文件
# touch index.txt
# echo 01 > serial
(2)CA自签证书
生成私钥文件
# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
提取公钥文件证书
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.epm -days 7300 -out /etc/pki/CA/cacert.pem
-new: 生成新证书签署请求;
-x509: 专用于CA生成自签证书;
-key: 生成请求时用到的私钥文件;
-days n:证书的有效期限;
-out /PATH/TO/SOMECERTFILE: 证书的保存路径;
(3)发证
(a) 用到证书的主机生成证书请求;
# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
# openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out /etc/httpd/ssl/httpd.csr
(b) 把请求文件传输给CA; (c) CA签署证书,并将证书发还给请求者;
# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看证书中的信息:
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|-subject|-serial
(4) 吊销证书
(a) 客户端获取要吊销的证书的serial
# openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
(b) CA 先根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致;
吊销证书:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
(c) 生成吊销证书的编号(第一次吊销一个证书)
# echo 01 > /etc/pki/CA/crlnumber
(d) 更新证书吊销列表
# openssl ca -gencrl -out thisca.crl
查看crl文件:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text