第1章 ssh SSH(22端口)是Secure Shell Protocol的简写,安装时的软件包是openssh,有ssh 1,和ssh 2两个版本 -t 指定加密类型rsa1是版本1,rsa,dsa,ecdsa是版本2 SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全 telnet(23端口)实现远程控制管理,但是不对数据进行加密,默认不支持root用户登录
1.1 ssh简介
ssh在进行数据传输之前,先对联机数据包通过加密技术进行加密处理,加密后再进行数据传输,确保传输安全
ssh是专为远程登录会话和其他网络服务提供的安全性协议(例如rsync),利用ssh协议可以有效的防止远程管理过程中的信息泄露问题,,企业普遍使用ssh协议替代传统不安全的远程联机,例如telnet
1.1.1 安装ssh
默认已安装,一般将两个都安装
客户端连接服务端后生成一个其他进程,和原本的ssh进程没有关系
主要有两个进程或多个
/usr/sbin/sshd 此进程对客户端第一次连接ssh服务端有影响
sshd: root@pts/0 一但连接成功,是否可以始终保持连接由次进程决定
1.1.1.1 客户端
[root@backup ~]# rpm -qf which ssh
openssh-clients-5.3p1-122.el6.x86_64
1.1.1.2 服务端
[root@backup ~]# rpm -qf which sshd
openssh-server-5.3p1-122.el6.x86_64
1.1.2 两个功能
SSH服务主要提供两个服务功能
01. 一是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;
02. 另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的,
提供更安全的SFTP服务(vsftp,proftp)。
1.1.3 ssh的两个版本
sshv1与sshv2版本比较:
v1版本钥匙和锁头默认不会变化,数据传输不安全
v2版本钥匙和锁头会经常变化,数据传输更安全
1.1.4 工作原理 服务端ssh是一个守护进程,在后台运行并响应其他客户端的连接请求.服务端ssh服务的进程名为sshd,实时 监听其他客户端的连接请求,并进行处理,一般包括公共秘钥认证,密钥交换,对称密钥加密和非安全连接等. 客户端命令包括ssh以及scp,scp(远程拷贝),slogin(远程登录),sftp(安全ftp文件传输)这些命令
1.2 ssh加密原理 利用了公钥和私钥认证机制,实现数据加密和解密,客户端创建一对密钥向服务端发送公钥(需要输入密码),本 地保留私钥,连接时验证密钥即可,公钥在网络中传输,私钥保存在本地 分为dsa和rsa两种 ssh_host_dsa_key 私钥 ssh_host_dsa_key.pub 公钥 ssh_host_rsa_key 私钥 ssh_host_rsa_key.pub 公钥 ssh_keyscan 172.16.1.41 查看指定主机的公钥 ssh_keyscan -t dsa 172.16.1.41 查看指定主机的指定dsa格式公钥
1.2.1 公钥私钥算法 1.x 建立连接时,向客户端发送公钥,客户端如果用私钥破开,回应服务端消息,建立连接。黑客也会收到公钥,会模仿客户端私钥,打开服务端的公钥建立连接 2.x 前边的步骤和1.x大致相似,但是服务端公钥会定时更换,并通知客户端,防止黑客伪造私钥
1.3 ssh排错流程
1.4 ssh认证方法 1.4.1 基于口令验证
1.4.2 基于密钥的安全验证 需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(Publiic key)放在需要访问的目标服务器上, 另外,还需要把私有密钥(private key)放在ssh的客户端或对应的客户端服务器上 私钥不能在网络中传输--私钥可以解密公钥 公钥可以在网络中传输--公钥不能解密私钥 此时,如果想要连接到这个带有公用密钥的ssh服务器,客户端ssh软件或者客户端服务器会向ssh服务器发出请求,请求用联机的用户密钥进行安全验证.ssh服务器收到请求之后,会先在该ssh服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的ssh客户端发送过来的公用密钥进行比较.如果两个密钥一致,ssh服务器就用公用密钥加密"质询"(challenge)并把它发送给ssh客户端,客户端使用存放在本地的私钥,解密质询,将解密后的质询发送给服务器,ssh服务器验证质询,确认无误后建立连接
1.4.2.1 简单过程 基于秘钥的认证(实现免密码管理) ①. 在管理端创建出秘钥对(创建两个信物) ②. 管理端将公钥(锁头)传输给被管理端,锁头传输给被管理端要基于密码方式认证 ③. 管理端向被管理端发出建立连接请求,并发送公钥 ④. 被管理端发出公钥质询 ⑤. 管理端利用私钥解密公钥,进行公钥质询响应 ⑥. 被管理端接收到质询响应,确认基于秘钥认证成功
服务器建立公钥档: 每一次启动 sshd 服务时,该服务会主动去找 /etc/ssh/ssh_host* 的档案,若系 统刚刚安装完成时,由于没有这些公钥档案,因此 sshd 会主动去计算出这些需要的公钥档案,同时也会计算出服务器自己需要的私钥档; 2. 客户端主动联机要求: 若客户端想要联机到 ssh 服务器,则需要使用适当的客户端程序来联机,包括 ssh、xshell 等客户端程序; 3. 服务器传送公钥档给客户端: 接收到客户端的要求后,服务器便将第一个步骤取得的公钥档案传送给客户端使用 (此时应是明码传送,反正公钥本来就是给大家使用的!); 4. 客户端记录/比对服务器的公钥数据及随机计算自己的公私钥: 若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户家目录内的 ~/.ssh/known_hosts 。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥数据, 则开始计算客户端自己的公私钥数据; 5. 回传客户端的公钥数据到服务器端: 用户将自己的公钥传送给服务器。此时服务器:『具有服务器的私钥与客户端的公钥』,而客户端则是: 『具有服务器的公钥以及客户端自己的私钥』,你会看到,在此次联机的服务器与客户端的密钥系统 (公钥+私钥) 并不一样,所以才称为非对称式密钥系统喔。
- 开始双向加解密: (1)服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密; (2)客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密。
在上述的第 4 步骤中,客户端的密钥是随机运算产生于本次联机当中的,所以你这次的联机与下次的联机的密钥可能就会不一样啦! 此外在客户端的用户家目录下的 ~/.ssh/known_hosts 会记录曾经联机过的主机的 public key ,用以确认我们是连接上正确的那部服务器。 1.4.3 基于秘钥认证配置部署过程 1.4.3.1 管理服务器上创建秘钥对
默认保存在 [root@web01 ~]# ll /root/.ssh/ total 16 -rw------- 1 root root 1964 Jan 29 19:50 authorized_keys 其他主机分发的公钥,脚本规定更改名字 -rw------- 1 root root 1671 Jan 29 12:31 id_rsa 私钥,本地保存 -rw-r--r-- 1 root root 392 Jan 29 12:31 id_rsa.pub 公钥,发送给服务端 -rw-r--r-- 1 root root 1178 Jan 29 12:24 known_hosts 连接哪台主机就保存哪台主机的公钥 1.4.3.2 分发公钥给被管理端 -i 表示指定要分发的公钥文件 脚本中的过程是先远程登录到其他主机,在指定目录下存放公钥的过程
1.4.3.3 基于秘钥登录测试 ssh root@172.16.1.41 可以直接在登录后加命令,以被登录的主机执行这个命令,不用登录到远程主机,直接在远程主机上执行命令 例如: ssh root@172.16.1.41 hostname -i 172.16.1.41 这就是批量管理主机 1.4.3.4 受控端默认端口不是22 受控端默认端口不是22,如何分发公钥
- 实现批量部署ssh+key环境时遇到的问题
- 创建秘钥对时需要进行交互,输入回车 需要交互确认的信息: 1)需要确认私钥保存路径 -f filename Specifies the filename of the key file. 指定私钥文件保存路径信息参数 ssh-keygen -t rsa -f /root/.ssh/id_rsa
2)需要确认私钥密码信息 -N new_passphrase Provides the new passphrase. -P passphrase Provides the (old) passphrase.
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ""
- 分发公钥时,需要输入yes和密码信息 vim /usr/bin/ssh-copy-id ssh -p52113 $1 "exec sh -c 'cd; umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon .ssh .ssh/authorized_keys >/dev/null 2>&1 || true)'"
1)exec sh -c --- 在脚本中临时设置环境变量信息 2)cd --- 切换到当前用户家目录 3)umask 077 --- 设置临时的umask值 4)test -d .ssh || mkdir .ssh --- 判断当前用户家目录是否存在.ssh目录,如果不存在就进行创建 5)cat >> .ssh/authorized_keys && ...省略... 将当前主机秘钥对中公钥信息复制到远程主机上,在远程主机接收到公钥信息后, 将信息保存到.ssh/authorized_keys
说明:远程登录到相应主机上, 将公钥信息保存到远程主机相应用户家目录中的.ssh/authorized_keys
并将authorized_keys权限设置为600
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.1.31
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_rsa.pub "172.16.1.7 -p52113"
1.4.4 认证代理服务
1.4.4.1 启动代理服务
eval ssh-agent -s
1.4.4.2 向agent代理服务注册本地服务器私钥信息
ssh-add
1.4.4.3 发送凭证
ssh -A 172.16.1.31 -A发送凭证 -A 可以递归赋予权限
1.4.5 免交互分发
1.4.5.1 ssh-keygen创建密钥对
rm -f /root/.ssh/id_dsa* 先删除这个目录下的公钥和私钥,防止出现覆盖的交互式信息
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
-t 指定加密类型
-f 指定密钥存放位置
-P 指定旧的密钥的密码,可以定向为空 或者使用-N (指定新的密钥密码,效果相同)
-q不显示输出信息
放在脚本中
1.4.5.2 批量分发公钥 需要有yes/no的交互,去掉这个交互 ssh-copy-id -i /root/.ssh/id_dsapub "-o StrictHostKeyChecking=no root@172.16.1.41" -i指定要发送的公钥 -o 后加...忽略yes/no的交互 也可以直接在客户端(管理端)配置文件/etc/ssh/ssh_config当中将StrictHostKeyChecking=no改成这样
第一次分发公钥时需要输入密码 yum install -y sshpass sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsapub "-o StrictHostKeyChecking=no root@172.16.1.41" sshpass 指定了登录密码 1.4.5.3 完整脚本 #mk key rm -f /root/.ssh/id* ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q #fenfa key for ip in 7 do echo "fenfa host 172.16.1.$ip" >/dev/null sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no root@172.16.1.$ip" >/dev/null done
1.4.5.4 实现批量管理
#!/bin/bash
CMD=$1
for ip in 7 8 31 do echo "info hosts 172.16.1.$CMD" ssh 172.16.1.$ip "$CMD" done 1.5 ssh配置文件 可以man sshd_config查看详细介绍 1.5.1 ssh命令和目录 加密软件 1.5.1.1 客户端 openssh-clients /etc/ssh/ssh_config --- ssh客户端配置文件 /usr/bin/.ssh.hmac --- ssh服务的算法文件 /usr/bin/scp --- 基于ssh协议,实现远程拷贝数据命令 /usr/bin/sftp --- 基于ssh协议,实现数据传输密命令 /usr/bin/slogin --- 远程登录主机连接命令 ssh登录不能用也可以用这个 /usr/bin/ssh --- 远程登录主机连接命令 /usr/bin/ssh-add --- 此参数必须和ssh-agent命令结合使用,将秘钥信息注册到ssh-agent代理服务中 /usr/bin/ssh-agent --- 启动ssh认证代理服务命令 /usr/bin/ssh-copy-id --- 远程分发公钥命令 /usr/bin/ssh-keyscan --- 显示本地主机上默认的ssh公钥信息 1.5.1.2 服务端 openssh: openssh-server /etc/rc.d/init.d/sshd --- ssh服务端启动脚本命令 /etc/ssh/sshd_config --- ssh服务端配置文件 /usr/sbin/sshd --- 启动ssh服务进程命令
1.5.1.3 修改服务端配置文件
1.5.1.4 设置监听地址 监听地址要么是全部监听,要么是本地网卡的其中之一
1.5.1.5 scp 不同主机之间相互复制 例如:scp -rp /etc/hosts 10.0.0.31:/tmp
1.5.1.6 sftp sftp -oPort=52113 oldboy@10.0.0.142 --- 实现ftp协议中控制链路建立 -oPort=52113 --- 指定连接ssh服务端口 sftp> --- 进入到ftp控制命令行中 bye --- Quit sftp 退出ftp控制界面命令 ls --- 显示出sftp服务端文件或目录数据信息 lls --- 显示出sftp客户端(本地)文件或目录数据信息 pwd --- 检查当前登录到sftp服务端之后,所在路径信息 lpwd --- 检查当前登录到sftp服务端之后,客户端所在路径信息
get --- 从ftp服务端下载数据
put --- 从ftp客户端上传数据
mget --- 批量下载数据
mput --- 批量上传数据
1.5.2 防止被攻击 如何防止SSH登录入侵小结: 1、用密钥登录,不用密码登陆(课后作业)。 2、牤牛阵法:解决SSH安全问题 a.防火墙封闭SSH,指定源IP限制(局域网、信任公网) b.开启SSH只监听本地内网IP(ListenAddress 172.16.1.61)。 3、尽量不给服务器外网IP 4、最小化(软件安装-授权) 5、给系统的重要文件或命令做一个指纹 6. 给他锁上 chattr +i +a
1.5.3 抓包内容 1.5.3.1 三次握手
1.5.3.2 四次挥手
1.5.4 linux抓包命令 tcpdump -i eth0 -nn -c 5 "port 53" -i ---指定抓取哪一个网卡上产生数据包流量 --nn ---抓取数据包中端口信息以数字方式显示 -c ---表示抓取的数据包数量 "port 53" --- 双引号里面表示搜索数据包的条件 -w ---将抓取数据保存到指定文件中 -r ---对保存的数据包文件进行读取 1.5.5 ssh知识要点总结 SSH是安全的加密协议,用于远程连接linux服务器。 SSH默认端口是22,安全协议版本SSHv2,除了2之外还有SSHv1(有漏洞)。 SSH服务端主要包含两个服务功能SSH远程连接和SFTP服务。 Linux SSH客户端包含ssh远程连接命令,以及远程拷贝scp命令等。 1.6 配置telnet远程连接服务 第一个里程碑:安装telnet服务软件 yum install -y telnet telnet-server
第二个里程碑:配置telnet服务可以被xinetd服务管理
vim /etc/xinetd.d/telnet
disable = no
第三个里程碑:启动xinetd服务
/etc/init.d/xinetd start
netstat -lntup|grep 23
tcp 0 0 :::23 :::* LISTEN 2427/xinetd
1.6.1 安装telnet服务软件 yum install telnet telnet-server 把telnet的客户端和服务端软件都安装 1.6.2 配置xinetd服务目录中的telnet文件 让telnet服务允许被xinetd服务管理,将disable =yes修改为disable =no 1.6.3 抓取文件包