SSH
SSH是一套网络协议,它的目的在于安全的网络服务和加密的远程登录,实现了ssh协议的最主流开源软件是openssh。
以前使用FTP或者TELNET登录服务器,都是以明文的形式在网络中发送账号和密码,很容易被黑客截取到
数据,篡改后威胁到服务器的安全。因此何如对数据加密,安全传输成为了重中之重。
主要方式有两种:
1.对称加密
2.非对称加密
为防止中间人攻击
# 扫描server端指纹信息 yumac: ~ yuchao$ssh-keyscan -t ecdsa 123.206.16.61| ssh-keygen -lf - # 123.206.16.61:22 SSH-2.0-OpenSSH_7.4 256 SHA256:CVwhwfUkaLPrretR4pGltYRL6QB+5lyI 123.206.16.61 (ECDSA) 进行对比
基于公钥认证
基于口令的认证存在一些缺点,每次登录都需要输入密码,当我们机器数量众多就难以维护了。
我们更希望能够免密登录,公钥登录
公钥登录流程如下:
1.client发送自己的公钥给server,写入server的authorazed_keys中
2.server端接受到client的连接请求后,在自己的authorized_keys文件中匹配client的公钥信息pubkey,并
生成一个随机数R,使用client的公钥pubkey针对该随机数R进行加密,得到一个加密后的随机数pubkeyR。
3. client通过私钥解密得到随机数R,再对随机数R和当前会话sessionkey采用MD5生成摘要Digest1,再发送
给server端。
4. server端会对随机数R和当前client的sessionkey用同样的摘要算法生成Digest2.
5. 结果比较client发来的Digest1与Digest2是否一致,正确则完成认证。
ssh登录原理
配置ssh公钥认证
# client本地生成公私钥 [root@chaogelinux .ssh]# ssh-keygen -t rsa #指定rsa密钥类型,默认一路回车 #会生成如下的公私钥 Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. #发送client公钥到server中 #发送自己的公钥,写入到远端server的authorized_keys中 yumac: ~ yuchao$ssh-copy-id root@123.206.16.61 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/yuchao/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@123.206.16.61's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@123.206.16.61'" and check to make sure that only the key(s) you wanted were added. #直接输入登录命令即可 yumac: ~ yuchao$ssh root@123.206.16.61 Last failed login: Fri Jan 3 16:54:46 CST 2020 from 189.39.13.1 on ssh:notty There were 3 failed login attempts since the last successful login. Last login: Fri Jan 3 16:14:59 2020 from 222.35.146.118 [root@chaogelinux ~]# [root@chaogelinux ~]# cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbkHjqnRe31HCteHc0BSfovvs9GqutyBfWvAJQy51Std1Ir3qBnHs29aKjwPL/jm/xHlZWgQ8mD/Xr091j2EVwGKUSMfCfH9nwbfu+0mwfwZKseJx5uliERShCpkRzA3Bhe6KOAqL1cgpfFzwKzO2Raga1PIGiCYcM/DIDlQh75/rEk9H5FGutamGiGrrtJfL4drRg6zEknrxSDWAMB3/MH6WUmkSWmGnECxOsPSy1PJN6Kqp1B yuchao@yumac
SSH配置文件
[root@chaogelinux ~]# grep -Ev '^$|^[# ]' /etc/ssh/sshd_config Port 22 #默认端口 AddressFamily any #配置地址家族,any支持ipv4,ipv6 ListenAddress 0.0.0.0 #设置sshd服务监听的ip地址,注意多网卡的绑定 HostKey /etc/ssh/ssh_host_rsa_key #ssh各密钥存放的位置 HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key PermitRootLogin yes #是否允许root管理员直接登录,保证系统安全 StrictModes yes #当用户的私钥改变,直接拒绝连接 MaxAuthTries 6 #最大密码尝试次数 MaxSessions 10 #最大终端数 AuthorizedKeysFile .ssh/authorized_keys #信任主机的公钥文件存放地 PasswordAuthentication yes #是否设置密码验证机制 PermitEmptyPasswords no #是否允许空密码登录,禁止
SSH与服务器安全
1. 修改SSH的端口,port
2. 禁止root登录,PermitRootLogin no
3. 禁止用密码登录,只能用被信任的机器,用公私钥进行登录,PasswordAuthentication no
# 创建一个普通的用户且支持公钥登录
1.登录服务器,创建普通用户,设置登录密码 useradd yuchao passwd yuchao 2.在自己本地机器,生成一个普通用户的公私钥对 ssh-keygen -t rsa 3.发送公钥给服务器,配置公钥登录 ssh-copy-id yuchao@192.168.178.142 4.在正确配置了公私钥登录之后,yuchao这个用户就可以免密登录linux服务器了 ssh yuchao@192.168.178.142
# 在Linux上配置该用户支持sudo命令
1.使用root登录服务器,配置yuchao用户支持sudo命令 vim /etc/sudoers文件 添加如下行 ## Allow root to run any commands anywhere root ALL=(ALL) ALL yuchao ALL=(ALL) ALL 2.此时尝试用yuchao用户登录,是否能够使用sudo命令
# 修改ssh的配置文件如下
修改/etc/ssh/sshd_config 文件的如下参数,此时一个安全的ssh服务器以及配置完毕,参数如下 [root@chaoge_linux ~]# grep -Ev '^$|^[# ]' /etc/ssh/sshd_config Port 23354 AddressFamily any ListenAddress 0.0.0.0 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV PermitRootLogin no AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no ChallengeResponseAuthentication no GSSAPIAuthentication no GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes UseDNS no AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server
# 重启ssh服务,此时就不能用root登录,只允许这个免密用户登录了
当然如上配置需根据自己的工作环境配置,灵活学习,灵活使用。
1.使用root用户重启sshd服务 ssh root@192.168.178.142 2.重启sshd服务 systemctl restart sshd 3.此时机器已经禁止root登录,禁止密码登录,且修改了ssh端口为23354 4.此时只能使用配置好的yuchao用户进行免密登录了 ssh yuchao@192.168.178.142 -p 23354
screen
1. 远程会话恢复:由于网络中断,导致的会话断开,需要重新连接,screen能确保用户不会丢失对远程会话的控制
2. 多窗口,运行多个远程会话
3. 会话共享:多个用户同时登录到远程服务器时,可以使用会话共享功能让用户之间的数据共享
screen常用参数
参数 | 作用 |
-S | 创建会话窗口 |
-A | 所有的窗口都调整为当前终端大小 |
-d | 断开screen进程(得有用户时Attached状态,) |
-ls | 同于-list,显示目前所有的screen |
-r | 恢复离线的screen进程,可以指定多个PID,TTY,HOST |
-x |
恢复离线的screen作业 |
-wipe | 检查目前所有的screen作业,并删除已经无法使用的screen作业 |
1.提前配置好epel仓库源 [root@chaogelinux ~]# yum install screen -y 2.直接安装 [root@chaogelinux ~]# yum install screen -y 1.进入一个新的screen会话,名字叫做s1 [root@chaogelinux ~]# screen -S s1 2.此时会立刻进入screen,检查会话信息 [root@chaogelinux ~]# screen -ls There is a screen on: 27686.s1 (Attached) 1 Socket in /var/run/screen/S-root. 3.想要退出screen会话,直接输入exit [root@chaogelinux ~]# screen -S s1 [screen is terminating] ######################## # 模拟突然断开远程会话 1.新建一个会话,执行一个持续执行的任务 [root@chaogelinux ~]# screen -S myPing 2.执行一个ping任务 ping baidu.com 3.直接关闭窗口 4.检查screen会话 发现有个myPing是挂掉的状态 [root@chaogelinux ~]# screen -ls There is a screen on: 28570.myPing (Detached) 1 Socket in /var/run/screen/S-root. 5.恢复会话 [root@chaogelinux ~]# screen -r myPing 6.退出会话直接exit 7.还可以再次尝试用screen新建一个会话,使用vim编辑文件,然后关闭窗口
# 会话共享
1.小王同学创建一个screen会话,等待超哥连接 screen -S shareScreen 2.超哥登录服务器,查看以存在的会话信息 [root@chaogelinux ~]# screen -ls 3.超哥加入会话,且开始操作,协助小王解决问题,小王坐在电脑前默默观看 screen -x shareScreen 4.小王默默观看超哥一顿输出,解决bug 5.超哥退出screen输入ctrl + a + d 组合键,留下小王满意的笑容 ctrl + a + d #超哥退出screen 6.小王退出screen,正常操作linux exit