SSH协议、SSH服务器相关概念以及

ssh:secure shell,protocol,22/tcp,安全的远程登录

具体的软件实现

openssh:ssh协议的开源实现

dropbead:另一个开源实现

SSH协议版本

V1、V2

ssh 用户名@目标主机,不写用户名将以root身份登录

-p port:远程服务器监听的端口

-b:指定本机的某ip连接目标ip

-v:调试模式,用来检测连接情况的错误

-x:支持x11转发

-t:强制伪tty分配,例如ip1想要连接ipn,但内部设置不可直接连接,需要从其他主机连接,此时可以用ssh -t ip1 ssh -t ip2 ssh -t ip3 ... ssh ipn


windows界面运行linux桌面:XManager工具中有一个Xstart,打开后以ssh方式登录linux即可实现远程登录linux桌面


ssh服务基于密钥key认证登录

    1、在客户端生成一对密钥

        ssh-keygen -t rsa -P PASSWD -f ~/.ssh/FILE 

    2、将客户端的公钥拷贝到服务器端

        ssh-copy-id -i FILE.pub USER@ip,在服务器端/root/.ssh/authorized_keys内可以看到

    3、客户端向服务器端发一个连接请求,信息包括ip、用户名

    4、服务端得到客户端的请求后,会到授权密钥authorized_keys中查找,如果有响应的ip和用户名,服务器端会随机生成一个字符串

    5、服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

    6、得到服务端发来的信息后,客户端会使用私钥进行解密,然后将解密的字符串发送给服务端

    7、服务端接收到客户端发来的字符串后,跟之前字符串相比,如果一致,就允许免密码登录


scp命令

scp IPA:/位置/FILE IPB:/位置/FILE

此命令可以将自己文件传递到其它设备,也可以让两台设备间互传,也可以从其它设备传递到自己主机

选项

-r:可以复制目录

-p:传递时保留权限

-q:静默模式

-P PORT:指定端口

scp命令的复制为无脑复制粘贴,不检查文件存在性,因此配合rsync命令更为得手


rsync命令

基于ssh和rsh服务实现高效率的远程系统之间复制文件,使用安全的shell连接作为传输方式

rsync -av /etc IP:/位置,复制目录和目录下文件

rsync -av /etc/ IP:/位置,只复制目录下文件

此命令只复制不同文件


sftp命令:交互式文件传输工具,用法和传统的ftp工具相似,利用ssh服务实现安全的文件上传和下载


pssh工具

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

pssh -H 用户@IP -i 命令

演示举例

1、通过pssh批量关闭seLinux

pssh -H [email protected] -i "sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config" 批量发送指令

2、pssh -H [email protected] -i setenforce 0

3、pssh -H [email protected] -i hostname

4、当不支持ssh的key认证时,通过 -A选项,使用密码认证批量执行指令

5、pssh -H [email protected] -A -i hostname

6、将标准错误和标准正确重定向都保存至/app目录下

7、pssh -H 192.168.1.10 -o /app -e /app -i "hostname"


pscp.pssh功能是将本地文件批量复制到远程主机

选项

-v显示复制过程

-r递归复制目录

将本地test.sh复制到/app目录

pscp.pssh -H 目标IP /本机位置/test.sh /app

pscp.pssh -h IP列表.txt /本机位置/test.sh /app

将本地多个文件批量复制到/app目录

pscp.pssh -H 目标IP /本机位置 /test1 /本机位置/test2 /app

将本地目录批量复制到/app/目录

pscp.pssh -H 目标IP -r /本机位置 /目录/ /app/


pslurp功能试讲远程主机的文件批量复制到本地

选项

-L指定从远程主机下载到本机的存储目录,local是下载到本地后的名称

-r递归复制目录

批量下载目标服务器的test文件至/app下,并改名为file

pslurp -H 目标IP -L /app /目标位置/testt file


SSH端口转发

SSH会自动加密和解密所有SSH客户端和服务端之间的网络数据,但是SSH还能够将其他TCP端口的网络数据通过SSH链接来转发,并且自动提供了响应的加密及解密服务,这一过程也被叫做“隧道”,这是因为SSH为其他TCP连接提供了一个安全的通道来进行传输而得名,例如Telnet,SMTP,LDAP这些TCP应用均能够从中得益,避免了用户名、密码以及隐私信息的铭文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH的连接,也能够通过将TCP端口转发来使用SSH进行通讯。

SSH端口转发能够提供量大功能

加密SSH Client端至SSH Server端之间的通讯数据

突破防火墙的限制完成一些无法建立的TCP连接

总结

意思就是通过SSH连接服务端,会产生一个隧道,这个隧道可以允许TCP服务通过隧道,忽略防火墙,直接连接服务端。像TCP服务没有隧道是无法通过防火墙通讯连接服务端内部的。


本地转发 

-L PORT:IP1:IP1PORT -fN IP2:IP2PORT

PORT:本地的某个未使用的端口

IP1:如果本地存在多个ip,需要指定哪个ip去连接服务端

IP1PORT:IP1的端口

IP2:目标服务端的ip

IP2PORT:目标服务端的ip端口

选项

-f 后台启用

-N 不打开远程shell,处于等待状态

-g 启用网关功能

        适用于下列情况,命令在A设备上输入,此时B是IP1,C是IP21.png

远程转发

-R PORT:IP1:IP1PORT -fN IP2

            PORT:本地的某个未使用的端口

            IP1:需要让外部主机到达防火墙内部的ip

            IP1PORT:IP1的端口

            IP2:防火墙外部主机的ip

            适用于下列情况,命令在B设备输入,此时C是IP1,A是IP22.png

如果需要实现SSH端口本地转发或者远程转发,先安装telnet-server,安装完成后systemctl start telnet.socket,开启23端口,再telnet下ip,看是否能通,不能通输入指令放开端口iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 


动态端口转发

访问Internet时,可以将本机的1080端口作为代理服务器,访问请求被转发到sshserver上,由sshserver代替访问Internet,比如说我们主机不能直接访问谷歌,如果买了一台国外的虚拟机,由于该虚拟机可以直接访问谷歌,因此我们可以通过该虚拟机访问谷歌,该虚拟可以看作是sshserver,也就是代理

curl --sock5 IP:PORT WEBSITE,用代理的ip访问目标网站


X 协议转发

所有图形化应用程序都是X客户程序

能够通过tcp/ip连接远程X服务器

数据没有加密机,但是它通过ssh连接隧道安全进行


ssh服务器

客户端:ssh,配置文件:/etc/ssh/ssh_config

服务器端:sshd,配置文件:/etc/ssh/sshd_config

常用参数,参数更改后输入指令systemctl restart sshd

Port:服务器端口,连接到互联网上时,为了安全将Port 22改为非标准端口

AddressFamily any:支持ipv4和ipv6地址

listenaddress IP:将Port的端口号监听在ip特定的地址上

Hostkey:公钥私钥算法

LoginGraceTime:登录后多长时间不输入密码将退出

PermitRootLogin:是否允许root账户直接登录

StrictModes:严格模式,是否检查必要文件的权限

MaxAuthTroes:最大尝试次数,次数是此项值的一半

MaxSessions:每一个会话在网络连接里打开最大的次数,比如说CRT窗口右键单击克隆窗口,数值是多少就最多克隆几个会话

AuthorizedkeyFile:基于key验证公钥存放的路径

PasswordAuthentication:关闭后远程无法通过密码登录连接,只能基于key验证登录

PubkeyAuthentication:基于key验证

其它项Kerberos option、GSSAPI options中也是验证,用的不多,可以关闭,加快网络连接

MaxStarups:默认数值10:30:100,因为ssh服务器作为远程管理的,所以该项允许最大连接数为10,10以内时不做任何操作,超过10次将以30%的失败率干扰连接,当连接数到达100次时,再次连接将全部拒绝

ClientAliveInterval:客户端存活间隔,0表示不检测

ClientAliveCountmax:客户端存活检测次数,配合存活间隔项,当秒数达到次数x存活间隔时间的数值时,将自动断开连接

PermitEmptyPasswdords:允许无密码登录,设置为no

Banner:选项后是文本文件,用户登录后显示文本内容

Allowusers USER1 USER2:添加白名单

Denyusers  USER1 USER2:添加黑名单

AllowGroups

DenyGroups

黑白名单都存在的用户也无法登录

ssh服务优化

建议使用非默认端口

禁止使用protocol version 1

限制可登陆用户

设定空闲会话超时时长

利用防火墙设置ssh访问测量

仅监听特定的ip地址

基于口令认证时,使用强密码策略tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 |xargs

使用基于key的验证

禁止使用空密码登录

禁止root用户直接登录

限制ssh的访问频度和并发在线数

经常分析日志,/var/log/secure,多次见到Failed password for root from IP port PORT ssh2时,需要引起注意,可能是有人在恶意猜root口令,放入防火墙


AIDE

高级***检测环境,用于检测所关心文件的特定属性信息

/etc/aide.conf:定义监控的文件以及文件信息3.png

向下翻4.png5.png

定义完规则,aide --init写入aide数据库,如果做比较,cp aide.db.net.gz aide.db.gz,有读入库,可以输入

aide --check做比较


更改身份

su - USER,随着用户切换,shell环境也变

su USER,用户切换,但shell环境不变

配置文件/etc/sudoers

时间戳文件/var/db/sudo,sudo后会在该文件夹下生成一个用户的目录,这个目录生成时间的5分钟以内输入指令不用重新输入口令

日志文件/var/log/secure,记录了用户sudo的操作记录详细信息

USER ALL   =   (ALL)               CMD

用户    哪台设备    代表谁去执行  /路径/命令+参数

/etc/sudoers.d/FILE,文件名任意输入,将授权命令写入该文件也可以其作用

visudo -c 检查/etc/sudoers的错误语法

%GROUP ALL   =   (ALL)         CMD

  哪台设备    代表谁去执行  /路径/命令+参数

%wheel ALL=(ALL) NOPASSWD:ALL,wheel组的用户执行命令时候可以不用输口令,此用法用于编写脚本授权

注:系统默认如果将普通用户加入wheel组,该普通用户将会有和root一样的权限,因此生产中将配置文件中%wheel ALL=(ALL) ALL注释掉6.png

配置文件支持通配符写法,比如说chen ALL=(ALL) /bin/* ,代表允许用户chen执行所有/bin下面的程序

配置文件规则

用户和被代表的用户可以是用户名、#uid、%群组名、%#群组id、用户别名/被代表的用户别名

哪台设备可以用ip、hostname、network、host_alias

命令用命令名、路径、sudoedit、命令别名

sudo别名

别名有四种类型

User_Alias,Runas_Alias,Host_Alias,Cmnd_Alias

别名格式

[A-Z]([A-Z][0-9]_)* ,必须是 A-Z开头,后面可以跟[A-Z]和[0-9]_ 数字  

比如说

User_Alias NETADMIN= chen1,chen2

Cmnd_Alias NETCMD = /usr/sbin/ip,/usr/sbin/usermod

NETADMIN ALL=(root) NETCMD

将内容写入/etc/sudoers.d/FILE,之后用chen1就可sudo chen1 ip...,chen2可以sudo usermod...

sudo选项

-V:显示版本信息等配置信息

-u:user

-l,ll:列出用户在主机上允许和禁止的指令

-v:延长密码有效期限,延长5分钟

-k:清除时间戳,下次登录需要重新输入口令

-K:与-k类似,不过还要删除时间戳文件

-b:在后台执行指令

-p:改变询问密码的提示符号


TCP_Wrappers

工作在第四层(传输层)的TCP协议

用于对有状态连接的特定服务进行安全检测并实现访问控制

以库文件形式实现

某建材是否接受libwrap的控制取决于发起此进程的程序在编译时是否针对libwrap进行编译的

判断服务程序是否能够由tcp_wrapper进行访问控制的方法

ldd /位置/程序 | grep libwrap.so

strings 位置/程序 | grep libwrap.so

配置文件

/etc/host.allow、/etc/host.deny

基本语法

守护进程路径@主机名:客户端ip地址列表,比如说拒绝192.168.1.10访问本机的ssh服务,首先which sshd查看命令路径,/usr/sbin/sshd,之后再/etc/host.deny里写sshd:192.168.1.10,该文件写入后立即生效

except

在/etc/host.allow中写入in.telnetd:172.20. EXCEPT 172.20.112. EXCEPT 172.20.112.224,表明172.20网段可用telnet本主机,除了172.20.112网段的设备,但在这个网段中又除了172.20.112.224的设备,它可以telnet本主机,最后except看作双重否定,即肯定

配置文件选项

/etc/host.allow中写入in.telnetd:172.20. :deny,意思匹配到172.20网段将被拒绝

/etc/host.deny中写入in.telnetd:172.20. :allow,意思匹配到172.20网段将被允许

spawn:当访问某个服务时候,激活另一个命令的执行,比如说in.telnet: ALL :spawn echo "hello"

twist:拒绝访问,使用指定的操作替换当前服务,标准输入输出和错误信息发送到客户端/dev/null,比如说in.telnet: ALL :twist echo "hello",结果是拒绝访问,并显示hello


猜你喜欢

转载自blog.51cto.com/13873498/2176351