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服务远程登录流程
1、ssh是secure shell protocol的简写,是安全的sshll。由 IETF 网络工作小组(Network Working Group )制定。
2、解决了什么问题:在进行数据传输之前,ssh先对联机数据包通过加密技术进行加密处理,加密之后在进行数据传输,确保了传递过程中的数据安全。
使用在linux/unix系统里,远程控制服务器。
remote login program --远程登录程序
对数据进行加密传输的服务,主要用在远程登录。
ssh协议是应用层协议,支持的是ssh协议。
分层:应用层、传输层、网络层、数据链路层、物理层。
在计算机网络中属于应用层。
因为传统的网络服务程序。如ftp、pop和Telnet在本质上是不安全的,因为它们在网络上用明文传送口令和数据,有心之人会很容易的截取到这些口令和数据。同时,这些服务的安全验证方式是有一定的弱点的,就是很容易受到“中间人”的攻击。所谓的“中间人”的攻击方式,就是"中间人"冒充真正的服务器啦接收你要传给服务器的数据,然后再冒充你把数据传送给真正的服务器。服务器和你之间的数据传送就会被“中间人”“动手脚”修改了一下信息,这样就会出现很严重的问题。
而SSH是专程为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以很有效的防止远程登录管理过程中的信息泄露问题,在当前的生产环境运维工作中,绝大多数企业普遍采用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协议。
ssh是允许root用户来登录的,Linux上是允许的(如果想要不允许的话:可以修改文件配置
vim /etc/ssh/sshd_config);而在Ubuntu上面是不允许的,但是也可以进行设置)
openssh是使用ssh协议进行远程登录的首要连接工具。它对所有通道进行加密,以消除窃听、连接劫持和其他攻击的。此外,OpenSSH是提供了大量的安全隧道功能,几种身份验证方法和复杂的配置选项。是开源免费的,官方学习网站为:http://www.openssh.com/
centos7/8/6安装好系统,是默认安装openssh的,在redhat里也是默认安装的。Ubuntu里有server版本,没有安装的。
可以通过查看进程查看sshd服务和openssh是否已经启动:
root@nginx-kafka01 ~]# 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: root@pts/0
root 7906 0.0 0.0 112824 984 pts/0 R+ 09:43 0:00 grep --color=auto sshd
[root@nginx-kafka01 ~]# 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: root@pts
[root@nginx-kafka01 system]# rpm -q openssh
openssh-7.4p1-16.el7.x86_64
[root@nginx-kafka01 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
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 查询本机已经安装的所有的软件。
第一次连接登录需要你输入yes,不是第一次就不需要:第一次登录相当于发送对方的公钥过来。将客户机上sshd守护进程的公钥复制到本地,存放在本地~/.ssh/known_hosts文件中,每行存放一台服务器的公钥,用来验证服务器的身份。
1、 只是进行登录
(1)这是第一次登录:
192.168.2.132登录到192.168.2.152
ssh相当于一个xshell服务。
①ssh 用户名@服务器地址(推荐使用)
[root@nginx-kafka02 ~]# 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 服务器地址(不指定登陆用户,默认会使用当前的用户名远程连接)
[daijun@manager161 ~]$ ssh 192.168.0.180
(2)不是第一次登录:192.168.2.152登录到192.168.2.132
③ ssh -l 用户名 服务器地址
[root@localhost 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
[cali@nginx-kafka01 ~]$ exit
登出
①ssh:远程登录
远程登录的命令
④ ssh -p 端口号 ip地址 # -p :port:指定端口号
[root@nginx-kafka01 ~]# ssh -p 22 [email protected]
Last login: Fri Jul 29 16:12:45 2022 from 192.168.2.123
2、运行远程机器上的脚本或者命令
(1)在远程机机上创建文件夹。(mkdir)
[root@manager161 .ssh]# ssh 192.168.0.180 mkdir /luogg{1..10}
[root@manager161 .ssh]# ssh 192.168.0.180 sudo mkdir /danyh{1..10}
(2)在远程机上执行脚本文件
[root@manager161 .ssh]# ssh 192.168.0.180 sudo bash /lianxi/scan_lan_ip.sh
sftp是基于ssh协议的ftp功能,底层使用的是ssh协议。提供的是文件的上传和下载(远程登录到另外一台机器上进行文件的上传和下载)
sftp 用户名@远程主机ip地址
[root@nginx-kafka01 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 退出
scp是远程拷贝 ,底层是通过ssh协议远程连接到其他机器上,复制文件。
scp:s:ssh cp:copy
scp命令推送文件在linux服务器之间。
1、复制远程机上的文件到本机。 scp -r 用户名+远程机ip: 复制文件需要接-r选项
将192.168.2.132的root用户的/boot文件复制到当前用户/etc/ssh。就可以看到当前用户下的ssh文件里面就有boot文件。
[root@nginx-kafka01 ssh]# scp -r [email protected]:/boot /etc/ssh
源 目的地
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
[root@nginx-kafka01 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、在远程机上创建文件:
[root@manager161 lianxi9]# scp mkdir.sh [email protected]:/root
mkdir.sh 100% 42 10.9KB/s 00:00
3、复制本机上的文件到远程机上。
将/etc/passwd 复制到192.168.1.173机器上的cali用户的家目录下。
[root@localhost ssh]# scp -r /etc/passwd [email protected]:~
[email protected]'s password:
passwd 100% 1692 745.6KB/s 00:00
4、在远程机上执行脚本。
cat ctrl_mysql.sh 实现传递脚本到服务器,然后执行传递过去脚本
在远程机上创建文件夹的脚本。
[root@manager161 lianxi9]# cat mkdir.sh 是具体需要做什么工作的脚本
for i in {1..10}
do
mkdir -p feng$i
done
在本机上编写脚本实现传递脚本到服务器,然后执行传递过去脚本。
[root@manager161 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
ssh服务的配置文件存放在:/etc/ssh
配置文件:给进程传递参数的。
[root@nameserver ssh]# cd /etc/ssh/
sshd_config --》服务器端的配置文件 server --》进程:sshd
ssh_config --》ssh命令使用的配置文件 client --》进程:ssh
ssh_host_ecdsa_key.pub --》ecdsa加密算法的公钥
ssh_host_ecdsa_key --》ecdsa加密算法的私钥
1、查看配置文件:
#pam认证模块 --》配置路径/etc/pam.d 这个目录下面存放的是每个需要认证的服务的配置,文件名就是服务名
UseDNS yes #是否将客户端主机名解析为ip
#此过程不顺利的话,会非常的慢,会影响登陆认证的速度,可以将其设置为no
[root@nginx-kafka01 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
三个方法选择其一:
[root@nginx-kafka01 ssh]# service sshd restart
[root@nginx-kafka01 ssh]#systemctl restart sshd
[root@nginx-kafka01 ssh]#restart sshd. service
===扩展===
tail -f secure 盯着文件的末尾看。
[root@nginx-kafka01 log]# grep "Failed password" secure 查看哪些登录失败的
lastlog:查看哪些登录的用户。
[root@nginx-kafka01 ssh]# lastlog
用户名 端口 来自 最后登陆时间
root pts/3 192.168.2.123 五 7月 29 16:12:45 +0800 2022
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
如何查看哪些是开机启动的:systemctl list-unit-files
[root@sc-mysql ~]# 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 设置开机自启
[root@nginx-kafka01 ~]# systemctl enable sshd 设置开机自启
查看和设置默认的 target :systemctl get-default
[root@nginx-kafka01 ~]# systemctl get-default 取得目前的 target(运行级别)
multi-user.target
[root@nginx-kafka01 ~]# cd /etc/systemd/system
[root@nginx-kafka01 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
1、看进程
2、看端口
3、直接访问
4、看日志
ps -aux |grep ssh或者 ps -ef|grep ssh
1、查看进程
[root@localhost 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: root@pts/0
root 7398 6858 0 09:29 ? 00:00:00 sshd: root@pts/1
root 8020 7722 0 11:37 pts/1 00:00:00 grep --color=auto ssh
[root@localhost acl]# pidof sshd 查看进程号,有就已经启动
7398 7379 6858
lsof -i:端口号、netstat -anplut |grep 端口号
[root@localhost 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)
[root@localhost 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: root@pts
tcp 0 0 192.168.119.137:22 192.168.119.1:50371 ESTABLISHED 7379/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 6858/sshd
0.0.0.0:22表示在本机所有ip上监听22端口。
0.0.0.0:* 表示允许任意ip,任意端口客户端来连接。
直接输入ssh +目标主机地址 的登录指令。
日志文件存放路径:/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
扩展知识点:
查看命令属于哪个包:
root@sanchuang ~]# ①which netstat #找到命令的绝对路径
/usr/bin/netstat
[root@sanchuang ~]# rpm -qf /usr/bin/netstat #查看这个绝对路径执行文件属于哪个包
net-tools-2.0-0.51.20160912git.el8.x86_64
②或者yum provides netstat
所有的服务都是一个程序:
ssh中关闭服务,客户端连接还在 systemctl stop sshd。
如果修改配置文件之后,重启也没生效的话,就需要进行排查。建议进行关闭selinux和防火墙。
selinux是Linux系统里的一套安全机制,用来保护Linux系统的安全,会限制进程去做某些对安全有威胁的事情,永久修改selinux的策略为disable。
1、getenforce:查看selinux的状态,临时修改selinux的策略。
[root@nginx-kafka01 ssh]# getenforce
Disabled (如果是enforcing,要修改为disable)
[root@nginx-kafka01 ssh]# setenforce 0 #临时调整selinux的策略为宽容模式
[root@nginx-kafka01 ssh]# getenforce
Permissive
2、永久修改selinux的策略:修改配置文件:
[root@nginx-kafka01 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
修改完之后,需要关闭防火墙。systemctl disable firewalld或者service disable firewalld。
root@localhost ssh]# systemctl firewalld stop 关闭防火墙
Redirecting to /bin/systemctl stop firewalld.service
经常需要给openssh进行升级,如何保证Linux系统的安全?
yum update openssh openssh-clients openssh-server
①修改端口
②禁用root用户
③ 升级openssh
④秘钥认证:需要进行配置
⑤密码认证:默认开启的:经常更换密码+设置复杂的密码
比如禁用root用户:
前提条件是PermitRootLogin no 允许用户登录设置为no:
指定root用户去xshell中登录sshd的登录不了(因为设置了不允许root用户登录),而在xshell中使用普通用户先登录进去之后,再切换成root用户登录之后就能登录的原因:因为使用普通用户登录xshell之后已经进入了Linux系统里面,再使用su -root切换到root用户的时候不需要进过ssh登录认证,因为它已经进入到bash进程中了。
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进程。比如:
[root@nginx-kafka01 system]# w (查看到连接的用户)
11:37:20 up 2:12, 4 users, load average: 0.00, 0.03, 0.05
USER TTY FROM LOGIN@ 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
[root@nginx-kafka01 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
[root@nginx-kafka01 system]# kill -9 8591 (杀死对应的进程),连接上的用户就会马上断开
[root@xieshan ~]# 连接断开的样子:
Connection closed.
下一篇将会详细讲解ssh服务的两种登录方式。