Linux---SSH Server

堵飞鸿
2023-12-01

1. 介绍

1.1 概念

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 是建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

1.2 功能

传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到中间人(man-in-the-middle)攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道" 。

2. ssh服务安装及配置

2.1 安装ssh

# 查看软件属于来自哪个软件包
[root@mahaoliang network-scripts]# rpm -qa|egrep openssh
# 客户端
openssh-clients-7.4p1-22.el7_9.x86_64
# 服务器端
openssh-server-7.4p1-22.el7_9.x86_64
openssh-7.4p1-22.el7_9.x86_64
[root@mahaoliang network-scripts]# 
# 升级openssh软件
yum update openssh-clients openssh-server -y

2.2 服务端配置

# /etc/ssh/sshd_config  服务端配置文件

Port 2233  #修改默认监听端口(默认22端口)
#AddressFamily any
ListenAddress 192.168.0.132  #设置本机监听ip地址,默认为0.0.0.0(表示在本机任意ip地址上监听)
PermitRootLogin no  #不允许root用户登陆,默认为yes
PubkeyAuthentication yes #是否开启公钥认证
AuthorizedKeysFile  .ssh/authorized_keys  #配置公钥认证的文件
PasswordAuthentication no   #是否开启密码认证,默认为yes
UsePAM yes #使用pam认证 
#pam认证模块 --》配置路径/etc/pam.d 这个目录下面存放的是每个需要认证的服务的配置,文件名就是服务名
UseDNS yes  #是否将客户端主机名解析为ip
#此过程不顺利的话,会非常的慢,会影响登陆认证的速度,可以将其设置为no

# 修改配置文件后重启服务
# 重启服务:
 service  sshd restart  / reload
 kill  -1  sshd的pid
 kill -HUP  sshd的pid

# 查看ssh服务启动情况
1、ps -aux/-ef 
2、pidof sshd
3、[sanchuang@mysql-rpm pam.d]$ sudo netstat -autpln |grep ssh
tcp        0      0 0.0.0.0:2233            0.0.0.0:*               LISTEN      16199/sshd  
4、lsof  -i:22

2.3 客户端配置

全局配置 全局生效

# /etc/ssh/ssh_config  客户端配置

个人用户配置

# ~/.ssh/config
########修改客户端配置##############
配置文件: ~/.ssh/config
[sanchuang@a ~]$ cat .ssh/config 
##############################
ForwardAgent yes
StrictHostKeyChecking no
ServerAliveInterval 60
IdentityFile  ~/.ssh/id_rsa
#############################
Host B
    HostName 192.168.0.39
    User   sanchuang
    Port   2233

Host 10.*
    User  sanchuang
    Port 2233
    ProxyCommand  ssh 192.168.0.39 -W %h:%p -l sanchuang -p 2233

2.4 ssh访问控制

SSH使用TCP Wrappers实现访问控制

主要配置文件
/etc/hosts.allow
/etc/hosts.deny

首先检查 hosts.allow 文件,若找到相匹配的策略,则允许访问
否则继续检查 hosts.deny 文件,若找到相匹配的策略,则拒绝访问
如果两个文件中都没有相匹配的策略,则允许访问

3. ssh应用

3.1 加密技术

3.1.1 对称加密

双方共同拥有一把钥匙,其中一方拿着加密,另外一方就拿着解密

3.1.2 非对称加密

使用公钥对进行加解密:
生成一对钥匙,其中一方作为私钥,另一方就是公钥
私钥是只有自己知道,私钥保存在本地
公钥是给需要通信的人,公钥可以给其他人
使用公钥加密,私钥解密,一般用在数据加密传输
使用私钥加密,公钥解密,一般用于签名认证

# 配置linux客户端A免密码登录linux客户端B
	1、客户端A使用命令生成公钥对
		ssh-keygen
			-t 选项 指定生成的加密算法
			默认是rsa算法加密,过程中一直敲回车就ok
	2、将A的公钥发送给客户端B
		保存在客户端B的~/.ssh/authorized_keys
		[sanchuang@mysql-binary ~]$ ssh-copy-id  wy@192.168.0.39 -p 2233
			需要可以支持密码登录
	3、检查权限
		authorized_keys  600权限
		.ssh 以及家目录都给755以下权限

# 配置windows客户端免密码登录linux服务端
1、点击windows客户端上的工具栏目,生产公私钥对
2、将其公钥,放置在linux服务端的~/.ssh/authorized_keys里
3、将authorized_keys文件权限修改为600
将.ssh文件夹的权限修改为755及以下
4、验证免密是否成功

3.2 ssh登录

3.2.1 密码登录

1、客户端发送登陆请求
2、服务器发送机器的公钥发送给客户端
3、客户端用服务器的公钥对密码进行加密,发送给服务器
4、服务器收到密文之后,用私钥进行解密,与/etc/shadow进行验证
5、返回验证结果

3.2.2 密钥登录

1、客户端生成公钥对
2、将客户端的用户公钥发送给服务器,保存在目标用户~/.ssh/authorized_keys
3、客服端发送请求,服务器返回一个随机字符串
4、客户端收到随机字符串之后,用自己的私钥加密,发送给服务器
5、服务器收到密文之后,用客户端的公钥进行解密,拿到随机字符串与生成的字符串比较。返回认证结果

3.2.3 弊端

第三方攻击
原因:A无法判定收到的这个公钥是不是B的
为了解决这个问题,第一登陆的时候会进行人为确认,确认了之后,将B机器主机公钥存放在~/.ssh/know_hosts,以后每次登陆都会进行对比

3.3 ssh文件传输

1、ssh
远程执行命令,远程登陆
登陆方式
	ssh 服务器ip地址
		使用当前用户和默认端口登陆
		使用客户端的当前用户名 登陆到远程服务器的同名用户下 ,默认端口22
	ssh 用户名@服务器ip地址  
		登陆到远端服务器的指定用户下,使用默认端口22登陆
	ssh 服务器地址 -l 用户名  -p  端口号
		指定用户名和端口去登陆
	ssh  -o  接一些配置选项登陆  服务器的ip地址
		#无需输入yes,自动保存hostkey
       ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223
	ssh  -i  /tmp/id_rsa  指定私钥认证文件
		默认情况在~/.ssh/这下面找私钥
	ssh -vvv  服务器ip地址
		打印登陆过程详细信息
	ssh B "/usr/sbin/ip a"
		远程执行命令
2、scp
	# ssh下的文件传输命令
	scp 远程拷贝 底层通过ssh协议 --推荐使用scp
	# 复制文件
	scp root@192.168.2.89:/etc/passwd /etc/ssh
	[root@mahaoliang ssh]# scp -r /etc/passwd root@192.168.2.89:~
	# 复制文件夹
	[root@mahaoliang ssh]# scp -r root@192.168.2.89:/boot /etc/ssh 
3、sftp
	sftp  用户名@主机名  
	ls 查看目标主机当前文件夹
	!ls 查看本地主机当前文件夹
	pwd 查看目标主机当前路径
	lpwd查看本地主机当前路径
	cd 执行在目标主机
	lcd执行在本地主机
	get 下载
	put 上传
	put -r 上传文件夹
	[root@mahaoliang ssh]# sftp root@192.168.2.89
	root@192.168.2.89's password: 
	Connected to 192.168.2.89.
	sftp> ls
	anaconda-ks.cfg   passwd            
	sftp> lpwd
	Local working directory: /etc/ssh
	sftp> !ls
	boot	ssh_config   ssh_host_ecdsa_key      ssh_host_ed25519_key      ssh_host_rsa_key
	moduli	sshd_config  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
	sftp> put /etc/ssh/sshd_config ~
	Uploading /etc/ssh/sshd_config to /root/~
	/etc/ssh/sshd_config                                                          100% 3907     2.
	sftp> ls
	anaconda-ks.cfg   passwd            ~                 
	sftp> put /etc/ssh/sshd_config /lianxi
	Uploading /etc/ssh/sshd_config to /lianxi/sshd_config
	/etc/ssh/sshd_config                                                          100% 3907     2.
	sftp> lcd ..
	sftp> !ls
	adjtime			 groff			   my.cnf.d	      sasl2
	aliases			 group			   netconfig	      securetty
	sftp> lcd ..
	sftp> !ls
	bin   dev  go	 lianxi  lib64	mnt    mount1  mount3  proc  run   soft-hard  sys  usr
	boot  etc  home  lib	 media	mount  mount2  opt     root  sbin  srv	      tmp  var
	sftp> lcd ..
	sftp> !ls
	bin   dev  go	 lianxi  lib64	mnt    mount1  mount3  proc  run   soft-hard  sys  usr
	boot  etc  home  lib	 media	mount  mount2  opt     root  sbin  srv	      tmp  var
	sftp> lcd ..
	sftp> lcd ..
	sftp> !ls
	bin   dev  go	 lianxi  lib64	mnt    mount1  mount3  proc  run   soft-hard  sys  usr
	boot  etc  home  lib	 media	mount  mount2  opt     root  sbin  srv	      tmp  var
	sftp> lcd lianxi/
	sftp> !ls
	soft-hard
	sftp> ?
	Available commands:
	bye                                Quit sftp
	cd path                            Change remote directory to 'path'
	chgrp grp path                     Change group of file 'path' to 'grp'
	chmod mode path                    Change permissions of file 'path' to 'mode'
	chown own path                     Change owner of file 'path' to 'own'
	df [-hi] [path]                    Display statistics for current directory or
	                                   filesystem containing 'path'
	exit                               Quit sftp
	get [-afPpRr] remote [local]       Download file
	reget [-fPpRr] remote [local]      Resume download file
	reput [-fPpRr] [local] remote      Resume upload file
	help                               Display this help text
	lcd path                           Change local directory to 'path'
	lls [ls-options [path]]            Display local directory listing
	lmkdir path                        Create local directory
	ln [-s] oldpath newpath            Link remote file (-s for symlink)
	lpwd                               Print local working directory
	ls [-1afhlnrSt] [path]             Display remote directory listing
	lumask umask                       Set local umask to 'umask'
	mkdir path                         Create remote directory
	progress                           Toggle display of progress meter
	put [-afPpRr] local [remote]       Upload file
	pwd                                Display remote working directory
	quit                               Quit sftp
	rename oldpath newpath             Rename remote file
	rm path                            Delete remote file
	rmdir path                         Remove remote directory
	symlink oldpath newpath            Symlink remote file
	version                            Show SFTP version
	!command                           Execute 'command' in local shell
	!                                  Escape to local shell
	?                                  Synonym for help
	sftp> 
4、pssh
  -h  指定主机文件列表,内容格式"[user@]host[:port]"
  -i  指定每个服务器的处理信息
	[sanchuang@a ~]$ pssh -h ip.txt  -i "/usr/sbin/ip a"
5、fping
	#根据文件指定ip去ping
	[sanchuang@a ~]$ fping -f ip-2.txt
	192.168.0.39 is alive
	192.168.0.48 is alive
	[sanchuang@a ~]$ cat ip-2.txt
	192.168.0.39
	192.168.0.48
	
	#根据网段去ping
	[sanchuang@a ~]$ fping -g 192.168.0.0/24
	pscp.pssh
	#批量传输文件
	pscp.pssh
	[sanchuang@a ~]$ pscp.pssh -h ip.txt pscptest /tmp  #把当前目录下的pscptest文件传送到目标主机的/tmp目录下

3.4 ssh服务代理

管理密钥

在你自己的机器上开启这个服务
ssh-agent管理密钥  一个代理程序,帮助我们管理私钥
[sanchuang@mysql-binary .ssh]$ ssh-add -l
2048 SHA256:GXSPI9Tter3TK7sSFmt6cgeTKj4hEkcVkPPcEuuQFO4  (RSA1)
2048 SHA256:aDTgVRaYMmzFPAzov6QeQxceJAg1yUpuI7LnnBtGrEI  (RSA)
[sanchuang@mysql-binary .ssh]$ ssh-add  ~/.ssh/id_rsa

配置: xshell–> 主机属性–》ssh --》勾选 使用xagent进行身份验证 勾选使用代理转发

 类似资料: