草庐IT

SSH服务远程访问及控制

~407 2023-05-27 原文

目录

1、SSH服务

1.1、配置OpenSSH

1.2、SHH远程登录方式

2、服务配置与管理

安全调优

3、sshd 服务支持两种验证方式

3.1、公钥和私钥的关系

3.2、构建密钥对验证的SSH原理

3.3、配置密钥的验证

4、scp远程复制

5、sftp安全性传输

6、TCP Wrappers 访问控制

7、总结

引言:SSH是什么?SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。

1、SSH服务

1.1、配置OpenSSH

SSH协议

是一种安全通道协议

对通信数据进行了加密处理,用于远程管理

OpenSSH

服务名称:sshd

服务端主程序:/usr/sbin/sshd

服务端配置文件:/etc/ssh/sshd_config

c------s 客户端到服务端

SSH客户端:putty 、Xshell 、CRT、MobaXterm 、FinalShell

SSH服务端:OpenSSH

OpenSSH 是实现 SSH 协议的开源软件项目,适用于各种 UNIX、Linux 操作系统

CentOS 7系统默认已安装openssh相关软件包,并已将 sshd 服务添加为开机自启动

ssh服务端主要包括两个服务功能 ssh远程链接和sftp服务

作用:SSHD服务使用SSH协议可以用来进行远程控制,或在计算机之间传送文件。

相比较之前用Telnet方式传输文件要安全很多,因为Telnet使用明文传输,SSH是加密传输

OpenSSH 常用配置文件有两个 /etc/ssh/ssh.config   和 /etc/sshd.config

ssh_config :为客户端配置文件,设置与客户端相关的应用可通过此文件实现

sshd_config :为服务端配置文件,设置与服务端相关的应用可通过此文件实现

1.2、SHH远程登录方式

登录方法一:

ssh  [远程主机用户名]  @  [远程服务器主机名或IP地址]  -p   port

当在Linux主机上远程连接另一台Linux主机时,如当前所登录的用户是root 话,当连接另一台时也是用root用户登录的,可以直接使用ssh  IP ,端口不是默认的情况下,需要使用-p 指定端口

设置主机信息后,也可以根据主机名进行远程连接

 vim  /etc/hosts

登录方法二:

 ssh  -l  [远程主机用户名]  [远程服务器主机名或IP地址] -p  port

-l  : 选项,指定登录名称

-p : 指定登录端口(当服务器的端口非默认时,需要使用-p 指定端口进行登录)

 注:当第一次登录服务器系统没有保存远程主机的信息,为了确认该主机身份会提示用户是否继续连接,输入yes后登录,这时系统会将远程服务器信息写入用户主目录下的$HOME/ .ssh/known_hosts 文件中,下次再进行登录是因为保存该主机信息就不会再提示了。

 ssh会把你每个访问过计算机的公钥(public key)都记录再~/.ssh/known_hosts 当下次访问相同计算机时,openssh会核对公钥,如果公钥不同,openssh会发出警告,避免你收到DNS  Hijack之类的攻击。

使用ssh连接远程主机时加上 -o StrictHostKeyChecking=no  IP地址

2、服务配置与管理

查看版本 

 

SSH服务端配置文件常用选项设置

vim /etc/ssh/sshd_config

#Port 22                 设置SSHD监听端口号。

#ListenAddress      监听地址 设置sshd服务器绑定的IP地址,0.0.0.0表示侦听所有地址

#SyslogFacility AUTHPRIV                 当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV,sshd 服务日志存放在:/var/log/secure。

安全调优

#LoginGraceTime 2m              grace意思是系统给与多少秒来进行登录。(默认2分钟,0 表示无限制)  当使用者连上 SSH server 之后,会出现输入密码的画面,在该画面中。在多久时间内没有成功连上SSHserver 就强迫断线!若无单位则默认时间为秒。可以根据实际情况来修改。

#PermitRootLogin yes            是否允许 root 登入,默认是允许的,但是建议设定成 no,真实的生产环境服务器,是不允许root 账号直接登陆的,仅允许普通用户登录,需要用到 root 用户再切换到root 用户。

#MaxAuthTries 6                      指定每个连接最大允许的认证次数。默认值是 6 。如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息默认3次。

# PermitEmptyPasswords no             是否允许空密码的用户登录,默认为no,不允许空密码登录                            

#PasswordAuthentication yes       密码验证当然是需要的!所以这里写 yes,也可以设置为 no,在真实的生产服务器上,根据不同安全级别要求,有的是设置不需要密码登陆的,通过认证的秘钥来登陆。

#UseDNS yes      一般来说,为了要判断客户端来源是正常合法的,因此会使用DNS去反查客户端的主机名。禁用DNS反向解析可以提高服务器的响应速度

 #AllowUsers      当希望只允许或禁止某些用户登录时,可以使用 AllowUsers 或 DenyUsers 配置,两者 用法类似(注意不要同时使用)。
配置AllowUsers

设置完之后需要重启服务    systemctl  restart   sshd   

 允许的用户可以进行远程连接登录,root用户没有权限无法进行登录

3、sshd 服务支持两种验证方式

密码验证:对服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户端角度来看,正在连接的服务器有可能被假冒;从服务器角度来看,当遭遇密码(暴力破解)攻击时防御能力比较弱。

密码复杂性(18位 、大写、小写、字符、数据)端口(1023以上叫做高危端口 )做好安全

密钥对验证:要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,大大增强了远程管理的安全性。该方式不易被假冒,且可以免交互登录,在 Shell 中被广泛使用。

当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。对于安全性要求较高的服务器,建议将密码验证方式禁用,只允许启用密钥对验证方式;若没有特殊要求,则 两种方式都可启用

3.1、公钥和私钥的关系

在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的

公钥用来给数据加密,用公钥加密的数据只能使用私钥解

3.2、构建密钥对验证的SSH原理

 首先ssh通过加密算法在客户端产生密钥对(公钥和私钥),公钥发送给服务器端,自己保留私钥,如果要想连接到带有公钥的SSH服务器,客户端SSH软件就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公钥加密"质询"(challenge)并把它发送给SSH客户端。

vim /etc/ssh/sshd_config     

3.3、配置密钥的验证

在客户端创建密钥对

通过ssh-keygen.工具为当前用户创建密钥对文件。可用的加密算法为RSA、ECDSA或DSA等 ( ssh-keygen命令的“-t”选项用于指定算法类型)。

客户端

确认新生成的密钥文件

将公钥文件上传至服务器

scp  ~/.ssh/id_ecdsa.pub root@192.168.58.10:/指定目录         

cd ~/.ssh/
ssh-copy-id  -i  id_ ecdsa.pub root@192.168.58.10

在服务端查看上传的公钥文件

 在客户端使用密钥对验证

也可以使用 在客户机设置ssh代理功能,实现免交互登录

无需输入私钥密码,直接连接服务端

4、scp远程复制

安全性复制

scp:scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,而且scp传输是加密的

 本地文件复制到服务器

 将服务器上的目录复制到客户端上

 scp -r  /etc/   root@192.168.58.10:/root/      本地目录复制到服务器上

5、sftp安全性传输

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。

sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作

所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP 

sftp    root@192.168.58.10  /root
sftp> ls
sftp> get 文件名        #下载文件    下载目录  -r
sftp> put 文件名        #上传文件
sftp> exit                    #退出

6、TCP Wrappers 访问控制

 TCP Wrappers访问控制

在 Linux 系统中,许多网络服务针对客户端提供了访问控制机制,如 Samba、BIND、 HTTPD、OpenSSH 等
TCP Wrappers 将 TCP 服务程序“包裹”起来,代为监听 TCP 服务程序的端口,增加了 一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正的服务程序

rpm -q  tcp_wrappers       #查询是否安装,一般系统会默认安装

 vim  /etc/hosts.allow   允许192.168.58.30机器连接

 vim  /etc/hosts.deny    拒绝192.168.58.19机器连接

7、总结

简单的说,SSH是一种网络协议,主要用于客户端与远程主机的安全链接和交互。通过上述描述我们了解了OpenSSH服务端,配置文件内监听选项,用户登录控制,登录验证方式,以及构建密钥对验证的SSH体系的步骤以及TCP Wrappers访问控制。我们之前了解过一些安全机制,pam认证,用户安全认证,以及上述内容中的sshd安全。

有关SSH服务远程访问及控制的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  6. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  7. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  8. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  9. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  10. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

随机推荐