SSH服务相关知识

SSH 远程连接服务器基础

远程连接服务器

分类:

文字接口连接服务器:SSH(加密)、telnet(明文传输)……

图形接口连接服务器:VNC(明文)、XDMCP(明文)、XRDP(明文)……

本文主要讲述SSH文字接口的远程连接服务器。

什么是SSH?

SSH(secure shellprotocol)是基于TCP连接通过加密技术传输数据包的一种网络传输协议。因为在进行网络传输过程中使用加密技术,所以它的出现很快取代了传统的telnet等基于明文传输的协议。

在Redhat Linux系统中默认使用openssh,openssh-server、openssh-clients三个软件包提供ssh服务。其中openssh包提供SSH客户端和服务端通用的文件;openssh-clients提供常用的ssh、scp、sftp等常用的命令;openssh-server软件包主要提供SSH服务器使用的配置文件和守护进程等文件。

SSH协议提供两种服务功能:

1 远程连接服务器:类似telnet服务器的(安全)远程连接服务器

2 类似FTP的sftp-server,提供更安全的FTP服务

SSH服务器工作原理

SSH服务提供两种不同的用户登录认证方式:

基于口令的认证方式

基于key的认证方式

两种认证方式的工作原理不太相同,这里简单介绍一下。

基于口令的认证方式

1  客户端发起ssh 请求,服务器会把自己的公钥发送给用户

2  用户会根据服务器发来的公钥对密码进行加密

3  加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于key的认证方式

1  首先在客户端生成一对密钥(ssh-keygen) )

2  并将客户端的公钥ssh-copy-id  拷贝到服务端

3  当客户端再次发送一个连接请求,包括ip 、用户名

4  服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP 和用户,就会随机生成一个字符串,例如:acdf

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

6  得到服务端发来的消息后,客户端会使用私钥进行解密得到字符串

7 客户端将解密后的字符串使用服务器公钥加密后发送给服务端

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

SSHD守护进程

SSH服务器之所以能够被连接,就是因为守护进程的存在。在我们的各大Linux发行版本中默认已经安装了SSH所需要的软件。默认也为启动状态,所以我们无需做什么配置就可以直接去启动了。启动的守护进程名字为sshd(SSH daemon)


[[email protected]  ssh]# /etc/init.d/sshd  [start|status|restart]  管理守护进程

[[email protected]  ssh]# ss -tnlup |grep ssh  查看进程

tcp    LISTEN      0      128                   :::22                   :::*      users:(("sshd",2043,4))

tcp    LISTEN      0      128                    *:22                    *:*      users:(("sshd",2043,3))

前面曾提到SSH 提供两大功能,一个远程连接,一个为SFTP。这两个功能使用同一守护进程,而且都是架构在默认的22端口上面。能远程登录至SSH的客户端有很多。Linux用户可以直接使用openssh-clients提供的命令工具进行远程登录无需使用其他额外软件。在windows系统中能作为SSH客户端的工具软件也很多比如putty工具包,xmanager,以及SecureCRSecureFXPortable软件。这三个软件包提供不仅支持远程登录而且可以支持sftp,xmanager软件包也支持使用图形接口来远程连接SSH服务器。

命令工具

SSH中默认的工具由openssh-clients包提供,有ssh、scp、sftp、ssh-add、slogin、ssh-agent、ssh-copy-id、ssh-keyscan命令。

ssh命令

这个命令应该被大家所熟知了,下面介绍一下该命令工具的使用


ssh  [–pf] [email protected] [command]

选项:

-f 不能录远程主机,而发送一个命令给远程主机

-p 指定非标准端口(22)


[[email protected]  ssh]# ssh –p 2222 [email protected]  以非标准端口2222连接,登录用户名yzh

[email protected]‘s  password:

Last  login: Wed Sep 13 08:33:46 2017 from 192.168.2.1

welcome

[[email protected]  ~]$ exit 退出当前ssh连接

logout

Connection  to 172.18.11.7 closed.

[[email protected]  ssh]# ssh 172.18.11.7  以默认的端口和当前的账号连接


注意:如果不写用户名需保证远程主机也有当前所用的账户名


[[email protected]  ssh]# ssh [email protected] hostname 登录远程主机执行命令后离开

[email protected]‘s  password:

centos7.magedu.com

[[email protected]  ssh]# ssh –f [email protected] find / &>~/find1.log  登录远程主机执行命令,立刻回到本地主机工作

[email protected]‘s  password:

centos7.magedu.com

scp命令

scp命令用于异地的文件直接复制。


scp  [-pr] [-l 速率] file [email protected]:dir    #上传

scp  [-pr] [-l 速率]  [email protected]:dir  file   #下载

选项

-p 保留文件权限属性

-r 递归方式复制,用于复制目录

-l 可以限制传输速率,单位默认为kb/s


[[email protected]  ~]# scp -p test [email protected]:

#复制test到远程主机yzh的家目录下并保留其权限,不指定目录默认保存在用户家目录

[[email protected]  ~]# scp -pr [email protected]:/etc/ssh  /app/ssh

#递归复制远程主机的ssh配置文件目录到本机的/app目录下


注意:在使用scp进行下载操作时需要知道该文件在远程主机的具体路径

-l选项一般在生产环境使用,避免复制超大文件操作时过度的占用网络带宽

sftp命令

该命令与ssh登录远程主机的命令一致可指定端口,用户名,ip等。登录到远程主机后模拟ftp操作,可用于上传或者下载文件


[[email protected]  ~]# sftp  [email protected]   登录远程主机

sftp>   #登录成功后会出现如下提示符

以sftp登录远程主机可执行的命令可分为以下几种:

针对远程主机的命令

文件相关:cd、ls|dir、mkdir、rmdir、pwd、rm、rename  ln(建立连接文件)

权限相关:chown、chgrp、chmod、

针对本机的的命令

(针对本机的命令一般使用时在命令前加l或者L)

Lcd、lls、lmkdir、lpwd等

针对复制操作的命令

上传 :put  [本机文件] [远程文件路径] 如果不指定远程文件路径则存在当前路径

下载:get [远程文件路径] [本机文件路径] 不指定本机路径则存储在当前目录在这里也可使用统配符,如get *; get  *.sh

退出命令

exit bye quit


[[email protected]  ~]# sftp [email protected]

Connecting  to 172.18.11.7...

[email protected]‘s  password:

sftp>  ls –l

drwxr-xr-x    5 root      root           87 Sep 13 15:01 workspace

sftp>  cd workspace/test

sftp>  ls

1.txt   10.txt   2.txt   3.txt   4.txt    5.txt   6.txt   7.txt    8.txt   9.txt

sftp>  lcd /app/test  本地主机切换到/app/test目录

sftp>  get *.txt    下载所有txt文件

Fetching  /root/workspace/test/1.txt to 1.txt

……….

Fetching  /root/workspace/test/9.txt to 9.txt

sftp>  bye

[[email protected]  test]# ls /app/test/

10.txt  1.txt   2.txt  3.txt  4.txt   5.txt  6.txt  7.txt   8.txt  9.txt

SSH高级用法

基于key的验证方式实现

基于key的验证方式可以使运维人员在生产环境中摆脱多次输入口令和口令过多难以管理的弊端。也是自动化运维实现的基础。基于的key的工作原理前文已讲述。该方式的安全性由ssh客户端的私钥的保密性来决定。


[[email protected]  ~]# ssh-keygen -t rsa

Generating  public/private rsa key pair.

Enter  file in which to save the key (/root/.ssh/id_rsa):

Created  directory ‘/root/.ssh‘.

Enter  passphrase (empty for no passphrase):      #输入私钥的加密口令可直接回车

Enter  same passphrase again:

[[email protected]  ~]# ls .ssh/  #公钥私钥文件所在路径

id_rsa  id_rsa.pub

[[email protected]  ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]

#复制公钥到远程主机

The  authenticity of host ‘172.18.11.7 (172.18.11.7)‘ can‘t be established.

RSA  key fingerprint is 4b:8c:52:ee:1c:e9:12:3e:7b:5d:3c:43:1b:2e:af:85.

Are  you sure you want to continue connecting (yes/no)? yes

Warning:  Permanently added ‘172.18.11.7‘ (RSA) to the list of known hosts.

[email protected]‘s  password:

Now  try logging into the machine, with "ssh ‘[email protected]‘", and  check in:

.ssh/authorized_keys

to  make sure we haven‘t added extra keys that you weren‘t expecting.

[[email protected]  ~]# ssh [email protected]  #连接远程主机

Enter  passphrase for key ‘/root/.ssh/id_rsa‘:    #输入私钥加密口令

Last  login: Wed Sep 13 15:00:50 2017

welcome

这时可以直接远程主机了,但是如果管理多台远程主机,重复的输入私钥机密口令也是一件很繁琐的时。去除其口令保密性得不到保证。为了解决这一问题ssh服务提供有代理功能,可以把私钥的加密口令托管给代理,输入一次口令即可。


[[email protected]  ~]# ssh-agent bash

[[email protected]  ~]# ssh-add

Enter  passphrase for /root/.ssh/id_rsa:

Identity  added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

[[email protected]  ~]# ssh [email protected]

Last  login: Wed Sep 13 15:18:20 2017 from 172.18.11.6

服务端配置文件

/etc/ssh/sshd_config

在对主配置文件进行操作之前首先进行备份

[[email protected] ~]# cp  /etc/ssh/sshd_config{,.bak}

配置文件详解

Port22   默认使用22这个标准端口。也可使用其他端口或者多个端口

如果要使用多个端口时还要使用默认端口,需把默认端口配置的注释去掉

Protocol 协议版本

#ListenAddress 0.0.0.0   监听的ip地址,如果一个主机配置有多个ip,这里可以设置通过那个ip地址进行ssh连接

# LoginGraceTime 2m  #在进行ssh连接时,没有输入密码的超时时间,超过该时间会断开。默认单位为秒。

# PermitRootLogin yes  允许root用户ssh登录 默认为允许,建议设为no

# LogLevel INFO  日志等级

# StrictModes yes  是否检查用户家目录的.ssh目录下的权限。某些特殊情况权限不符合不允许登录或者发出警告

# PermitEmptyPasswords no 是否允许空密码登录,建议改为no

# PasswordAuthentication yes  #是否允许口令认证,如果基于key的验证配置完成可以关掉

# UsePAM yes 是否使用PAM模块,建议使用

# X11Forwarding yes

# X11UseLocalhost yes    X-windows的设置,是否允许图形窗口的数据通过ssh传送,建议开启。该选项牵扯到一个ssh的高级应用。作者近期会写一个关于该高级应用的博文。

#PermitMotd yes  登录后是否显示一些信息,建议不显示。越少的输出,系统就越安全。

#PrintLastLog yes 显示上次登录的信息

#TCPKeepAlive yes   SSH链接成功之后服务器端会一直发送tcp报文给客户端用以确认客户端是否还在连接;如果中间网络情况复杂的情况下,比如延迟过高或者路由暂停,服务器会中断连接。在网络情况不稳定的环境建议设为no

# MaxStartups 10 同时允许几个尚未登录的连接界面。就是已连接未输入密码的界面

#ClientAliveInterval( 单位: 秒)

#ClientAliveCountMax( 默认3)

# DenyUsers 设置被限制登录的用户列表

# DenyGroups 设置被限制登录的组列表

# AllowUsers  设置被允许登录的用户列表

# AllowGroups  设置被允许登录的用户列表

生效顺序 DenyUsers AllowUsers DenyGroups AllowGroups

#UseDNS yes 一般为了判断客户端来源是否合法会反向客户端的主机名与ip的对应关系,局域网内建议关闭,可以提高链接速度

# GSSAPIAuthentication  yes  为了提高链接速度可把这一选项该为no

构建安全的SSH服务器

我们常说SSH服务时安全的。其实这个服务并不安全。有很多黑客可以利用SSH的漏洞来取得远程主机的权限来做一些让你非常意外的事。

SSHd服务所谓的安全是它的数据是经过加密的,所以在互联网上传输时比较安全。服务本身是不安全的。如何对服务本身做安全性设置是每一个运维人员必备的一个技能。

我个人把对ssh服务的安全设置分为三个部分:

SSHD服务本身的安全设置

局域网内部的访问控制

防火墙设置

SSHD服务本身的安全设置

尽量不要使用默认端口

不把ssh开放至互联网使用时也无所谓

禁止使用protocol version 1

限制可登录用户

使用AllowUsersAllowGroups 设置可登陆的用户列表和组

设定空闲会话超时时长

可以使用环境变量TMOUT实现,root用户2分钟内无操作自动注销

[[email protected]  ~]# echo "export TMOUT=120" >>/root/ .bash_profile

也可使用这sshd_config的ClientAliveInterval 和ClientAliveCountMax两个选项配置

仅监听特定的IP 地址

如果该服务配置有多个ip地址。建议仅监听内网使用的私网ip

[[email protected] ~]#  sed  -i ‘s/#ListenAddress  0.0.0.0/ListenAddress 192.168.2.2/g‘ /etc/ssh/sshd_config

基于口令认证时,使用强密码策略

tr -dc A-Za-z0-9_ < /dev/urandom | head-c 30| xargs

使用基于密钥的认证(尽量不使用口令认证)

禁止使用空密码设置  设置PermitEmptyLogin为no

禁止root 用户直接登录设置PermitRootLogin 为no

[[email protected]  ~]# sed -i ‘s/#PermitRootLogin yes/PermitRootLogin no/‘ /etc/ssh/sshd_config

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

做好日志,经常分析

局域网内部的访问控制

使用TCP-wrappers对可访问的主机进行控制,该工具不仅能对SSH服务进行访问控制,凡是支持tcp_wrappers的守护进程都可对其进行访问控制

TCP-wrappers简介

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

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

* 以库文件形式实现

* 某进程是否接受libwrap 的控制取决于发起此进程的程序在编

译时是否针对libwrap 进行编译的

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

ldd /PATH/TO/PROGRAM|grep libwrap.so

strings PATH/TO/PROGRAM|grep libwrap.so

PROGRAM路径一般为守护进程程序名,可以使用rpm –ql 得到

[[email protected]  ~]# rpm -ql openssh-server

……….

/usr/sbin/sshd

配置文件:/etc/hosts.allow, /etc/hosts.deny

帮助参考:man 5 hosts_access ,man 5 hosts_options

检查顺序:hosts.allow ,hosts.deny(( 默认 允许)

注意:一旦前面规则匹配,直接生效,将不再继续

基本语法:

[email protected]: client_list [ :options :option… ]

[email protected] 格式

单个应用程序的二进制文件名,而非服务名 , 例如vsftpd

以逗号或空格分隔的应用程序文件名列表 ,如:sshd,vsftpd

ALL 表示所有接受tcp_wrapper 控制的服务程序

主机有多个IP ,可用@hostIP 来实现控制 如:[email protected]

TCP_Wrappers的使用

客户端Client_list格式

以逗号 或空格 分隔 的 客户端 列表

基于IP 地址:192.168.10.1  192.168.1.

基于主机名:www.magedu.com.magedu.com 较较 少用

基于网络/ 掩码:192.168.0.0/255.255.255.0

基于net/prefixlen:192.168.1.0/24 (CentOS7))

基于网络组(NIS  域):@mynetwork

内置ACL :ALL ,LOCAL ,KNOWN ,UNKNOWN,PARANOID

EXCEPT 用法 :

示例: sshd: 172.16.0.0/16 EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1

该示例如果写在hosts.allow中表示172.16.0.0/16网段中除了100网段外均可访问sshd服务,但是172.16.100.1也可以访问sshd服务。写在hosts.deny中表示只有172.16.100.0/24网段可以访问sshd服务,但是网段中的172.16.100.1主机不能访问sshd服务。

防火墙设置

通过tcp_wrapper和sshd本身的设置做的只是局域网内部的一些访问控制。但是无法有效的防御互联网上对该服务的攻击。在防火墙关闭ssh的默认22端口为最好的办法。或者只允许不允许进。

[[email protected]  ~]# iptables -A INPUT -i eth1 -p tcp --dport 22 -j DROP

时间: 2024-10-11 05:39:41

SSH服务相关知识的相关文章

Apache(HTTP)服务相关知识总结(一)

Apache简介: Apache是一款著名的web服务器的软件.它是实现HTTP协议 的一个工具,而httpd则是Apache超文本传输协议服务器的主程序. 下面我来说说Apache的配置文件(非常重要) 1, 配置文件总体分为3个部分: Section1: Global Environment 功能: 控制Apache服务器进程的全局操作的 Section2:  'Main' server configuration 功能: 提供主服务器(默认为主服务器)的配置 Section3:  Virt

Linux启用ssh服务相关操作

检查linux系统是否已经安装了ssh服务,有openssh或其他xxxssh,表示有安装ssh服务 命令:rpm -qa | grep ssh 2.启动ssh服务 ssh 服务用命令表示为sshd,所以启动命令为:service sshd start 3.查看端口使用情况 查看所有tcp端口:netstat -tnlp 查看指定端口:netstat -tnlp | grep 22 4.在windows的dos窗口下测试ssh服务是否连接成功,命令:telnet ip地址 端口号

《Linux菜鸟入门》进程以及ssh的相关知识

openssh-server pstree查看初始化 systemctl 进程的查看以及管理 1.systemd 系统初始化程序,系统开始的第一个进程,pid=1 2.systemctl 命令 systenctl list-units                列出当前系统服务的状态 systenctl list-unit-files           列出服务的开机状态 systenctl status sshd               查看指定服务的状态 systenctl sto

SSH服务及批量分发与管理实战

SSH服务 一.SSH服务介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据传输,确保了传递的数据安全. SSH是专为远程登录会话和其他网络服务提供的安全性协议.利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境当中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件.如telnet等. SSH服务功能: a.类似telnet远程

查看linux ssh服务信息及运行状态

关于ssh服务端配置有不少文章,例如 linux下ssh服务配置,这里仅列举出一些查看ssh服务相关信息的常用命令. rpm -qa | grep ssh 可以看到系统中ssh安装包 rpm -ql openssh-3.5p1-6 查看该安装包安装信息(如安装路径,配置文件等) ps -e | grep ssh 查看ssh服务有没有运行,如果有,可以看到类似以下内容: 2254 ? 00:00:00 sshd 这证明ssh已经在运行了,进程名为sshd 如果没有运行,可以通过以下命令运行之: r

ssh服务及scp命令相关知识

一.linux系统ssh服务  1.什么是ssh?ssh是secure shell protocol简写,ssh是先对联机的数据包通过加密后再进行传输,确保数据安全.ssh是专门为远程登录会话和其他网络服务提供的安全性协议. 特别提醒:ssh客服端还包括scp安全拷贝命令及sftp文件传输服务,也是通过ssh协议来工作的. 二.ssh服务其他附带服务 1)检查是否安装openssl/openssh服务[[email protected] ~]# rpm -qa openssh openssh-5

linux-网络相关配置,ssh服务,bash命令及优先级,元字符

linux-网络相关配置,ssh服务,bash命令及优先级,元字符 二:临时配置网络(ip,网关,dns)+永久配置 临时配置: [[email protected] ~]# ifconfig ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 inet 192.168.152.134  netmask 255.255.255.0  broadcast 192.168.152.255 inet6 fe80::e33a:cec4

win10下Linux子系统开启ssh服务

原文地址:http://whosmall.com/?post=430 本文标签: 开启ssh Linux子系统 虽然win10自带的bash功能已经很丰富,操作也简便,不过习惯了用xshell, 还是选择用xshell来操作 直接用xshell连接127.0.0.1 端口22 提示连接失败.说明应该是ubuntu的sshd服务设置有问题: 解决方案如下: 安装ssh apt-get install openssh-server 备份sshd配置文件 sudo cp /etc/ssh/sshd_c

第1章 ssh和SSH服务(包含隧道内容)

本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的man文档,如本文有不理解的地方,可以参考man文档手册:ssh中文手册. 本文目录: 1.1 非对称加密基础知识 1.2 SSH概要 1.3 SSH认证过程分析 1.3.1 主机验证过程 1.3.2 身份验证过程 1.3.3 验证通过 1.4 各种文件分布 1.5 配置文件简单介绍 1.5.1 s