当前位置:网站首页>SSH服务详解

SSH服务详解

2022-08-11 05:32:00 欢喜躲在眉梢里

ssh服务的学习框架图为:

目录

一、什么是ssh服务?

1、ssh理解是一个协议,用来远程控制服务器的。

2、在默认状态下,SSH服务主要提供两个服务功能

3、使用什么软件实现ssh——远程登录( openssh)

3.1、OpenSSH是什么

3.2、sshd中d的含义

二、ssh搭建+配置+排错+命令

1、ssh的命令的使用

1.1、sftp是什么

1.2、scp是什么

2、ssh服务的文件配置

2.1、查看、修改ssh服务中的配置文件(配置文件详解)

3、查看sshd服务是否启动

3.1、 查看进程

3.2 看端口(需要知道端口号)

3.3  直接访问

3.4 看日志

4、故障排查

4.1、selinux是什么

4.2、关闭防火墙

三、ssh服务器加固

四、ssh服务远程登录流程


一、什么是ssh服务?

1、ssh是secure shell protocol的简写,是安全的sshll。由 IETF 网络工作小组(Network Working Group )制定。

2、解决了什么问题:在进行数据传输之前,ssh先对联机数据包通过加密技术进行加密处理,加密之后在进行数据传输,确保了传递过程中的数据安全。

1、ssh理解是一个协议,用来远程控制服务器的。

      使用在linux/unix系统里,远程控制服务器。

      remote login program --远程登录程序

      对数据进行加密传输的服务,主要用在远程登录。

      ssh协议是应用层协议,支持的是ssh协议。

      分层:应用层、传输层、网络层、数据链路层、物理层。

      在计算机网络中属于应用层。

因为传统的网络服务程序。如ftp、pop和Telnet在本质上是不安全的,因为它们在网络上用明文传送口令和数据,有心之人会很容易的截取到这些口令和数据。同时,这些服务的安全验证方式是有一定的弱点的,就是很容易受到“中间人”的攻击。所谓的“中间人”的攻击方式,就是"中间人"冒充真正的服务器啦接收你要传给服务器的数据,然后再冒充你把数据传送给真正的服务器。服务器和你之间的数据传送就会被“中间人”“动手脚”修改了一下信息,这样就会出现很严重的问题。

而SSH是专程为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以很有效的防止远程登录管理过程中的信息泄露问题,在当前的生产环境运维工作中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件。

2、在默认状态下,SSH服务主要提供两个服务功能

      n 一个是提供类似于Telnet远程联机服务器的服务,即上面提到的ssh服务。

      n 一个是类似于FTP服务的sftp-server,借助SSH协议来传输数据的,提供更加安全的SFTP服务(vsftp、proftp)。

ssh服务主要是在HP-UX、LINUX 、AIX、UNIX、LRIX、SCO、Mac OS X等系统上都有,但是Windows上没有。

ssh服务连接使用的是22端口,基于tcp协议。

3、使用什么软件实现ssh——远程登录( openssh)

ssh是允许root用户来登录的,Linux上是允许的(如果想要不允许的话:可以修改文件配置

vim /etc/ssh/sshd_config);而在Ubuntu上面是不允许的,但是也可以进行设置)

3.1、OpenSSH是什么

openssh是使用ssh协议进行远程登录的首要连接工具。它对所有通道进行加密,以消除窃听、连接劫持和其他攻击的。此外,OpenSSH是提供了大量的安全隧道功能,几种身份验证方法和复杂的配置选项。是开源免费的,官方学习网站为:http://www.openssh.com/

centos7/8/6安装好系统,是默认安装openssh的,在redhat里也是默认安装的。Ubuntu里有server版本,没有安装的。

可以通过查看进程查看sshd服务和openssh是否已经启动:

[email protected] ~]# ps -aux|grep sshd
root       6633  0.0  0.4 112872  4300 ?        Ss   09:25   0:00 /usr/sbin/sshd -D
root       7850  0.0  0.5 157268  5908 ?        Ss   09:25   0:00 sshd: [email protected]/0
root       7906  0.0  0.0 112824   984 pts/0    R+   09:43   0:00 grep --color=auto sshd
[[email protected] ~]# netstat -anpult|grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6633/sshd           
tcp        0     36 192.168.2.152:22        192.168.2.118:50743     ESTABLISHED 7850/sshd: [email protected] 
[[email protected] system]# rpm -q openssh
openssh-7.4p1-16.el7.x86_64
[[email protected] system]# rpm -qa |grep openssh
openssh-clients-7.4p1-16.el7.x86_64
openssh-7.4p1-16.el7.x86_64
openssh-server-7.4p1-16.el7.x86_64

3.2、sshd中d的含义

d表示守护进程:daemon。一直在内存里运行的程序,除非人为的停止。

ssh daemon :ssh

openssh 提供某些ssh的工具---客户端

openssh-client 客户端程序

openssh-server 服务器端程序

c/s架构的软件。

使用什么软件实现ssh:openssh(Linux中可以实现ssh服务,但是Windows中没有ssh服务):开源免费的。

扩展:

rpm是Linux里的一个软件管理的命令,在redhat/centos里使用没有使用oracle Linux

rpm -q 查询 query

rpm  -a  -all :所有

rpm -qa 查询本机已经安装的所有的软件。

二、ssh搭建+配置+排错+命令

1、ssh的命令的使用

 第一次连接登录需要你输入yes,不是第一次就不需要:第一次登录相当于发送对方的公钥过来。将客户机上sshd守护进程的公钥复制到本地,存放在本地~/.ssh/known_hosts文件中,每行存放一台服务器的公钥,用来验证服务器的身份。

1、 只是进行登录

(1)这是第一次登录:

192.168.2.132登录到192.168.2.152

ssh相当于一个xshell服务。

①ssh 用户名@服务器地址(推荐使用)

[[email protected] ~]# ssh [email protected]  ##连接到192.168.2.152
The authenticity of host '192.168.2.152 (192.168.2.152)' can't be established.
ECDSA key fingerprint is SHA256:+q5FKuWvEqBzdvqWS+7L3pGu5otwv/yepkY1j5iOaCY.
ECDSA key fingerprint is MD5:d1:9e:bd:5f:49:49:37:d8:5d:c6:c3:f8:dd:10:c7:b8.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.2.152' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last failed login: Wed Jul 27 12:09:43 CST 2022 from 192.168.2.132 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Wed Jul 27 11:55:11 2022 from 192.168.2.118

②ssh  服务器地址(不指定登陆用户,默认会使用当前的用户名远程连接)

[[email protected] ~]$ ssh 192.168.0.180

(2)不是第一次登录:192.168.2.152登录到192.168.2.132

③ ssh -l 用户名 服务器地址

[[email protected] ssh]# ssh  -l cali 192.168.1.173
[email protected]'s password:
Last login: Wed Jul 27 12:01:25 2022 from 192.168.1.101
[[email protected] ~]$ exit
登出

①ssh:远程登录

远程登录的命令

④ ssh -p   端口号 ip地址            # -p :port:指定端口号 

[[email protected] ~]# ssh  -p 22 [email protected]
Last login: Fri Jul 29 16:12:45 2022 from 192.168.2.123

2、运行远程机器上的脚本或者命令

(1)在远程机机上创建文件夹。(mkdir)

[[email protected] .ssh]# ssh 192.168.0.180  mkdir  /luogg{1..10}
[[email protected] .ssh]# ssh 192.168.0.180  sudo mkdir  /danyh{1..10}

(2)在远程机上执行脚本文件

[[email protected] .ssh]# ssh 192.168.0.180  sudo bash /lianxi/scan_lan_ip.sh

1.1、sftp是什么

sftp是基于ssh协议的ftp功能,底层使用的是ssh协议。提供的是文件的上传和下载(远程登录到另外一台机器上进行文件的上传和下载)

sftp 用户名@远程主机ip地址

[[email protected] ssh]# sftp [email protected]
[email protected]'s password: 
Connected to 192.168.2.132.

进行文件的上传和下载操作:以下指令操作是在使用sftp文件操作之后执行的
pwd:是查看远程机上的所在路径

lpwd:是查看本机所在路径

!ls:是查看本机所在路径里面的文件

cd:是切换远程机的路径

lcd:是切换本机的路径

get + 文件:下载

put + 文件:上传

put -r +文件夹 上传文件夹

exit 退出

sftp> pwd        查看远程机上所在路径
Remote working directory: /root
sftp> lpwd   查看本机所在路径
Local working directory: /etc/ssh
sftp> !ls    查看本机所在路径里面的文件
boot	    sshd_config		ssh_host_ecdsa_key.pub	  ssh_host_rsa_key
moduli	    sshd_config.bak	ssh_host_ed25519_key	  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key	ssh_host_ed25519_key.pub
sftp> cd
sftp> lcd
sftp> get +文件:下载
sftp> put  +文件:上传
sftp> put -r +文件夹 上传文件夹
sftp> put  -r grub2 :上传grub2文件夹
sftp> exit    退出

1.2、scp是什么

scp是远程拷贝 ,底层是通过ssh协议远程连接到其他机器上,复制文件。

scp:s:ssh   cp:copy

 scp命令推送文件在linux服务器之间。

1、复制远程机上的文件到本机。 scp -r   用户名+远程机ip: 复制文件需要接-r选项

将192.168.2.132的root用户的/boot文件复制到当前用户/etc/ssh。就可以看到当前用户下的ssh文件里面就有boot文件。

[[email protected] ssh]# scp -r [email protected]:/boot /etc/ssh
                        源     目的地       
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
[[email protected] ssh]# ls
boot        sshd_config         ssh_host_ecdsa_key.pub    ssh_host_rsa_key
moduli      sshd_config.bak     ssh_host_ed25519_key      ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key.pub

2、在远程机上创建文件:

[[email protected] lianxi9]# scp mkdir.sh [email protected]:/root
mkdir.sh                                                      100%   42    10.9KB/s   00:00    

3、复制本机上的文件到远程机上。

将/etc/passwd 复制到192.168.1.173机器上的cali用户的家目录下。

[[email protected] ssh]# scp -r /etc/passwd  [email protected]:~
[email protected]'s password:
passwd                                                                                     100% 1692   745.6KB/s   00:00

4、在远程机上执行脚本。

cat ctrl_mysql.sh   实现传递脚本到服务器,然后执行传递过去脚本

在远程机上创建文件夹的脚本。

[[email protected] lianxi9]# cat mkdir.sh    是具体需要做什么工作的脚本
for i in {1..10}
do
	mkdir -p feng$i
done

在本机上编写脚本实现传递脚本到服务器,然后执行传递过去脚本。

[[email protected] lianxi9]# cat ctrl_mysql.sh   实现传递脚本到服务器,然后执行传递过去脚本
for i in {1..100}
do
	scp  /lianxi9/mkdir.sh [email protected]$i:/root
	ssh [email protected]$i bash /root/mkdir.sh
done

2、ssh服务的文件配置

ssh服务的配置文件存放在:/etc/ssh

配置文件:给进程传递参数的。

[[email protected] ssh]# cd /etc/ssh/
sshd_config  --》服务器端的配置文件  server   --》进程:sshd 
ssh_config --》ssh命令使用的配置文件 client  --》进程:ssh
ssh_host_ecdsa_key.pub  --》ecdsa加密算法的公钥
ssh_host_ecdsa_key    --》ecdsa加密算法的私钥

2.1、查看、修改ssh服务中的配置文件(配置文件详解)

1、查看配置文件:

#pam认证模块 --》配置路径/etc/pam.d 这个目录下面存放的是每个需要认证的服务的配置,文件名就是服务名

UseDNS yes #是否将客户端主机名解析为ip

#此过程不顺利的话,会非常的慢,会影响登陆认证的速度,可以将其设置为no

[[email protected] etc]# vim /etc/ssh/sshd_config  (修改文件,传递参数)
Port 22                                 #修改默认监听端口(默认22端口)
#AddressFamily any
ListenAddress 0.0.0.0    ##表示可以连接的ip地址:0.0.0.0表示在本机上的任意ip都可以访问
#ListenAddress ::

HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO

# Authentication:
........
#LoginGraceTime 2m
 #设置为运行root用户登录:yes,no就是不允许用户使用root用户进行登录。
PermitRootLogin yes   ##允许root用户登陆,默认为yes   
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes  ##是否开启公钥认证
#UsePAM yes #使用pam认证 
....

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes   #允许密码验证登录

#UseDNS yes  #是否将客户端主机名解析为ip

sshd_config --->sshd服务端的进程

ssh_config ----》ssh客户端命令的配置文件

2、配置文件(/etc/ssh/sshd/config)里面的详解:

denyusers:禁止登录的用户

maxauth tries 6:表示最多能输6次密码。

端口号不能随意更改:因为端口号的范围是从0到65535(2^16次)。

 修改配置文件之后(永久修改),根据自己的需求进行修改,修改完成之后需要重启进程:(service sshd restart)

扩展:重启的过程就是kill之前的进程,然后重新启动一个新的进程。

3、重启sshd

三个方法选择其一:

[[email protected] ssh]# service sshd restart
[[email protected] ssh]#systemctl restart sshd
[[email protected] ssh]#restart sshd. service

===扩展===

tail -f secure 盯着文件的末尾看。


[[email protected] log]# grep "Failed password" secure    查看哪些登录失败的

lastlog:查看哪些登录的用户。

[[email protected] ssh]# lastlog
用户名           端口     来自             最后登陆时间
root             pts/3    192.168.2.123    五 7月 29 16:12:45 +0800 2022
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**

 如何查看哪些是开机启动的:systemctl list-unit-files

[[email protected] ~]# systemctl list-unit-files
UNIT FILE                                     STATE   
proc-sys-fs-binfmt_misc.automount             static  
dev-hugepages.mount                           static  
dev-mqueue.mount                              static  
proc-sys-fs-binfmt_misc.mount                 static  
sys-fs-fuse-connections.mount                 static  
sys-kernel-config.mount                       static  
sys-kernel-debug.mount                        static  
tmp.mount                                     disabled
brandbot.path                                 disabled
systemd-ask-password-console.path             static  
systemd-ask-password-plymouth.path            static  
systemd-ask-password-wall.path                static  

其中 enabled 表示开机就可以启动的,

disabled是不能启动的。

static表示该服务与其他服务相关联,不能单独设置该服务的启动状态,为其他的需要使用的提供支持。

4、设置sshd服务开机自启

systemctl enable sshd 设置开机自启

[[email protected] ~]# systemctl enable sshd  设置开机自启
查看和设置默认的 target   :systemctl get-default
[[email protected] ~]# systemctl get-default    取得目前的 target(运行级别)
multi-user.target
[[email protected] ~]# cd /etc/systemd/system
[[email protected] system]# ll
总用量 4
drwxr-xr-x. 2 root root   57 2月  26 18:01 basic.target.wants
lrwxrwxrwx. 1 root root   46 2月  26 18:01 dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root   57 2月  26 18:01 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   37 2月  26 18:06 default.target -> /lib/systemd/system/multi-user.target

3、查看sshd服务是否启动

1、看进程

2、看端口  

3、直接访问 

4、看日志

3.1、 查看进程

ps -aux |grep ssh或者 ps -ef|grep ssh

1、查看进程
[[email protected] acl]# ps -ef |grep ssh  查看进程
root       6858      1  0 09:28 ?        00:00:00 /usr/sbin/sshd -D
root       7379   6858  0 09:29 ?        00:00:00 sshd: [email protected]/0
root       7398   6858  0 09:29 ?        00:00:00 sshd: [email protected]/1
root       8020   7722  0 11:37 pts/1    00:00:00 grep --color=auto ssh
[[email protected] acl]# pidof sshd 查看进程号,有就已经启动
7398 7379 6858 

3.2 看端口(需要知道端口号)

lsof -i:端口号、netstat -anplut |grep 端口号 

[[email protected] acl]# lsof -i:22   查看端口号的(需要知道端口号)
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    6858 root    3u  IPv4  37869      0t0  TCP *:ssh (LISTEN)
sshd    6858 root    4u  IPv6  37878      0t0  TCP *:ssh (LISTEN)
sshd    7379 root    3u  IPv4  39374      0t0  TCP localhost.localdomain:ssh->192.168.119.1:50371 (ESTABLISHED)
sshd    7398 root    3u  IPv4  39493      0t0  TCP localhost.localdomain:ssh->192.168.119.1:50374 (ESTABLISHED)
[[email protected] acl]# netstat -atpln |grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6858/sshd           
tcp        0     36 192.168.119.137:22      192.168.119.1:50374     ESTABLISHED 7398/sshd: [email protected] 
tcp        0      0 192.168.119.137:22      192.168.119.1:50371     ESTABLISHED 7379/sshd: [email protected] 
tcp6       0      0 :::22                   :::*                    LISTEN      6858/sshd

0.0.0.0:22表示在本机所有ip上监听22端口。

0.0.0.0:* 表示允许任意ip,任意端口客户端来连接。

3.3  直接访问

直接输入ssh  +目标主机地址 的登录指令。

3.4 看日志

日志文件存放路径:/var/log/secure

 /var/log:系统的所有日志存放位置,里面存放的文件为:

/var:-----variable 变量

/etc:--诸如此类,其他

log:日志

①bot里面存放启动,②messages里面存放普通,③secure存放与安全相关:存放④audit:安全审计服务

/var/log/secure 里会记录sudo执行的命令,可以查询到。

/var/log/audit 安全审计相关服务日志(audit.log)

auditctl

Linux的audit审计系统是提供系统中上事件的各种动作和事件,比如系统调用,文件修改,执行的程序。(只用于记录,不会进行安全问题组织)

audit的学习网站:https://zhuanlan.zhihu.com/p/337289840

扩展知识点:

查看命令属于哪个包:

[email protected] ~]# ①which netstat  #找到命令的绝对路径
/usr/bin/netstat
[[email protected] ~]# rpm -qf /usr/bin/netstat  #查看这个绝对路径执行文件属于哪个包
net-tools-2.0-0.51.20160912git.el8.x86_64
②或者yum provides netstat

所有的服务都是一个程序:

ssh中关闭服务,客户端连接还在 systemctl stop sshd。

4、故障排查

如果修改配置文件之后,重启也没生效的话,就需要进行排查。建议进行关闭selinux和防火墙。

4.1、selinux是什么

selinux是Linux系统里的一套安全机制,用来保护Linux系统的安全,会限制进程去做某些对安全有威胁的事情,永久修改selinux的策略为disable。

1、getenforce:查看selinux的状态,临时修改selinux的策略。

[[email protected] ssh]# getenforce
Disabled  (如果是enforcing,要修改为disable)
[[email protected] ssh]# setenforce 0   #临时调整selinux的策略为宽容模式
[[email protected] ssh]# getenforce
Permissive

2、永久修改selinux的策略:修改配置文件:

[[email protected] selinux]# cat /etc/selinux/config (可以在/etc/selinux/config文件下面进行永久修改)
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

4.2、关闭防火墙

修改完之后,需要关闭防火墙。systemctl disable firewalld或者service  disable firewalld。

[email protected] ssh]# systemctl firewalld stop  关闭防火墙
Redirecting to /bin/systemctl stop firewalld.service

经常需要给openssh进行升级,如何保证Linux系统的安全?

yum update openssh openssh-clients openssh-server

三、ssh服务器加固

①修改端口

②禁用root用户

③ 升级openssh

④秘钥认证:需要进行配置

⑤密码认证:默认开启的:经常更换密码+设置复杂的密码

比如禁用root用户:

前提条件是PermitRootLogin no 允许用户登录设置为no:

 指定root用户去xshell中登录sshd的登录不了(因为设置了不允许root用户登录),而在xshell中使用普通用户先登录进去之后,再切换成root用户登录之后就能登录的原因:因为使用普通用户登录xshell之后已经进入了Linux系统里面,再使用su -root切换到root用户的时候不需要进过ssh登录认证,因为它已经进入到bash进程中了。

四、ssh服务远程登录流程

1、登录流程图为:

ssh服务登录流程详解:一个客服端client(xshel)通过使用用户名(root)和密码(123456)进行登录的话,通过sshd服务进行登录认证:sshd服务会去sshd_config文件下面查看是否允许root用户登录,如果允许的话,就会去Linux系统中(server)的/etc/passwd 和/etc/shadow文件中查看输入的用户名和密码是否正确。本地登录访问的是Linux系统里面的/etc/passwd 和/etc/shadow,不需要进行ssh服务登录认证。

2、扩展:如何将一个连接到自己的ssh的普通用户踢出去:杀死其所对应的进程。

根据终端号找到对应的bash进程,然后kill进程。比如:

[[email protected] system]# w (查看到连接的用户)
 11:37:20 up  2:12,  4 users,  load average: 0.00, 0.03, 0.05
USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
root     tty1                      09:39    1:57m  0.01s  0.01s -bash
root     pts/0    192.168.2.118    09:25    0.00s  0.03s  0.00s w
root     pts/1    192.168.2.118    10:14    9:12   0.06s  0.06s -bash
root     pts/2    192.168.2.144    11:37   18.00s  0.00s  0.00s -bash
[[email protected] system]# ps -aux|grep bash (查看bash进程:pts/2,对应的终端号是:8591)
root       7852  0.0  0.2 115676  2048 pts/0    Ss   09:25   0:00 -bash
root       7879  0.0  0.2 115668  2072 tty1     Ss+  09:39   0:00 -bash
root       8081  0.0  0.2 115756  2228 pts/1    Ss+  10:14   0:00 -bash
root       8591  0.0  0.2 115672  2080 pts/2    Ss+  11:37   0:00 -bash
root       8609  0.0  0.0 112824   988 pts/0    R+   11:38   0:00 grep --color=auto bash
[[email protected] system]# kill -9 8591  (杀死对应的进程),连接上的用户就会马上断开
[[email protected] ~]#    连接断开的样子:
Connection closed.

下一篇将会详细讲解ssh服务的两种登录方式。 

原网站

版权声明
本文为[欢喜躲在眉梢里]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_52165864/article/details/126028681