SSH基础
SSH概念
- SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能;
- SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令;
- SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。
- SSH使用传输层TCP协议的22号端口。
SSH客户端<--------------网络---------------->SSH服务端
SSH的优点
SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
S S H最初是U N I X系统上的一个程序,后来又迅速扩展到其他操作平台。
S S H在正确使用时可弥补网络中的漏洞。
客户端包含ssh程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。
数据传输的过程是加密的,具有安全稳定的特点
数据传输的方式是压缩的,可以提高传输速度
常见的SSH服务软件/工具
客户端软件:
- Linux 客户端: ssh, scp, sftp,slogin
- Windows 客户端:xshell, MobaXterm,putty, securecrt, ssh secure shell client
服务端软件:
- 软件名sshd,闭源。
- 软件名openssh,服务名sshd。CENTOS 7默认安装的是这个软件包。
二:ssh原理
2.1(公钥传输原理)
1. ssh客户端通过ssh-keygen生成自己的公钥和私钥,将公钥发送给ssh服务端,并且放在指定的位置。
2.公钥发送完毕后。ssh客户端再向ssh 服务端进行登录请求。
3.ssh服务端收到ssh客户端的登录请求后,ssh服务端用对应的公钥加密一些随机数返回给ssh客户端。
4.ssh客户端收加密的随机数后使用私钥对其进行解密,再将解密的结果发送给ssh服务端进行验证。
5. ssh服务端接收到ssh客户端发送过来的解密数据,将其与原数据进行比对,保持一致则允许用户进行登录
2.2登录
ssh [远程主机用户名]@[远程服务器主机名或IP地址] [-p port]
(如当前所登录的用户是 root 的话,当连接另一台主机时也是用 root 用户登录时,可以直接使用 ssh IP,端口默认即可,如果端口不是默认的情况下,需要使用-p 指定端口。)
ssh -l [远程主机用户名] [远程服务器主机名或IP 地址] -p port
ssh连接时直接跟命令,连接后命令立即生效。例如跟 ls 命令:
2.3 known_hosts 文件
文件位置:~/.ssh/known_hosts
ssh会把每个你访问过的服务端的公钥(public key)都记录在known_hosts 文件中。 同时服务端也会记录客户端的公钥。
A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
3 sshd服务端配置
sshd服务端配置文件:/etc/ssh/sshd_config
#Port 22 | //端口号,生产环境建议修改端口号 |
ListenAddress 0.0.0.0 | #监听地址为任意网段,也可以指定OpenSSH服务器的具体IP |
#LoginGraceTime 2m | //发起连接后多少时间内必须登录,超时断开连接 |
#PermitRootLogin yes | //是否允许root用户登录,ubantu不允许root远程ssh登录 |
#StrictModes yes | //检查.ssh/文件的所有者,权限等 |
#MaxAuthTries 6 | //最多允许输错几次密码(centos7默认3次,修改也无效) |
#MaxSessions 10 | //同一时间最多允许10个远程连接 |
#PermitEmptyPasswords no | //是否允许空密码用户登录 |
PasswordAuthentication yes | //基于用户和密码验证 |
#UseDNS no | //禁用反向解析,提高速度可设置为no |
PubkeyAuthentication yes | #启用密钥对验证 |
#设置黑白名单 | |
AllowUsers yuji@192.168.72.10 lisi | 白名单 //只允许yuji用户从192.168.72.10访问,允许lisi从所有地址访问 |
DenyUsers liwu | 黑名单 //不允许使用liwu用户登录 |
#PermitRootLogin yes
注释掉是默认允许root远程登录
PermitRootLogin no
取消注释,yes改为no 是禁止root用户远程登录
#白名单的优先级高于黑名单。如果一个用户同时加入了白名单和黑名单,那么该用户是可以访问的。 #如果不设置白名单,则所有用户都可以登录访问。一旦设置了白名单,那么只有白名单内的用户可以访问
sftp命令scp远程复制
SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议。SFTP与FTP有着几乎一样的语法和功能。SFTP为SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。
sftp命令格式:sftp [用户名@]IP地址
sftp连接后的常用命令:
get | 下载文件 |
get -r | 下载目录 |
put | 上传文件 |
put -r | 上传目录 |
quit、exit、bye | 退出 |
scp远程复制
将远程主机的/etc/passwd文件复制到本机
[root@localhost opt]# scp root@192.168.233.22:/opt/yht.txt /opt/rh #复制文件
[root@localhost rh]# scp -r root@192.168.233.22:/opt/ky27/ /opt/ #复制目录
[root@localhost rh]# scp -rP 10022 root@192.168.233.22:/opt/ky27/ /opt/ #如果不是默认端口22,要加P 大写的
注意书写格式 冒号前后没有空格
设置免密码登录
免密码原理流程:
- 首先在客户端生成一对密钥(ssh-keygen)。
- 并将客户端的公钥ssh-copy-id 拷贝到服务端。
- 当客户端再次发送一个连接请求时,包括ip、用户名。
- 服务端得到客户端的请求后,会到 authorized_keys 文件中查找,如果有相应的IP和用户,就会随机生成一个字符串,例如:kfc。
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端。
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端。
- 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就进行免密码登录。
相关命令:
ssh-keygen -t ecdsa (ssh-keygen命令的“-t”选项用于指定算法类型)
cd ~/.ssh/
ssh-copy-id -i id_ecdsa.pub zhangsan@192.168.72.129
设置ssh代理功能,实现免交互登录
ssh-agent bash
ssh-add
输入密钥后面就可以进行免密钥登录
如果之前密钥生成时 不设密码,那么这里也就不需要输入密钥了 也就可以免密钥免密码登录了
如果之前设置了密钥密码,则要进行下面的操作
TCP Wrappers 访问控制
TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受TCP_Wrappers
的安全控制。它的主要功能就是控制谁可以访问,常见的程序有 rpcbind、vsftpd、sshd、telnet。
有些进程不受tcp_wrappers管理,例如 httpd、smb、squid等。
工作原理
TCP_Wrappers有一个TCP的守护进程叫作tcpd。以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。
保护机制实现方式:
- 方式1:通过tcpd程序对其他服务程序进行包装
- 方式2:由其他服务程序调用libwrap.so.*链接库
访问控制策略的配置文件
白名单:/etc/hosts.allow
黑名单:/etc/hosts.deny
白名单的优先级高于黑名单,如果一个地址既在白名单也在黑名单中,该地址是可以访问的。