×

SSH (Secure Shell)详解

前端技术网 前端技术网 发表于2024-01-01 05:55:33 浏览1353 评论0

抢沙发发表评论

一、使用SSHSecureShellClient传文件的步骤是什么

SSH Secure Shell Client是SSH命令行控制终端,你应该是用SSH Secure File Transfer Client传输文件。

这里只谈论他的使用方法,关于SSH配置你再找其他文章。

SSH (Secure Shell)详解

一、登陆方法

你可以在登陆的SSH Secure Shell Client里单击工具栏里(或菜单)的New File Transfer Window,就直接登陆了。也可以单独运行SSH Secure File Transfer Client。

登陆非常简单,填写Host Name(你的服务器地址或域名),User Name(你的服务器用户名,注意你SSH使用root用户是否有权限登陆,或使用其他用户登陆),Port(你SSH登陆的端口,默认为23)。

二、传输文件

一般默认的SSH Secure File Transfer Client界面左边为你本地的磁盘信息,右边的为登陆后服务器的磁盘信息,确定需要传到服务器的文件,采用拖拽方法,也可以用鼠标右健upload上传。从服务器中下载文件到本地,你也可以用拖拽方法,或用鼠标右键Download下载。

三、注意事项

SSH (Secure Shell)详解

上传下载,你需要注意用什么方法上传下载,用二进制还是ASCII还是自动,有些时候我们需要指定一下,要不上传文件会有问题。

四、其他

SSH Secure File Transfer Client软件应该没有可选字符集utf8等,在有些linux里中文会出现乱码,你可以用filezilla的sftp,因为filezilla可以选择字符集,就不会有乱码了。你也可以用其他工具参与你的服务器配置。比如WinSCP,在改文件时特别有用,对于vi编辑器不太会用的是很好的替代工具。SecureCRT命令行控制终端可以选择字符集等等。每个工具都有不同的优缺点,结合起来你在维护服务器时才事倍功半。

二、SSH权限详解

原文链接

之前两篇文章利用SSH代理访问内网资源和使用SSH代理在本地开发环境调试各种回调两篇文章,介绍了ssh的各种代理姿势,SSH的功能确实强悍。如果用过ssh代理功能,就有人要问了,我能否限制用户只允许使用代理功能,而不允许用户登录到我的系统中呢?

当然可以!否则又怎么会称为SSH(注:SSH是Secure Shell的缩写)呢?连权限都不能保障怎么敢叫 Secure呢?本篇文章就来详解下SSH的花式权限,来点不一样的干货。

先谈谈SSH有哪些功能,才能谈到每个功能有哪些权限。SSH最常见的有三大功能:

其次是SSH是一个典型的C/S应用,服务端运行 sshd守护进程,监听 TCP/22端口(默认情况下),客户端运行 ssh程序,远程连接 sshd应用,使用以上三种功能。

sshd使用/etc/ssh/sshd_config和~/.ssh/authorized_keys(这个文件仅用于做密钥认证的配置,如果和sshd_config配置冲突则此文件配置生效。此配置文件可以实现细化到密钥的权限,gitlab使用此配置实现用户的ssh访问控制)配置文件做服务配置, ssh客户端使用/etc/ssh/ssh_config(全局配置)和~/.ssh/config(个性配置)两个配置文件(windows 10的openssh使用%USERPROFILE%\.ssh\config)。默认配置文件几乎不用动,ssh就帮我们做好了开箱即用的配置。本文不会讲解ssh每个配置项的含义,只会根据一些场景讲解对应的权限控制,所有场景都是以默认配置为基准,讲解一些常用的配置,一些不常用的配置项就不提及了。

下面我们将详解每个功能的权限

最基本的使用方式,直接远程连接到服务器的shell上,实现远程控制的需求。

只要用户满足以下条件之一,ssh便会拒绝登录:

所以通常创建一个低权限账户,只负责运行本地服务的,使用的useradd命令大致如下:

新用户无密码,并且不是一个合法的shell,所以根本没法登录

如果连motd信息都不想让用户看到,可以直接创建一个~/.hushlogin空文件即可。如果想通过修改配置文件,那么需要同时修改/etc/sshd_config( PrintMotd no)和/etc/pam.d/sshd(去掉 pam_motd.so加载),比较麻烦。

设置 PermitRootLogin选项即可。 no表示彻底拒绝root远程登录,想要切换成root就只能通过普通用户的 su-或 sudo-i切换root身份了。 prohibit-password和 without-password(Ubuntu 14.04以后默认)表示拒绝密码登录,表示只能通过密钥登录了。 forced-commands-only选项表示只允许密钥认证,但是必须给定 command,也就是非交互式执行ssh。

这个其实办法很多,比如在防火墙控制,在/etc/hosts.(deny|allow)控制等,其实在/etc/sshd_config也可以控制,方法就是使用 Match address,比如:

用sshd配置本身做ip白名单的比较少,但是 Match配置却是一个非常有用的配置项,它可以实现我们对用户或用户组区别对待,这个我们会在后面再细说。

有关代理的使用可以参考我之前写的利用SSH代理访问内网资源和使用SSH代理在本地开发环境调试各种回调两篇文章。

x11转发功能实际应用会非常罕见,作用是将远程的图形数据在本地的X server上展示,以实现本地操作远程图形程序的功能。首先是Linux服务器大多运行在无图形环境下,本身就没有图形化程序跑在上面,再加上客户机可能多数是windows,又没有X环境,更加限制了这个功能的使用。还有就是x11 forwarding性能不是很好,实际使用会发现非常卡,不适合使用那种对响应速度要求比较灵敏的应用程序,比如浏览器,在x11 forwarding下运行动图会非常卡。最后就是需要跑图形化程序的服务器多数都安装有桌面环境,配置有vnc,因此就更没有人愿意使用这个功能了。

如果不希望所有端口都能用于转发请求,可以配置 PermitOpen参数:

如果允许多个端口用于转发,那么必须一个个配置出来, any(默认)表示所有端口都允许用于转发。

这个比较繁琐,因为目前常见的通过ssh传输文件的有三个命令 scp, rsync, sftp。它们的机制不一样,其中 scp和 rsync是通过远程非交互式执行命令实现的,而 sftp是通过openssh的sftp server实现的。

对于 scp和 rsync,只需要限制非交互式命令就可以了,比如

或在~/.ssh/authorized_keys对应的rsa public key前面加上 command="/bin/bash"(参考gitlab的/var/opt/gitlab/.ssh/authorized_keys),效果是等效的。这样就可以实现允许用户远程登录系统,但是 scp和 rsync命令失效,同时由于限定死了command参数,导致你的非交互式ssh命令也无法使用了,比如 ssh user@ip ls/这一类非交互式ssh不起作用了。

但是对于 sftp的限制则要容易的多,因为 sftp权限是单独分开的,不和ssh命令执行权限混在一起,并且sftp也和ftp一样,有自带的一些命令实现(比如ls, cd, get, put等等),如果设置

或等效的~/.ssh/authorized_keys配置,则表示只允许使用sftp,不允许shell登录。如果配置中去掉 Subsystem sftp/usr/lib/openssh/sftp-server这一行就可以关闭sftp服务

经常时候我们需要混合以上各种权限使用。比如某些用户我们开放出来,但是限制它的功能,此时 Match配置就是我们的好朋友了。

由于用户不能登录shell,不能使用密码认证,因此想要使用代理,必须使用类似于下面的命令:

使用-i参数指定私钥文件用于公钥认证,使用-N参数表示不执行远程命令,仅仅使用port forwarding。

这里我们Match了 sftp-only这个组,在这个组下面的用户都使用下面的配置。使用了ForceCommand,因此不能登录shell,使用了 ChrootDirectory限制了用户的根目录,关闭了各种转发功能。

通过 Match的组合,我们可以很方便的限制一些特定用户的权限,这样就实现了ssh用户的一些特殊化管理。

这里只是按照一些可能遇到的场景讲解了下 sshd_config的配置,对于等效的~/.ssh/authorized_keys配置同样适用。其实ssh还有很多强大的功能,但是用的可能比较少,这里就不详细讲解那些不太常见的参数了,有兴趣的读者可以自行查阅man手册获取更多资料:

三、SSH客户端之SSH Secure Shell 的连接方法

1、运行环境

WINDOWS下安装SSH客户端,名字是SSHSecureShellClient-3.2.9.exe,可以到http://www.ssh.com/下载,当然了,在SERVER端我们也可以安装Openssh,但此文章着重介绍的是ssh的技术,所以我们使用的是http://www.ssh.com/ for UNIX/LINUX的SERVER端,现在最新版本是ssh-3.2.9-1.i386.rpm(如果你是AIX或者SOLARIS,要下不同的版本,这里以RHCE3为例子)。确定把UNIX类主机的默认的Openssh全部卸载掉后安装ssh-3.2.9-1.i386.rpm。

2、为什么要公私钥认证方法(连接到主机不输入密码)

我们需要知道Publick Key是指公钥,而private key是指私钥。认证的过程是这样的:public key对数据进行加密而且只能用于加密,private key只能对所匹配的public key加密过的数据进行解密。我们把public key放在远程系统合适的位置,然后从本地开始进行ssh连接。此时,远程的sshd会产生一个随机数并用我们产生的public key进行加密后发给本地,本地会用private key进行解密并把这个随机数发回给远程系统。最后,远程系统的sshd会得出结论——我们拥有匹配的private key允许我们登录。就这么简单!

3、在本机生成密钥过程

WINDOWS下寻找ssh-keygen2.exe文件,这是生成密钥的文件,我的在C:/Program Files/SSH Communications Security/SSH Secure Shell,在DOS下执行这个文件,方法是

C:/Program Files/SSH Communications Security/SSH Secure Shell ssh-keygen2-t rsa

我用的是rsa的密钥,默认是2048位,足够我们用的了,还可以使用dsa方式的密钥。我就不在这里说明了

系统自动生成密钥对,默认放在C:/Documents and Settings/XXX/Application Data/SSH/UserKeys目录下,其中XXX是你执行程序时用的帐户,默认名称是id_rsa_2048_a和id_rsa_2048_a.pub,而后者就是我们要传到服务器上的公钥。(生成密钥对的同时让你输入一个密码,因为我们想不输入密码直接登陆服务器,所以就直接回车了,但如果你想更安全一些,还是建议你在这里也输入密码。)

4、用SSH客户端从本机登陆到远程UNIX类服务器上

我们还按以前的方法登陆到远程UNIX类服务器上,这样登陆后我们会在用户目录下,PWD一下,你可以看到你的用户目录路径,比如我的就是/home/test,那么好了,我们建立一个.ssh2的文件夹,在里面建立一个文件,authorization,内容如下:

key id_rsa_2048_a.pub

然后把你WINDOWS客户端上的id_rsa_2048_a.pub上传到你在UNIX类服务器上刚建立好的.ssh2文件夹下,关闭SSH客户端。

5、用SSH客户端公钥认证状态登陆

重新启动SSH客户端,在登陆认证状态栏选择Public Key方式,登陆到你刚才放id_rsa_2048_a.pub的那台服务器,你会发现你马上就登陆进来了,没有密码限制了。这个时候用公私钥认证和用密码认证同时存在,还没有达到我们的要求,那我们就在UNIX类服务器上修改/etc/ssh2/sshd2_config文件

把以下如下三行的password删除,下面这三行是修改好的

AllowedAuthentications publickey

AllowedAuthentications hostbased,publickey

RequiredAuthentications publickey

这样当你再用密码登陆的时候就出现如下对话框了!!

第二章 SSH客户端之Putty的连接方法

1、运行环境

WINDOWS下安装的SSH客户端,名字是putty-0.56-installer.exe,可以到如下地址下载:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html,这个安装包是所有工具的**,其实如果只做为连接用,你可以只下putty0.56.exe的。但我们这里因为要做密钥对,所以就下整个包安装吧。

2、在本机生成密钥过程

用putty套装的puttygen来产生密钥。密钥的类型选择SSH2 RSA。密钥的位数选择2048,然后点击"Generator",此时密钥生成当然也有几个选项出现。如果你有不止一个key,你可以在“Key comment”作注释用于区别其他的key。“Key passphrase“和“Confirm passphrase“用于对硬盘上的key进行加密,如过你自己一个人用机器觉得安全有保障的话可以让它们为空。然后保存两个key,用默认方式保存,那么公钥你可以指定文件名,私钥默认的文件扩展名是.ppk。在这里我们命名它为test.ppk,而公钥我们保存为test.pub,需要注意的是,如果用putty连接,私钥的扩展名必须是.ppk,而且你还可以将这个.ppk的私钥保存为SSH Secure Shell格式和Openssh格式认知的私钥,这个对两个UNIX类主机之间相互通信提供了很大帮助。(我们以后会将两个UNIX类主机通过公私钥认证的方法给大家讲讲)

4、用Putty从本机登陆到远程UNIX类服务器上

我们还按先前的方法登陆到远程UNIX类服务器上,这样登陆后我们会在用户目录下,PWD一下,你可以看到你的用户目录路径,比如我的就是/home/test,那么好了,我们建立一个.ssh2的文件夹,在里面建立一个文件,authorization,内容如下:

key test.pub

然后把你WINDOWS客户端上的test.pub上传到你在UNIX类服务器上刚建立好的.ssh2文件夹下,关闭Putty。这个上传命令你可以用 put,下载就用get。你的通道可以用PSFTP建立,这个也在PUTTY的组件中。

5、用SSH客户端公钥认证状态登陆

重新启动Putty,建立一个session命名为test,设定你要登陆的远程ip,协议设为ssh,Connection设定在ssh的auth选项中,将private key的文件选择为刚才我们由puttygen产生的密钥test.ppk。点Open,要求输入username,我们输入用户名后远程系统开始public key认证,如果密钥有passphrase则需要输入,否则直接就登录了。这个时候用公私钥认证和用密码认证同时存在,还没有达到我们的要求,那我们就在UNIX类服务器上修改/etc/ssh2/sshd2_config文件

把以下如下三行的password删除,下面这三行是修改好的

AllowedAuthentications publickey

AllowedAuthentications hostbased,publickey

RequiredAuthentications publickey

这样当你再用密码登陆的时候就出现如下对话框了!!

第三章

Ssh服务器端安装

1、环境:

因为我们选用的SSH服务器是http://www.ssh.com的SSH Secure Shell for unix类产品,所以我们主要介绍一下此类的Ssh服务器的安装过程。(SSH有两个版本,我们现在介绍的是版本2;Openssh就不介绍了,大家有兴趣的话可以参考一下网上文章)

2、编译安装

我们前面介绍过,现在的Ssh server for unix类的最新版本是ssh-3.2.9-1,我建议大家用官方提供的TAR包,当然,如果你不熟悉编译过程,用RPM等安装方式也是可以的。如果用RPM安装,请先下载ssh-3.2.9-1.i386.rpm,大家可以到以下地址下载:

http://ftp.ssh.com/priv/secureshell/329wks+srv-lt49ldrk/linux/ssh-3.2.9-1.i386.rpm

安装时请用管理员权限

# rpm–ivh ssh-3.2.9-1.i386.rpm如果是升级安装那参数就用–Uvh

而3.2.9-1的TAR包大家可以到http://downloads.planetmirror.com/pub/ssh/ssh-3.2.9.1.tar.gz下载。安装时也使用管理员权限:

# tar xzvf ssh-3.2.9.1.tar.gz

# cd ssh-3.2.9.1

#./configure(这里我们要说明一下,原来有些文档写如果你希望用tcp_wrappers来控制SSH,那么在configure时需要加上选项“--with-libwrap=/path/to/libwrap/”,用来告诉SSH关于libwrap.a和tcpd.h的位置,但3.2.0以上的SSH已经不需要这么麻烦了,它们已经内置了控制访问权限的功能。)

# make; make install; make clean

这样就结束了安装。

3、简单配置Ssh server

无论你是用RPM或TAR包安装的ssh server,它的配置文件都在/etc/ssh2/sshd2_config,安装完后一般不用配置它,但如果你的22端口在安装ssh server之前已经被其他程序占用,那么你需要简单的配置一下这个文件,执行 vi/etc/ssh2/sshd2_config,找到第27行,Port 22,把22改成其他的端口就可以了。

4、启动Ssh server

Ssh server的默认启动文件是/usr/local/**in/sshd2,而安装程序自动做了一个连接到这个文件的名字为sshd的文件,我们只要在/usr/local/**in/目录中执行./sshd就可以简单的启用Ssh server,然后我们执行# netstat–na会看见22端口已经被监听了(你的可能是其他端口,具体看你在sshd2_config文件中的设置了。)但我们不想每次都要手动启动Ssh server,那么我们可以修改一下/etc/rc.d/rc.local文件,在这个文件的最后加入以下内容:

#start ssh

/usr/local/**in/sshd

其中第一行为注释内容,第二行为启动SSH服务器并作为后台守护进程运行。

这样就好了,系统重起时可以自动启动SSH服务,但是启动后你如果在服务器端插上显示器,会在最后该登陆的时候看到一行字,意思就是Ssh server服务启动了,我比较挑剔,不想看到这个提示,而且我想把Ssh服务放到LINUX服务启动过程中,这样比较美观一点。那么我们就不能修改/etc/rc.d/rc.local文件,我们要进入/etc/init.d/中建立一个SHELL文件,名字就叫sshd内容如下:

#!/bin/bash

cd/usr/local/**in

./sshd

然后给这个文件加上可执行权限

# chmod+x sshd

然后进入/etc/rc3.d,做一个软链接文件

# cd/etc/rc3.d

# ln-s../init.d/sshd S13sshd

这样就达到了我的要求,好了,Ssh server的安装就介绍到这里吧,安装是很简单的,希望大家编译安装成功。

非常感谢您的阅读!我们希望本文对于解决您关于SSH (Secure Shell)详解的问题提供了一些有价值的信息。如果您还有其他疑问,我们将很乐意为您提供进一步的帮助。