SSH 远程连接服务器基础

远程连接服务器


分类:

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

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

 

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

什么是SSH


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

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

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

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

  2. 类似FTPsftp-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. 户端将解密后的字符串使用服务器公钥加密后发送给服务端;

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

SSH服务相关知识_第1张图片

SSHD守护进程


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

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

[root@centos6  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软件。这三个软件包提供不仅支持远程登录而且可以支持sftpxmanager软件包也支持使用图形接口来远程连接SSH服务器。

 

命令工具


SSH中默认的工具由openssh-clients包提供,有sshscpsftpssh-addsloginssh-agentssh-copy-idssh-keyscan命令。

 

ssh命令

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

ssh  [–pf] user@ip [command]

选项:

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

-p 指定非标准端口(22

[root@centos6  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

[yzh@centos7  ~]$ exit 退出当前ssh连接

logout

Connection  to 172.18.11.7 closed.

[root@centos6  ssh]# ssh 172.18.11.7  以默认的端口和当前的账号连接

 

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

 

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

[email protected]'s  password:

centos7.magedu.com

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

[email protected]'s  password:

centos7.magedu.com

scp命令

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

scp  [-pr] [-l 速率] file user@ip:dir    #上传

scp  [-pr] [-l 速率]  user@ip:dir  file   #下载

选项

-p 保留文件权限属性

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

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

 

[root@centos6  ~]# scp -p test [email protected]

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

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

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

 

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

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

 

sftp命令

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

 

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

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

 

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

针对远程主机的命令

       文件相关:cdls|dirmkdirrmdirpwdrmrename  ln(建立连接文件)

       权限相关:chownchgrpchmod

针对本机的的命令

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

       lcdllslmkdirlpwd

针对复制操作的命令

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

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

 

退出命令

exit bye quit

 

[root@centos6  ~]# 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

[root@centos6  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客户端的私钥的保密性来决定。

[root@centos6  ~]# ssh-keygen -t rsa      #生成密钥对文件 -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:

[root@centos6  ~]# ls .ssh/  #公钥私钥文件所在路径

id_rsa  id_rsa.pub

 

[root@centos6  ~]# 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.

 

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

Enter  passphrase for key '/root/.ssh/id_rsa':    #输入私钥加密口令,这里是密钥的口令

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

welcome

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

[root@centos6  ~]# ssh-agent bash 

[root@centos6  ~]# ssh-add

Enter  passphrase for /root/.ssh/id_rsa:

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

[root@centos6  ~]# ssh [email protected]

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

 

服务端配置文件


/etc/ssh/sshd_config

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

[root@centos6 ~]# 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服务的安全设置分为三个部分:

  1. SSHD服务本身的安全设置

  2. 局域网内部的访问控制

  3. 防火墙设置 

SSHD服务本身的安全设置

尽量不要使用默认端口

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

禁止使用protocol version 1

限制可登录用户

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

设定空闲会话超时时长

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

[root@centos6  ~]# echo "export TMOUT=120" >>/root/ .bash_profile

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

 

仅监听特定的IP 地址

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

#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

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

禁止使用空密码设置  设置PermitEmptyLoginno

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

# 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 得到

[root@centos6  ~]# 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默认允许)

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

 

基本语法:

daemon_list@host: client_list [ :options :option… ]

Daemon_list@host 格式

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

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

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

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

TCP_Wrappers的使用

  客户端Client_list格式

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

  基于IP 地址:192.168.10.1  192.168.1.

  基于主机名:www.zhyang.top少用

  基于网络/ 掩码:192.168.0.0/255.255.255.0

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

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

  内置ACL ALL LOCAL KNOWN UNKNOWNPARANOID

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_wrappersshd本身的设置做的只是局域网内部的一些访问控制。但是无法有效的防御互联网上对该服务的***。在防火墙关闭ssh的默认22端口为最好的办法。或者只允许不允许进。

[root@centos6  ~]# iptables -A INPUT -i eth1 -p tcp --dport 22 -j DROP