如何建立linux ssh信任的方法与常见问题

如何建立linux ssh信任的方法与常见问题,第1张

在Linux服务器之间建立信任关系,是很多线上服务系统的基础性工作,这样能便于程序在多台服务器之间自动传输数据,或者方便用户不输入密码就可以在不同的主机间完成登录或者各种 *** 作。
网上关于建立Linux信任关系(ssh trust)的中文文章有一些,但是写得都不太详细,这里汇总了方方面面的资料,把多机信任关系建立方法说说清楚(文/陈运文)
一 建立信任关系的基本 *** 作
基本场景是想从一台Server服务器直接登录另一台,或者将Server服务器的数据不需密码验证直接拷贝至Client服务器,以下我们简称Server服务器为S(待发送的数据文件在这台服务器上),Client服务为C,信任关系的最简单 *** 作方法如下:
1 在S服务器上,进入当前用户根目录下的隐藏目录 ssh,命令如下:
cd ~/ssh
(注:目录名前的点好””表示该文件夹是一个特殊的隐藏文件夹,ls命令下默认是看不到的,通过 ls –a 命令观察到)
2 生成S服务器的私钥和公钥:
ssh-keygen -t rsa
(注:rsa是一种加密算法的名称,此处也可以使用dsa,关于rsa和dsa算法的介绍可见本文后半章节)
ssh-keygen生成密钥用于信任关系生成
-此时会显示Generating public/private key pair 并提示生成的公钥私钥文件的存放路径和文件名,默认是放在 /home/username/ssh/id_rsa 这样的文件里的,通常不用改,回车就可以
然后Enter passphrase(empty for no passphrase): 通常直接回车,默认不需要口令
Enter same passphrase again: 也直接回车
然后会显式密钥fingerprint生成好的提示,并给出一个RSA加密协议的方框图形。此时在ssh目录下ls,就可以看到生成好的私钥文件id_rsa和公钥文件id_rsapub了
以下是各种补充说明:
注1:如果此时提示 id_rsaalready exists,Overwrite(y/n) 则说明之前已经有人建好了密钥,此时选择n 忽略本次 *** 作就行,可以直接用之前生成好的文件;当然选y覆盖一下也无妨
注2:公钥用于加密,它是向所有人公开的(pub是公开的单词public的缩写);私钥用于解密,只有密文的接收者持有。
3 在Server服务器上加载私钥文件
仍然在ssh目录下,执行命令:
ssh-add id_rsa
系统如果提示:Identity added: id_rsa (id_rsa) 就表明加载成功了
下面有几个异常情况处理:
–如果系统提示:could not open a connection to your authentication agent
则需要执行一下命令:
ssh-agent bash
然后再执行上述的ssh-add id_rsa命令
–如果系统提示id_rsa: No such file or directory
这是系统无法找到私钥文件id_rsa,需要看看当前路径是不是不在ssh目录,或者私钥文件改了名字,例如如果建立的时候改成 aa_rsa,则这边命令中也需要相应改一下
-如果系统提示 command not found,那肯定是你命令敲错字符了J
-提示Agent admitted failure to sign using the key,私钥没有加载成功,重试ssh-add
-注意id_rsa/id_rsapub文件不要删除,存放在ssh目录下
4 把公钥拷贝至Client服务器上
很简单,例如 scp id_rsapub user@1011xxxx:~
5 ssh登录到Client服务器上,然后在Client服务器上,把公钥的内容追加到authorized_keys文件末尾(这个文件也在隐藏文件夹ssh下,没有的话可以建立,没有关系)
cat id_rsapub >> ~/ssh/authorized_keys
以下是各种补充说明,遇到问题时可以参考:
注1:这里不推荐用文件覆盖的方式,有些教程直接scp id_rsapub 到Client服务器的authorized_keys文件,会导致之前建的其他信任关系的数据被破坏,追加到末尾是更稳妥的方式;
注2: cat 完以后,Client服务器上刚才拷贝过来的id_rsapub文件就不需要了,可以删除或移动到其它地方)
注3:ssh-keygen 命令通过-b参数可以指定生成的密钥文件的长度,如果不指定则默认为1024,如果ssh-keygen –b 4096(最长4096),则加密程度提高,但是生成和验证时间会增加。对一般的应用来说,默认长度已经足够胜任了。如果是rsa加密方式,那么最短长度为768 byte
注4:authorized_keys文件的权限问题。如果按上述步骤建立关系后,仍然要验证密码,并且没有其他报错,那么需要检查一下authorized_keys文件的权限,需要作下修改: chmod g-w authorized_keys
OK,现在试试在Server端拷贝一个文件到Client服务器,应该无需交互直接就传过去了。
但是此时从Client传数据到Server服务器,仍然是需要密码验证的。如果需要两台服务器间能直接互传数据,则反过来按上述步骤 *** 作一下就可以了
二 删除服务器间信任关系的方法
如果想取消两台服务器之间的信任关系,直接删除公钥或私钥是没有用的,需要在Client服务器上,打开 ~/ssh/ authorized_keys 文件,找到对应的服务器的公钥字段并删除
每个段落的开头是ssh-rsa字样,段尾是Server服务器的帐号和ip(如下图红框),需要细心的找一下后删除整段
密钥文件内容和删除Linux服务器间信任关系的方法
三 各种可能遇到的情况和处理方法
–提示 port 22: Connection refused
可能的原因:没有正确安装最新的openssh-server,安装方法如下
sudo apt-get install openssh-server
不支持apt安装的,可以手工下载:
wget ftpsshcom/pub/ssh/ssh-3291targz
–关于目录和文件的权限设置
ssh目录的权限必须是700,同时本机的私钥的权限必须设置成600:
chmod 600 id_rsa
否则ssh服务器会拒绝登录
四 关于RSA和DSA加密算法
在ssh-keygen命令中,-t参数后指定的是加密算法,可以选择rsa或者dsa
RSA 取名自算法的三位提出者Ron Rivest, Adi Shamir, and Leonard Adleman的姓名首字母,作为一种非对称加密算法,RSA的安全性基于及其困难的大整数分解(两个素数的乘积的还原问题)。关于RSA算法原理的文章很多,感兴趣的朋友可以找来读一读。
DSA = Digital Signature Algorithm,基于有限域离散对数难题,是Schnorr和ElGamal签名算法的变种,一般用于数字签名和认证,被美国标准局(NIST)采纳为数字签名标准DSS(Digital Signature Standard),based on discrete logarithms computation
DES = Digital Encryption Standard Obsolete standard
RSA算法好在网络容易实现密钥管理,便进行数字签名,算法复杂,加/解速度慢,采用非对称加密。在实际用于信任关系建立中,这两种方法的差异很微小,可以挑选其一使用。
五 关于SSH协议的介绍
SSH全称Secure SHell,顾名思义就是非常安全的shell的意思,SSH协议是IETF(Internet Engineering Task Force)的Network Working Group所制定的一种协议。SSH的主要目的是用来取代传统的telnet和R系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具,实现对远程登陆和远程执行命令加密。防止由于网络监听而出现的密码泄漏,对系统构成威胁。
ssh协议目前有SSH1和SSH2,SSH2协议兼容SSH1。目前实现SSH1和SSH2协议的主要软件有OpenSSH和SSH Communications Security Corporation 公司的SSH Communications 软件。前者是OpenBSD组织开发的一款免费的SSH软件,后者是商业软件,因此在linux、FreeBSD、OpenBSD、NetBSD等免费类UNIX系统种,通畅都使用OpenSSH作为SSH协议的实现软件。因此,本文重点介绍一下OpenSSH的使用。需要注意的是OpenSSH和SSH Communications的登陆公钥/私钥的格式是不同的,如果想用SSH Communications产生的私钥/公钥对来登入到使用OpenSSH的linux系统需要对公钥/私钥进行格式转换。
第一次登陆后,ssh就会把登陆的ssh指纹存放在用户home目录的ssh目录的know_hosts文件中,如果远程系统重装过系统,ssh指纹已经改变,你需要把 ssh 目录下的know_hosts中的相应指纹删除,再登陆回答yes,方可登陆。请注意ssh目录是开头是””的隐藏目录,需要ls –a参数才能看到。而且这个目录的权限必须是700,并且用户的home目录也不能给其他用户写权限,否则ssh服务器会拒绝登陆。如果发生不能登陆的问题,请察看服务器上的日志文件/var/log/secure。通常能很快找到不能登陆的原因。
六 关于ssh_config和sshd_config文件配置的说明
/etc/ssh/ssh_config:
Host
选项“Host”只对能够匹配后面字串的计算机有效。“”表示所有的计算机。
ForwardAgent no
“ForwardAgent”设置连接是否经过验证代理(如果存在)转发给远程计算机。
ForwardX11 no
“ForwardX11”设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。
RhostsAuthentication no
“RhostsAuthentication”设置是否使用基于rhosts的安全验证。
RhostsRSAAuthentication no
“RhostsRSAAuthentication”设置是否使用用RSA算法的基于rhosts的安全验证。
RSAAuthentication yes
“RSAAuthentication”设置是否使用RSA算法进行安全验证。
PasswordAuthentication yes
“PasswordAuthentication”设置是否使用口令验证。
FallBackToRsh no
“FallBackToRsh”设置如果用ssh连接出现错误是否自动使用rsh。
UseRsh no
“UseRsh”设置是否在这台计算机上使用“rlogin/rsh”。
BatchMode no
“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分有用。
CheckHostIP yes
“CheckHostIP”设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为“yes”。
StrictHostKeyChecking no
“StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接。
IdentityFile ~/ssh/identity
“IdentityFile”设置从哪个文件读取用户的RSA安全验证标识。
Port 22
“Port”设置连接到远程主机的端口。
Cipher blowfish
“Cipher”设置加密用的密码。
EscapeChar ~
“EscapeChar”设置escape字符。
/etc/ssh/sshd_config:
Port 22
“Port”设置sshd监听的端口号。
ListenAddress 19216811
“ListenAddress”设置sshd服务器绑定的IP地址。
HostKey /etc/ssh/ssh_host_key
“HostKey”设置包含计算机私人密匙的文件。
ServerKeyBits 1024
“ServerKeyBits”定义服务器密匙的位数。
LoginGraceTime 600
“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。
KeyRegenerationInterval 3600
“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。
PermitRootLogin no
“PermitRootLogin”设置root能不能用ssh登录。这个选项一定不要设成“yes”。
IgnoreRhosts yes
“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。
IgnoreUserKnownHosts yes
“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/ssh/known_hosts”
StrictModes yes
“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。
X11Forwarding no
“X11Forwarding”设置是否允许X11转发。
PrintMotd yes
“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。
SyslogFacility AUTH
“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。
LogLevel INFO
“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。
RhostsAuthentication no
“RhostsAuthentication”设置只用rhosts或“/etc/hostsequiv”进行安全验证是否已经足够了。
RhostsRSAAuthentication no
“RhostsRSA”设置是否允许用rhosts或“/etc/hostsequiv”加上RSA进行安全验证。
RSAAuthentication yes
“RSAAuthentication”设置是否允许只有RSA安全验证。
PasswordAuthentication yes
“PasswordAuthentication”设置是否允许口令验证。
PermitEmptyPasswords no
“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。
AllowUsers admin
“AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或user@host这样的匹配串,这些字符串用空格隔开。主机名可以是DNS名或IP地址。

Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。

然后确认sshserver是否启动了:

ps -e |grep ssh

如果只有ssh-agent那ssh-server还没有启动,需要/etc/initd/ssh start,如果看到sshd那说明ssh-server已经启动了。

ssh-server配置文件位于/ etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,如222。然后重启SSH服务:

sudo /etc/initd/ssh resar

ssh连接:ssh linuxidc@19216811

首先在服务器上安装ssh的服务器端。

$ sudo aptitude install openssh-server

2 启动ssh-server。

$ /etc/initd/ssh restart

3 确认ssh-server已经正常工作。

$ netstat -tlp

tcp6 0 0 :ssh : LISTEN -

看到上面这一行输出说明ssh-server已经在运行了。

4 在客户端通过ssh登录服务器。假设服务器的IP地址是1921680103,登录的用户名是hyx。

方法/步骤
准备工作:首先需要在windows系统中安装虚拟机,并在虚拟机中安装好linux *** 作系统,这里安装的是vmware player虚拟机和ubuntu版本的 *** 作系统。关于该部分的安装在作者的其他经验中有详细介绍。
在windows主机中安装上ssh软件,ssh是Secure Shell 的缩写,主要提供远程登录协议。windows下的安装很简单,只要下载好安装程序,双击即可安装。安装完成后会生成两个软件图标。
在ubuntu系统中安装ssh,通常ubuntu中默认是安装的。可以通过命令进行查看:dpkg -l | grep ssh
如果ubuntu系统中没有安装ssh程序,也可以使用下列命令进行安装:
sudo apt-get install openssh-client
sudo apt-get install openssh-server
安装好后ssh服务的启动和停止命令如下:
启动ssh服务:
#sudo /etc/initd/ssh start
停止ssh服务:
#sudo /etc/initd/ssh stop
重启ssh服务:
#sudo /etc/initd/ssh restart
通过虚拟机启动ubuntu系统,打开shell终端,通过ifconfig命令,查看该系统的ip地址,ssh的端口号一般为22
打开windows系统中的ssh客户端软件,选择快速连接,输入ubuntu系统的ip地址和账户名,并根据提示输入密码,即可通过ssh登录到ubuntu系统中去,并执行各种命令 *** 作。
还可以通过ssh软件文件传输软件,将windows中的数据传输到ubuntu系统中。同时也可以将ubuntu系统中的文件下载到当前的windows系统中。方法是:选中文件--右键--上传

第一步:在Linux上安装和配置OTPW

在Debian、Ubuntu或Linux Mint上:

用apt-get安装OTPW程序包。
$ sudo apt-get install libpam-otpw otpw-bin

使用文本编辑工具,打开SSH的PAM配置文件(/etc/pamd/sshd),注释掉下面这行代码(以禁用密码验证)。
#@include common-auth

然后添加下面两行代码(以启用一次性密码验证):
auth required pam_otpwso
session optional pam_otpwso

在Fedora或CentOS/RHEL上:

在基于红帽的系统上,没有作为预制程序包的OTPW。于是,我们通过从源代码来构建的方法,安装OTPW。

首先,安装基本组件:
$ sudo yum git gcc pam-devel
$ git clone >

使用文本编辑工具打开Makefile,编辑以“PAMLIB=”开头的这一行,如下所示。

在64位系统上:
PAMLIB=/usr/lib64/security

在32位系统上:
PAMLIB=/usr/lib/security

编译后安装。请注意:安装环节会自动重启SSH服务器。所以如果你使用SSH连接,就要准备好断开。
$ make
$ sudo make install

现在你需要更新SELinux策略,因为/usr/sbin/sshd试图写入到用户的主目录,而默认的SELinux策略不允许这个 *** 作。下面这些命令可以起到更新策略的作用。如果你不使用SELinux,跳过这一步好了。
$ sudo grep sshd /var/log/audit/auditlog | audit2allow -M mypol
$ sudo semodule -i mypolpp

下一步,用文本编辑工具打开SSH的PAM配置文件(/etc/pamd/sshd),注释掉下面这行代码(以禁用密码验证)。
#auth substack password-auth

然后添加下面两行代码(以启用一次性密码验证):
auth required pam_otpwso
session optional pam_otpwso

第二步:针对一次性密码配置SSH服务器

下一步是配置SSH服务器,以接受一次性密码。

用文本编辑工具打开/etc/ssh/sshd_config,设置下列三个参数。确保你没有不止一次地添加这几行,因为那会引起SSH服务器失效。
UsePrivilegeSeparation yes
ChallengeResponseAuthentication yes
UsePAM yes

你还需要禁用默认的密码验证。可以视情况,禁用公密验证,那样万一你没有一次性密码,就可以恢复到基于密钥的验证。
PubkeyAuthentication yes
PasswordAuthentication no

现在,重启SSH服务器。

在Debian、Ubuntu或Linux Mint上:
$ sudo service ssh restart

在Fedora或CentOS/RHEL 7上:
$ sudo systemctl restart sshd

第三步:用OTPW生成一次性密码

如前所述,你需要事先创建一次性密码,并将它们存储在远程SSH服务器主机上。为此,以你登录时所用的用户身份运行otpw-gen工具。
$ cd ~
$ otpw-gen > temporary_passwordtxt

它会要求你设置一个前缀密码。你以后登录时,就需要输入这个前缀密码以及一次性密码。实际上前缀密码是另一层保护机制。即使密码表落到了不法分子手里,前缀密码也会迫使对方采用蛮力攻击。

一旦前缀密码设置完毕,命令会生成280个一次性密码,并将它们存储在输出文本文件(比如temporary_passwordtxt)中。每个密码(默认情况下长度是8个字符)的前面是三位数的索引号。你可以将文件打印在纸张上,随身携带。

你还会看到~/otpw文件已创建,这些密码的密码散列就存储在其中。每一行的头三位表明了将用于SSH登录的密码的索引号。
$ more ~/otpw
OTPW1
280 3 12 8
191ai+:ENwmMqwn
218tYRZc%PIY27a
241ve8ns%NsHFmf
055W4/YCauQJkr:
102ZnJ4VWLFrk5N
2273Xww55hteJ8Y
1509d4b5=A64jBT
168FWBXY%ztm9j%
000rWUSdBYr%8UE
037NvyryzcI+YRX
122rEwA3GXvOk=z

测试用于SSH登录的一次性密码

现在,不妨像平常那样登录到SSH服务器:
$ ssh user@remote_host

如果OTPW成功设置,你会看到略有不同的密码提示符:
Password 191:

现在打开密码表,寻找密码表中的索引号“191”。
023 kBvp tq/G 079 jKEw /HRM 135 oW/c /UeB 191 fOO+ PeiD 247 vAnZ EgUt

据上面密码表显示,编号“191”的一次性密码是“fOO+PeiD”。你需要在前面加上前缀密码。比如说,如果你的前缀密码是“000”,那么需要输入的实际的一次性密码是“000fOO+PeiD”。

一旦你成功登录,所使用的密码会自动作废。如果你查看~/otpw,就会注意到第一行被换成了“---------------”,这意味着密码“191”已经无效。
OTPW1
280 3 12 8
---------------
218tYRZc%PIY27a
241ve8ns%NsHFmf
055W4/YCauQJkr:
102ZnJ4VWLFrk5N
2273Xww55hteJ8Y
1509d4b5=A64jBT
168FWBXY%ztm9j%
000rWUSdBYr%8UE
037NvyryzcI+YRX
122rEwA3GXvOk=z

疫情期间远程办公,搭建了方便远程连接公司服务器,连接需要知道公司的公网ip,而公网ip是动态变化,所以需要远程连接公司的服务器,查看公网ip。

记录下,备忘。

Linux 查询公网ip 指令:

向日葵Linux安装、使用方法

缺点:需要付费,精英版专享功能

通过ngrok内网穿透工具,创建tcp通道,监听22端口,这样可以通过ssh工具进行连接。

创建tcp通道

执行该指令,可以开始tcp通道,并监听22端口,但是无法关闭该终端(需要后台执行)。

启动之后使用该curl查看映射映射:curl localhost:4040/api/tunnels

启动之后便有了对应的映射关系:比如: tcp://3tcpngrokio:10111 -> localhost:22

首先进入/etc目录下,/etc目录存放的是一些配置文件,比如passwd等配置文件,要想使用ssh远程登陆,需要配置/etc/ssh/sshd_config文件里的配置信息,使用vim编辑,在命令行模式下输入 vim /etc/ssh/sshd_config,进入之后,按“i”进入编辑状态,在其文件里找到并修改为:PasswordAuthentication yes , PermitRootLogin yes两行即可,

修改之后,按“esc”退出,并按“:wq”保存并退出,或直接按“:x”直接保存退出,(注意:此处的x为小写x,大写X是将文件内容加密,使用时细心注意),

退出编辑模式之后,回到命令模式,输入 sevice ssh start/stop/restart/status,启动/停止/重启/状态,选择start启动ssh服务。

如果上面开启SSH服务的命令不能用,可以使用命令:sudo service sshd start 试试,检查是否开启SSH服务使用命令:ps -e | grep sshd

此时可以查看ssh状态是否为运行状态,运行状态即可使用ssh远程登陆。

使用“ifconfig”命令查询ip地址

使用ssh登陆时,输入主机(linux的ip地址),账号,密码登陆!

如果需要远程连接SSH,需要把22端口在防火墙上开放,关闭防火墙,或者设置22端口例外  /etc/initd/iptables stop

怎么通过ssh登陆可参看下一篇“通过ssh实现远程登陆服务器!”

大致步骤为:

SSH 服务配置文件位置
/etc/ssh/sshd_config
# 修改配置
PasswordAuthentication yes
PermitRootLogin yes
# 启动SSH 服务
sevice ssh start/stop/status

安装SSH:yum install ssh
启动SSH: service sshd start
设置开机运行: chkconfig sshd on


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/12639239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存