ssh和sudo管理

ssh

sh:secure shell,protocol.22/tcp,安全的远程连接
具体的软件实现:
openssh:ssh协议的开源实现,centos默认安装
dropbear:另一个开源实现

ssh客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
客户端组件:
ssh配置文件:/etc/ssh/ssh_config
host PATTERN
StrictHostKeyChecking no 首次登陆不显示检查提示
格式:
ssh [user@]host[COMMAND]
ssh [-I user]host[COMMAND]
常见选项:
-p port:远程服务器监听的端口
-b :指定连接的源ip
-v:调试模式
-C:压缩方式
-X:支持x11转发
-t:强制伪tty分配
ssh -t remoteserver1 ssh -t remoteserver2 ssh remoteserver3

一、ssh基于秘钥验证的原理:
a、首先在C(客户端)生成一对秘钥,并将公钥拷贝给S(服务器)一份并重命名为authorized_keys

1
2
[root@node01 ~]#ssh-keygen -t rsa -b 2048 
[root@node01 ~]#ssh-copy-id server-ip

b、C想S发送一个连接请求,信息包括ip、用户名
c、S得到C的信息后,会到authorized_keys中查找,如果有响应的ip和用户名,S会随机生成一个字符串,例如:qwer
d、S将使用公钥对字符串qwer进行加密,发送给C
e、C得到S发来的消息后,C会使用私钥进行解密,然后将解密后的字符串发送给S
f、S接收到字符串会跟先前声称的字符串对比,如果一致,就允许免密码登录。

二、在xshell实现基于可以的验证登录
1、在xshell创建公钥–>生成identity.pub文件,并复制到需要登录的主机上相应文件authorized_keys文件中,注意权限必须为600,在需要登录的ssh主机上执行:

1
ssh-keygen -i -f identity.pub >> .ssh/authorized_keys

pssh工具

pssh是一个python编写的可以在多台服务器上执行命令的工具,也可以实现文件复制

选项:
    --version:查看版本
    -h:主机文件列表,内容格式"[user@]host[:port]"
    -H:主机字符串,内容格式"[user@]host[:port]"
    -A:手动输入密码模式,默认基于key验证
    -i:每个服务器内部处理信息输出
    -l:登陆使用的用户名
    -p:并发的线程数[可选]
    -t:超时时间
    -v:详细模式
    -O:SSH的选项
    -p:打印出服务器的返回信息

使用案例:
1、在多台主机执行相同命令:
pssh -h ip_file -i COMMAND

1
[root@node01 ~/.ssh]#pssh -h iplist.txt -i ifconfig

2、实现将本地文本批量复制到远程主机的功能

1
[root@node01 ~/.ssh]#pscp.pssh -h iplist.txt -r /data/test/ /data/f1.gpg /data/

telnet通过ssh隧道实现安全的本地端口转发

实验:准备三台主机A(192.168.34.101)、B(192.168.34.105)、C(192.168.34.108);A充当ssh客户端,B充当ssh服务端和Telnet客户端,C充当Telnet服务端。
步骤:
1、centos系统默认不安装telnet-server包,需要先安装telnet-server包

1
2
3
[root@node01 ~/.ssh]#yum -y install telnet-server
[root@node01 ~/.ssh]#service xinetd start
[root@node01 ~/.ssh]#service xinetd start

此时查看端口23是否打开

1
[root@node01 ~/.ssh]#ss -ntl

如果打开了说明Telnet服务可以正常使用,此时用Telnet连接B机器做测试。
2、在C机器设置防火墙拒绝A机器的直接连接

1
[root@node01 ~]#iptables -A INPUT -s 192.168.34.101 -j REJECT

3、在主机A开启一没被占用的端口,例如9527,用来接收发往远程的Telnet流量

1
[root@node01 ~/.ssh]#ssh -L 9527:192.168.34.108:23 192.168.34.105 -fN
此条命令的意思是在本地开启9527端口,通过shh通道连接到192.168.34.105,再通过192.168.34.105转发给192.168.34.108的23端口。

4、通过Telnet连接本机的9527端口,此时还自动通过刚才建立的ssh通道连接到C机器。

1
[root@node01 ~/.ssh]#telnet 127.0.0.1 9527

实验结束,本实验模仿A与C之间无法通信,但是B与A,C之间均可通信的情况下,利用B主机做跳板,实现A与C之间的Telnet通信.
数据传输流程为:
data–>本地(A)9527端口–>本地随机端口–>ssh server(B)–>ssh server随机端口–>telnet server(C)

Telnet利用ssh通道实现安全的本地端口转发之从企业内部发起shh通道

实验:同样A(192.168.34.101),B(192.168.34.105),C(192.168.34.108)三个主机
1、2两步同上个实验相同
3、在B机器上以本机作为客户端,A作为服务器端打开一个ssh通道

1
[root@node01 ~/.ssh]#ssh -R 9527:192.168.34.108:23 -fN 192.168.34.101
此条命令的意思是,以本机为ssh客户端,A机器为ssh服务端建立通道,将来A机器的9527端口的数据都通过此通道,传到本机,并以本机为Telnet客户端转发给C机器的23端口

4、在A上Telnet本机的9527端口即可连接到C主机

1
[root@node01 ~/.ssh]#telnet 127.0.0.1 9527
实验结束,本实验从企业内部发起ssh连接,不用修改防火墙策略即可实现,更加具有实用性。

上述实验有一个缺陷,就是A主机监听的知识127.0.0.1的9527端口,只能A本机实现端口转发功能,那么如果再有一台机器希望连接C该如何做呢?

很简单,在

1
[root@node01 ~/.ssh]#ssh -R 9527:192.168.34.108:23 -fN 192.168.34.101

这条命令中增加一个g选项,开启网关功能,即可实现监听A机器的所有网卡的9527端口,实现远程转发功能。

1
[root@node01 ~/.ssh]#ssh -R 9527:192.168.34.108:23 -fNg 192.168.34.101

实现此步骤,需要在ssh配置文件中打开网关端口

1
2
[root@centos7 ~]#sed -nr '/^Gate/p' /etc/ssh/sshd_config 
GatewayPorts yes

ssh实现动态端口转发

实验:准备三台主机A(192.168.34.101)、B(192.168.34.105)、C(192.168.34.108);A为本地主机,B为购买的国外虚拟机(可访问),C为国外无法访问的互联网主机。本实验实现A通过跳板机B访问C;即在A主机打开一个可用端口作为代理服务器,A对C的访问请求被转发到sshserver(B)上,由B代替A访问C。
方法一:
1、在A主机执行

1
[root@centos7 ~]#ssh -D 1080 192.168.34.105 -fNg

2、设置代理:
windows:
再浏览器设置代理192.168.34.101:1080即可访问C主机
linux:

1
[root@centos7 ~]#curl --socks5 127.0.0.1:1080 192.168.34.108

方法二:
1、在B主机打开一个端口做代理:

1
[root@centos7 ~]#ssh -D 1080 192.168.34.101 -fNg

2、设置代理:
windows:
再浏览器设置代理192.168.34.101:1080即可访问C主机
linux:

1
[root@centos7 ~]#curl --socks5 127.0.0.1:1080 192.168.34.108

ssh服务器

服务器端配置文件
    /etc/ssh/sshd_config
常用参数
    port     监听端口,默认22
    ListenAddress ip     监听地址,设置监听哪块网卡
    LoginGraceTime 2m     宽限登录时长,等待时间
    PermitRootLogin yes     是否允许root账户登录
    StrictModes yes 检查.ssh/文件的所有者,权限等
    MaxAuthTries 6     最大错误尝试次数,当达到最大值的一半时,结束
    MaxSessions 10 同一个连接最大会话
    PubkeyAuthentication yes     允许使用秘钥登录
    PermitEmptyPasswords no     是否允许空密码登录
    PasswordAuthentication yes     是否允许使用密码登录
    GatewayPorts no     是否启用网关功能
    ClientAliveInterval 单位:秒;客户端活跃检查次数
    ClientAliveCountMax 默认3;客户端是否活跃检查次数
    UseDNS yes     是否开启DNS解析
    GSSAPIAuthentication yes 提高速度可改为no
    MaxStartups 未认证连接最大值,默认值10
    Banner /path/file  登录提示,类似/etc/motd的功能
    限制可登录用户的办法:
        AllowUsers user1 user2 user3
        DenyUsers
        AllowGroups
        DenyGroups

ssh最佳实践

  • 建议使用非默认端口
  • 禁止使用protocol version 1
  • 限制可登陆用户
  • 设定空闲会话超时时长
  • 利用防火墙设置ssh访问策略
  • 仅监听特定的IP地址
  • 基于口令认证时使用强密码侧罗
    随机密码生成,例如:
    openssl rand -base64 8
    tr -dc "[[:alnum:]]" < /dev/urandom | head -c 8
  • 使用基于秘钥的认证
  • 禁止使用空密码
  • 禁止root用户直接登录
  • 限制ssh的访问频度和并发在线数
  • 经常分析日志