第六十四天 : openssh基础及应用

openSSH

ssh: secure shell, protocol, 22/tcp, 安全的远程登录

OpenSSH: ssh协议的开源实现

dropbear:另一个开源实现

SSH协议版本

v1: 基于CRC-32做MAC,不安全; man-in-middle
v2:双方主机协议选择安全的MAC方式

基于DH算法做密钥交换,基于RSA或DSA实现身份认证

两种方式的用户登录认证:

基于password
基于key

OpenSSH:

C/S

C: ssh, scp, sftp

Windows客户端:
xshell, putty, securecrt, sshsecureshellclient

S: sshd

ssh客户端
客户端组件:
ssh, 配置文件: /etc/ssh/ssh_config

Host PATTERN

StrictHostKeyChecking no 首次登录不显示检查提示

格式:

ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]

-p port:远程服务器监听的端口

201609230846001
-b:指定连接的源IP
-v:调试模式
-C:压缩方式
-X: 支持x11转发
-Y:支持信任x11转发

ForwardX11Trusted yes

-t: 强制伪tty分配

ssh -t remoteserver1 ssh remoteserver240

允许实现对远程系统经验证地加密安全访问

当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub( centos7.0默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会比较两处是否有不
同。

201609230850001在修改了登陆端.ssh/known_host文件中关于服务端的主机密钥后, 再次登陆时报错. 主机的指纹(或者说host_pub_key)作为一个是否是之前连接过的主机的判别标准

201609230914001

基于key认证

基于密钥的认证:

(1) 在客户端生成密钥对
ssh-keygen -t rsa [-P ”] [-f “/root/.ssh/id_rsa”]
#ssh-keygen –t rsa –P ‘’ -f “/root/.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中,代理被自动提供
• 否则运行ssh-agent bash

(7)钥匙通过命令添加给代理
ssh-add

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等指令,可用?获取帮助信息。

sftp [user@]host
sftp> help

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:host:hostport sshserver
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

补充:

  • 在telnet-server端 要修改配置文件/etc/xinetd.d/telnet中的内容,  将disable = yes 修改为 no方可开启23号端口.
  • 补充iptables知识: 拒绝一个IP的访问流量可参考此命令 :

iptables -A INPUT -s 192.168.48.152 -j REJECT

选项:

-f 后台启用
-N 不开远程shell
-g 启用网关功能

远程转发:

ssh -R sshserverport:host:hostport 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
在本机firefox设置代理socket proxy:127.0.0.1:1080
#ssh -D 1080 root@sshserver
X 协议转发
所有图形化应用程序都是X客户程序
• 能够通过tcp/ip连接远程X服务器
• 数据没有加密机,但是它通过ssh连接隧道安全进行

ssh -X user@remotehost gedit
remotehost主机上的gedit工具,将会显示在本机的X服务器上

传输的数据将通过ssh连接加密

ssh服务器

服务器端:

sshd, 配置文件: /etc/ssh/sshd_config

常用参数:

Port 监听端口(修改端口要不修改selinux规则, 要不就禁用selinux, 不然无法实现更改端口, client 使用-p 选项指定端口)
ListenAddress ip (监听IP)
PermitRootLogin yes (最好选no, 不建议使用root直接登陆)
ClientAliveInterval 0
UseDNS yes ( 减少登陆等待时间可选no)

限制可登录用户的办法:

AllowUsers user1 user2 user3 ( 除了定义的用户其他用户都不能登陆)
DenyUsers (定义的用户不能登陆, 如果 Allow和Deny都有的话, Deny优先级高于Allow)
AllowGroups (同AllowUser)
DenyGroups

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、做好日志,经常分析

ssh协议的另一个实现: dropbear

安装准备:

• 1、安装开发包组:
• 2、 ftp://172.16.0.1/pub/Sources/sources/dropbear
• /dropbear-2013.58.tar.bz2

安装:

• 3、 tar xf dropbear-2013.58.tar.bz2,
• 4、 less INSTALL
• 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 #后台运行

(连接之前要先清空防火墙和关闭selinux, 不然会显示连接失败)

201609250935001

客户端访问:

• 14、 ssh -p 2222 root@127.0.0.1
• 15、 dbclient -p 2222 root@127.0.0.1

第六十三天 : openssl加密与安全

安全和加密

加密需要

不加密流量的易受攻击性

• 密码/数据嗅探
• 数据操作
• 验证操作
• 相当于邮寄明信片

不安全的传统协议

• telnet、 FTP、 POP3等等;不安全密码
• http、 smtp、 NFS等等;不安全信息
• Ldap、 NIS、 rsh等等;不安全验证

安全机制

NIST(美国国家标准与技术研究院)定义的安全属性:

保密性:
数据保密性
隐私性
完整性:不可篡改
数据完整性
系统完整性
可用性

安全攻击: STRIDE
Spoofing(假冒)、 Tampering(篡改)、 Repudiation(否
认)、 Information Disclosure(信息泄漏)、 Denial of
Service(拒绝服务)和 Elevation of Privilege(提升权限)

安全机制:

加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证

安全服务:

认证
访问控制
数据保密性
连接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性

设计基本原则

使用成熟的安全系统
以小人之心度输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用安全模式
安全不是似是而非
从STRIDE思考
在入口处检查
从管理上保护好你的系统

Linux系统: OpenSSL, gpg(pgp协议的实现)

对称加密算法

对称加密:加密和解密使用同一个密钥

DES: Data Encryption Standard, 56bits
3DES:
AES: Advanced (128, 192, 256bits)
Blowfish, Twofish 商业加密
IDEA, RC6, CAST5

特性:

1、加密、解密使用同一个密钥,效率高
2、将原始数据分割成固定大小的块,逐个进行加密

缺陷:

1、 密钥过多
2、密钥分发
3、数据来源无法确认

非对称加密算法

公钥加密:密钥是成对出现

公钥:公开给所有人; public key
私钥:自己留存,必须保证其私密性; secret key

特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然

功能:

数字签名:主要在于让接收方确认发送方身份
对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方

数据加密:适合加密较小数据

缺点:密钥长, 加密解密效率低下

算法:

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):
DH:
1、 A: a,p 协商生成公开的整数a, 大素数p
B: a,p
2、 A:生成隐私数据 😡 (x<p ),计算得出 a^x%p,发送给B
B:生成隐私数据 :y,计算得出 a^y%p,发送给A
3、 A:计算得出 ( a^y%p) ^x = a^xy%p, 生成为密钥
B:计算得出 ( a^x%p) ^y = a^xy%p, 生成为密钥

CA和证书

PKI: Public Key Infrastructure

签证机构: CA( Certificate Authority)

注册机构: RA

证书吊销列表: CRL

证书存取库:
X.509:定义了证书的结构以及认证协议标准

版本号
序列号
签名算法
颁发者
有效期限
主体名称
主体公钥
CRL分发点
扩展信息
发行者签名
证书获取
证书类型:
证书授权机构的证书
服务器

用户证书

获取证书两种方法:
• 使用证书授权机构
生成签名请求( csr)
将csr发送给CA
从CA处接收签名
• 自签名的证书
自已签发自己的公钥
安全协议

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 RFC(Request For Comments ) 4346
2008: TLS 1.2 当前使用
2015: TLS 1.3

功能:机密性,认证,完整性,重放保护两阶段协议,分为握手阶段和应用阶段握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。 后续通信使用的所有密钥都是通过MasterSecret生成。
应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

SSL/TLS
SSL/TLS

Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
ChangeCipherSpec 协议:一条消息表明握手协议已经完成
Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别, fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
Record 协议:包括对消息的分段、