精选文章 SSH服务相关知识

SSH服务相关知识

作者:志_恒 时间: 2017-09-13 08:45:57
志_恒 2017-09-13 08:45:57

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. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功;

SSH服务相关知识1

基于key的认证方式

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

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

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

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

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

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

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

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

SSH服务相关知识2

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  yzh@172.18.11.7  以非标准端口2222连接,登录用户名yzh

yzh@172.18.11.7'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 yzh@172.18.11.7 hostname 登录远程主机执行命令后离开

yzh@172.18.11.7's  password:

centos7.magedu.com

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

yzh@172.18.11.7'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 yzh@172.18.11.7

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

[root@centos6  ~]# scp -prroot@172.18.11.7:/etc/ssh  /app/ssh

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

 

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

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

 

sftp命令

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

 

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

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

 

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

针对远程主机的命令

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

       权限相关:chownchgrpchmod

针对本机的的命令

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

       lcdllslmkdirlpwd

针对复制操作的命令

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

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

 

退出命令

exit bye quit

 

[root@centos6  ~]# sftp root@172.18.11.7

Connecting  to 172.18.11.7...

root@172.18.11.7'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 root@172.18.11.7#复制公钥到远程主机

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.

root@172.18.11.7's  password:

Now  try logging into the machine, with "ssh 'root@172.18.11.7'", and  check in:

 

  .ssh/authorized_keys 

 

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

 

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

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 root@172.18.11.7

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 来实现控制 如:in.telnetd@192.168.0.254

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 


勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:hdu 1024 Max Sum Plus Plus (dp)

下一篇:python 包

您可能感兴趣

  • IntellIJ IDEA2020新功能

    一、java 1、Java 14支持:记录和模式匹配 IntelliJ IDEA 2020.1添加了对Java 14及其新功能的支持。IDE不仅添加了对Records的完整代码洞察支持,而且还使您能够快速创建新记录并生成其构造函数和组件,并警告存在的错误。您还将发现对instanceof运算符的模式匹配的支持,包括新的检查和快速修复,该快速修复通过用新的简洁模式变量替换它们来快速简化冗长的i...

  • 机器如何实现完全自主类人的学习方式?道翰天琼认知智能机器人API平台接口为您揭秘。

    机器如何实现完全自主类人的学习方式?道翰天琼认知智能机器人API平台接口为您揭秘。 本文作者来自东北大学,他通过整理自监督学习的一系列工作,把主流方法分成三大类,方便大家更全面的了解自监督学习的定义、方法、用途。与此同时,文中也穿插着几大主流方法的最新工作进展,现在正在探索自监督学习未来前景研究方向的同学,也不妨借鉴一二,说不定能找到灵感哦~ 1 学习的范式 我们首先来回顾下机器学习中两种基...

  • 深度学习到底有哪些经典成果?道翰天琼认知智能机器人API平台接口为您揭秘。

    深度学习到底有哪些经典成果?道翰天琼认知智能机器人API平台接口为您揭秘。 2006年,Hinton 发表了一篇论文《A Fast Learning Algorithm for Deep Belief Nets》,提出了降维和逐层预训练方法,该方法可成功运用于训练多层神经网络,使深度网络的实用化成为可能。该论文也被视作深度学习领域的经典之作。 从原理来看,深度学习与神经网络紧密相关:神经网络...

  • 爱了,3174页实战pdf集锦:Redis+多线程+Dubbo+JVM+kafka+MySQL

    写在前面 作为一名Java开发者,在现在这个信息化时代很快的时代,很少会有人停下脚步去思考以及去总结,忽略了很重要的一个步骤,没有反思和总结,只会用原来固有的想法去做事情,所以还是需要隔一段时间去总结。LZ今天总结了自己在平时会用到的一些: 01—Redis实战 在Redis诞生数年之后的今天,这个项目已经发生了显著的变化:我们现在拥有了一个更为健壮的系统,并且随着Redis 2.6的发布,...

  • 【STM32F429开发板用户手册】第38章 STM32F429的FMC总线应用之是32路高速IO扩展

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 本章教程为大家讲解利用STM32429的FMC总线扩展出32路高速IO,且使用简单,实际项目中也比较有实用价值。 目录 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 38.1 初...

  • Navicat Premium for Mac(数据库管理工具)15中文版

    Navicat Premium for mac是一个可多重连接的数据库管理工具,Navicat的功能足以符合专业开发人员的所有需求,但是对数据库服务器的新手来说又相当容易学习。Navicat Premium Mac可让你以单一程序同時连接到目前世面上所有版本的主流数据库并进行管理和操作,支持的数据库有: MySQL、SQL Server、SQLite、Oracle 及 PostgreSQL。...

  • 【计算机网络】第七章:网络安全

    【计算机网络】第七章:网络安全 目录 网络安全问题概述 1.1.计算机网络面临的安全性威胁 1.2.被动攻击和主动攻击 1.3.计算机网络通信安全的目标 1.4.恶意程序(rogue program) 1.5.计算机网络安全的内容 1.6.一般的数据加密模型 两类密码体制 一、对称密钥密码体制 1.1.对称密钥的缺点与优点 1.2.数据加密标准 DES 1.3.DES 的保密性 二、公钥密码...

  • Web端即时通讯实践干货:如何让WebSocket断网重连更快速?

    本文作者网易智慧企业web前端开发工程师马莹莹。为了提升内容质量,收录时有修订和改动。 1、引言 在一个完善的即时通讯IM应用中,WebSocket是极其关键的一环,它为基于Web的即时通讯应用提供了一种全双工的通信机制。但为了提升IM等实际应用场景下的消息即时性和可靠性,我们需要克服WebSocket及其底层依赖的TCP连接对于复杂网络情况下的不稳定性,即时通讯的开发者们通常都需要为其设计...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
51CTO

51CTO

51CTO是一家综合的IT技术用户服务平台,立足满足用户多维度需求,为技术用户成长赋能。2005年成立至今,拥有专业主流技术媒体51CTO企业信息化媒体CIOAge中国最大的IT在线教育平台51CTO学院。