$ grep ListenAddress /etc/ssh/sshd_config
ListenAddress 0.0.0.0
$
这只会在 IPv4 上监听。
但问题是:它如何才能仅在 10.0.0.0/8 和 172.16.0.0/12 和 192.168.0.0/16 上监听?
$ grep ListenAddress /etc/ssh/sshd_config
ListenAddress 0.0.0.0
$
这只会在 IPv4 上监听。
但问题是:它如何才能仅在 10.0.0.0/8 和 172.16.0.0/12 和 192.168.0.0/16 上监听?
我正在运行 Ubuntu 22.04.3,并通过 SSHD 配置 sFTP 服务器。我有几个用户主目录,每个目录中都有一个投递文件夹和一个拾取文件夹。虽然我的管理员用户能够导航服务器并查看任何目录的内容。管理员无法在其他用户目录中添加或删除任何文件。上述取件和寄件目录归 root 所有,该组标记为“sftp”。该 sftp 组包含我希望访问我的服务器并拾取/放下文件的所有用户。我的管理员用户不属于 sftp 组。当我将管理员添加到 SFTP 组时,我无法再以管理员身份访问服务器。当管理员不属于该组时,我可以访问服务器,但无法从属于 sftp 组的目录添加/删除文件。
我的sshd.conf如下:
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
PasswordAuthentication yes
Match group sftp
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
任何指导将不胜感激。
编辑1:
ls -ld pickup
节目drwxrwxr-x 2 root sftp 4096 Dec 18 16:22 pickup
编辑2:
我正在使用 WinSCP 和 FileZilla 连接到服务器。我有一个不熟悉终端使用的用户,需要向客户端发送文件或从客户端发送文件。此管理员帐户当前可以查看服务器上的所有文件,但无法添加或删除任何文件(例如 .xlsx)。我不会向没有终端经验或不了解 SFTP 是什么的人提供对服务器的完全访问和控制。那将是不明智的。我想做的是为自己创建一个帐户进行测试。这样我就知道在将该帐户授予我的用户之前要授予该帐户哪些权限和属性。
目前,该帐户可以查看诸如 等目录中的文件/home/client1/dropoff
,但无法从 dropoff 目录中添加或删除文件。我需要该帐户能够导航/home/
并进入所有客户端目录和子目录,并随意添加或删除文件。目前我的客户端用户只能访问他们的主目录/client1/
和相应的子目录。他们可以毫无问题地添加或删除文件,因为客户帐户是“sftp”组的成员,子目录也是如此。
我尝试将此管理员帐户添加到 sftp 组,但是当我这样做时,我无法再通过 WinSCP 或 FileZilla 连接到服务器。我尝试在 WinSCP 中将 SFTP 环境设置的协议选项从“默认”更改为“sudo su -c /bin/sftp-server”,但这给了我一个错误,Cannot initialize SFTP protocol. Is the host running an SFTP server?
我知道这是因为当我检查服务器和协议时信息文件传输协议标记为“SFTP-3”。
我的管理员帐户所属的组如下:
sudo adm cdrom dip plugdev lxd ftpadmin
到目前为止,我们在所有服务器(Debian 10 到 12)上使用 OpenSSH GSSAPI 身份验证。然后我们 sudo -i,使用 ldap 身份验证(通过 sssd-ldap)。
我想摆脱 ldap 身份验证并仅依赖 GSSAPI,对于 OpenSSH 和 Sudo 都是如此。这个想法是将票证服务转发到 Openssh (host/fqdn),将其保存在凭证缓存中(通常是 /tmp/krb5...)并保留 TGS 来验证 sudo (我发现 pam_sss_gss.so 可以验证 sudo与 GSSAPI)。
问题是...OpenSSH 一旦验证了票证服务就会破坏它。
这是我的问题:
谢谢。
首先,我想指出,我知道还有很多关于 SSH 代理转发的其他问题。那里的人想知道如何使代理转发工作或如何安全地配置它。但我有相反的问题:似乎我无法可靠地禁用它。所以我们开始:
我正在运行一个 Debian bullseye 系统,在撰写本文时是最新的,基本上是 vanilla。在该系统上,SSH 守护进程正在运行,其中配置如下/etc/ssh/sshd_config
:
AcceptEnv LANG LC_*
AllowAgentForwarding no
AllowTcpForwarding no
AllowStreamLocalForwarding no
ChallengeResponseAuthentication no
Ciphers [email protected],[email protected]
Compression no
DebianBanner no
HostKeyAlgorithms rsa-sha2-512,ssh-ed25519
KbdInteractiveAuthentication no
KexAlgorithms curve25519-sha256,[email protected],diffie-hellman-group-exchange-sha256
ListenAddress aaa.bbb.ccc.ddd
LoginGraceTime 20
MACs [email protected],[email protected]
PasswordAuthentication no
PermitUserRC no
Protocol 2
# The first of the following version is the right one.
# However, for brain-dead WinSCP, we need the second version.
#PubkeyAcceptedKeyTypes rsa-sha2-512,rsa-sha2-256,ssh-ed25519
PubkeyAcceptedKeyTypes rsa-sha2-512,rsa-sha2-256,ssh-ed25519,ssh-rsa
RekeyLimit 100M 20m
Subsystem sftp /usr/lib/openssh/sftp-server
Match user copyremote
ChrootDirectory /backup
ForceCommand /usr/lib/openssh/sftp-server
这是完整的配置文件;除了它侦听的 IP 地址外,没有任何内容被删除或混淆。此外,没有其他地方包含 SSH 守护进程的额外配置片段。
基本上,该配置试图关闭我不需要的所有功能,例如代理转发功能(注意:在该配置文件中,我没有为默认关闭的大多数功能添加行(根据手册))。我们还看到身份验证完全基于公钥。
前几天,我正在调查用户copyremote
和 sftp 子系统的问题,因此将-v
其作为参数提供给sftp
客户端计算机。这导致以下输出(仅显示相关部分):
root@morn ~/scripts # sftp -v -i ~/.ssh/id_rsa_backup_user [email protected]:/backup/achilles.bsdtar.gz .
OpenSSH_8.4p1 Debian-5+deb11u1, OpenSSL 1.1.1n 15 Mar 2022
[...]
debug1: Remote: /home/usr/copyremote/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
debug1: Remote: /home/usr/copyremote/.ssh/authorized_keys:1: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
[...]
现在这很可怕。我以为我在服务器上的系统范围配置文件中全局关闭了代理转发。但是,据我了解该输出,它提供了它。
谁能解释一下我如何在全球范围内关闭代理转发(以及我不希望服务器提供的其他功能) ?
这些功能可以在文件中明确禁用authorized_keys
,但如果有多个用户并且每个用户都接受多个公钥,那将非常容易出错并且需要大量工作,所以我真的更希望能够一次将其关闭地方。
这是服务器上authorized_keys
用户的文件:copyremote
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDs6ku+LXaUBs....JFchhaoQ== me@client
里面没有什么特别的。值得注意的是,代理转发是不允许明确的。为什么它不应用系统范围配置中的设置呢?
PS 我知道 SSH / SFTP chroot 不提供我们期望的安全性。我已经在服务器上实施了进一步的措施来缓解这个问题,所以这里不需要讨论 :-)
我读了这个问题
在答案和解决方案中出现以下命令(在此处改编以用于演示目的)
ssh-keyscan 192.168.1.X | ssh-keygen -lf -
我知道隔离的第一个命令显示public keys
了主机的。当完整的命令被执行时——因此是两个部分——根据最终输出,第一个命令的公钥用于生成自己的指纹。
问题
-
在命令中如何工作ssh-keygen -lf -
?这是强制性的。我知道l
是显示指纹并f
定义文件名,但如何解释-
?
我读了这个问题:
答案是有效的,所以我尝试了一些变化:
ssh-keygen -lf ~/.ssh/known_hosts -F 192.168.1.X
ssh-keygen -lvf ~/.ssh/known_hosts -F 192.168.1.X
ssh-keygen -E md5 -lvf ~/.ssh/known_hosts -F 192.168.1.X
ssh-keygen -E sha256 -lvf ~/.ssh/known_hosts -F 192.168.1.X
一切都按预期工作。
如何观察:对于上面的任何命令共享,它会根据它们自己的密钥类型一起显示所有指纹,例如,等等....我对此很满意,但是......这篇文章的原因rsa
ecdsa
问题:
ssh-keygen
使用特定过滤器执行命令key type
?ssh-keyscan
与选项类似的-t
东西,因此类似于:
ssh-keygen -lf ~/.ssh/known_hosts -F 192.168.1.X -? rsa
ssh-keygen -lf ~/.ssh/known_hosts -F 192.168.1.X -? ecdsa
那么可能是?
什么?- 我看到了ssh-keygen --help
,似乎没有那个支持。
关于选项的ssh-keyscan
命令-H
根据:
它表明
-H Hash all hostnames and addresses in the output. Hashed names may be used normally
by ssh and sshd, but they do not reveal identifying information should the file's
contents be disclosed.
我不明白这个想法和它的目的。这就是这个帖子的原因。请你能澄清它的用途吗?
我确实意识到对于两个不同的主机,如果执行
# Pair I
ssh-keyscan 192.168.1.x
ssh-keyscan 192.168.1.y
# Pair II
ssh-keyscan -H 192.168.1.x
ssh-keyscan -H 192.168.1.y
第一对:对于每个 IP,显示每个公钥的输出,并将密钥类型指示为dsa, ecdsa, ed25519
和rsa
。
第二对:对于每个 IP,显示每个公钥的输出,并将密钥类型指示为和dsa, ecdsa, ed25519
-rsa
但是在每个密钥类型的开头出现|1|
带有一些随机文本的文本
问题:
-H
在命令中如何工作ssh-keyscan
?额外问题
-H
?|1|
with some random text是什么意思?请记住,对于两个不同的主机,输出中会出现|1|
一些随机文本,它针对每种密钥类型。所以我假设这不是巧合
笔记
出于安全原因,我不会共享输出
我将从本地机器发送一个字符串到远程 ssh 服务器。
用户在一个简单的监狱里,所以他不能执行命令、登录、在远程 bash 上做一些事情,他只能发送一个字符串/值/变量并run
在 ssh 服务器上执行脚本。
这是用户的简单监狱
这是 USER 登录和运行 shell 的默认设置:
chsh -s /bin/bash [USER]
但是我将设置更改为这个简单的监狱:
chsh -s /home/[USER]/./run [USER]
ssh 服务器接收字符串并将字符串更改为新结果。
我将这个新结果保存在本地机器上一个名为OUTPUT
.
尝试后我找到了这个解决方案,称它为 hack 或 bug,但我不知道这是否是正确的方法!
我在本地机器上的 SSH 命令连接到服务器:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] '123' <<< "$VALUE" > OUTPUT
run
接收字符串123
$VALUE
run
我在 SSH 服务器上的名字脚本
#!/bin/bash
echo "WELCOME TO SSH"
read VALUE
echo $VALUE
这只是一个例子,看看我的意思,真正的脚本生成一个哈希。
OUTPUT
脚本中的结果存储/保存在我的文件中。run
我的本地文件OUTPUT
与来自服务器的结果
WELCOME TO SSH
123
该read VALUE
命令在没有提示的情况下将值保存123
在变量中$VALUE
,并将结果保存在我的本地计算机上。
执行步骤:
当我启动 ssh 命令时,它会打开连接,
脚本有效,我WELCOME TO SSH
在终端上看到
我在本地机器上收到结果并关闭连接。
您可以在您的机器上轻松测试此示例以了解我的意思。
这正是我需要的,但我想知道:
为什么我需要read
为什么我没有得到提示。
此示例的其他解决方案是什么。
如何通过 ssh 将字符串发送到服务器上的脚本,并使用被监禁的用户将服务器上的结果保存在本地计算机上的文件中?
更新解决方案
从@ilkkachu 回答我可以运行这个命令并发送:
字符串和变量:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123" "$VALUE" > OUTPUT
细绳:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "123"> OUTPUT
多变的:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] "$VALUE" > OUTPUT
没有什么:
ssh -i [KEY] -p [XXXX] [USER]@[HOST] > OUTPUT
#!/bin/bash
value= # empty by default
if [ "$1" = -c ]; then
value="$2"
fi
if [ -z "$value" ]; then
echo "value is empty" >&2
exit 1
fi
# do something with the value
echo "$value" | rev
SSH authorized_keys 命令选项
从这篇文章:
SSH authorized_keys 命令选项:多个命令?
不,这不是“允许”命令,而是“强制”命令(作为 ForceCommand 选项)。唯一的可能性是对不同的命令使用不同的键或从标准输入读取参数。
这是一个很好的提示,但对于单个命令,例如备份或输出一些信息。
如果我运行类似的命令rsync
,如果我不想收到错误,我必须做更多的配置。
所以我会和一个简单的被监禁用户和一个给定的脚本呆在一起。
我已经阅读了很多解决这个问题的方法,但似乎没有一个适用于我所看到的。大多数关注目录权限,但在这种情况下似乎是正确的。TL;DR:两个具有相同主目录的 Centos7 服务器;sshd
即使已启用,一个人也不允许公钥身份验证。
我有两台 centos7 服务器,我们称它们centos-a
为centos-b
. 主目录是通过 NFS 挂载的,因此.ssh
两者之间的目录是相同的(下面对此进行确认)。我可以从 sshcentos-a
到centos-a
,但不能到centos-b
。我可以从centos-b
tocentos-a
和 to SSH centos-b
。
SSH 能力 | centos-a |
centos-b |
---|---|---|
centos-a |
是的 | 不 |
centos-b |
是的 | 是的 |
[myuser@centos-a ~]$ ls -la ~/.ssh
total 16
drwx------. 1 myuser domain users 0 Jul 6 11:45 .
drwx------. 1 myuser domain users 0 Jul 7 13:44 ..
-rw-------. 1 myuser domain users 1212 Jul 6 12:02 authorized_keys
-rw-------. 1 myuser domain users 1675 Jul 6 11:45 id_rsa
-rw-r--r--. 1 myuser domain users 402 Jul 6 11:45 id_rsa.pub
-rw-r--r--. 1 myuser domain users 1119 Jul 6 17:49 known_hosts
[myuser@centos-a ~]$ md5sum ~/.ssh/*
65b4fdf2d59cee3ae45b8480454453ec /home/myuser/.ssh/authorized_keys
fa3e9fc5a8ff08787ff2ba8f979da24e /home/myuser/.ssh/id_rsa
dca36ab3ec342423c5eca588f2ad5678 /home/myuser/.ssh/id_rsa.pub
f67bc94bc7a30b9876e3027b24f893d8 /home/myuser/.ssh/known_hosts
[myuser@centos-a ~]$ ssh centos-a hostname
centos-a
[myuser@centos-a ~]$ ssh centos-b hostname
myuser@centos-b's password:
[myuser@centos-b ~]$ ls -la ~/.ssh
total 16
drwx------. 1 myser domain users 0 Jul 6 11:45 .
drwx------. 1 myser domain users 0 Jul 7 13:44 ..
-rw-------. 1 myser domain users 1212 Jul 6 12:02 authorized_keys
-rw-------. 1 myser domain users 1675 Jul 6 11:45 id_rsa
-rw-r--r--. 1 myser domain users 402 Jul 6 11:45 id_rsa.pub
-rw-r--r--. 1 myser domain users 1119 Jul 6 17:49 known_hosts
[myuser@centos-b ~]$ md5sum ~/.ssh/*
65b4fdf2d59cee3ae45b8480454453ec /home/myuser/.ssh/authorized_keys
fa3e9fc5a8ff08787ff2ba8f979da24e /home/myuser/.ssh/id_rsa
dca36ab3ec342423c5eca588f2ad5678 /home/myuser/.ssh/id_rsa.pub
f67bc94bc7a30b9876e3027b24f893d8 /home/myuser/.ssh/known_hosts
[myuser@centos-b ~]$ ssh centos-b hostname
centos-b
[myuser@centos-b ~]$ ssh centos-a hostname
centos-a
如上所示,.ssh 目录上的权限似乎是正确的(无论如何,两台机器之间的权限都是相同的)。
ssh -vvv
在失败的 ssh 上显示:
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
...
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4
debug1: match: OpenSSH_7.4 pat OpenSSH* compat 0x04000000
...
debug1: Host 'centos-b' is known and matches the ECDSA host key.
...
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug3: start over, passed a different list publickey,gssapi-keyex,gssapi-with-mic,password
debug3: preferred gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup gssapi-keyex
debug3: remaining preferred: gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_is_enabled gssapi-keyex
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug2: we did not send a packet, disable method
debug3: authmethod_lookup gssapi-with-mic
debug3: remaining preferred: publickey,keyboard-interactive,password
debug3: authmethod_is_enabled gssapi-with-mic
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: KEYRING:persistent:1211402155)
debug1: Unspecified GSS failure. Minor code may provide more information
No Kerberos credentials available (default cache: KEYRING:persistent:1211402155)
debug2: we did not send a packet, disable method
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/myuser/.ssh/id_rsa
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Trying private key: /home/myuser/.ssh/id_dsa
debug3: no such identity: /home/myuser/.ssh/id_dsa: No such file or directory
debug1: Trying private key: /home/myuser/.ssh/id_ecdsa
debug3: no such identity: /home/myuser/.ssh/id_ecdsa: No such file or directory
debug1: Trying private key: /home/myuser/.ssh/id_ed25519
debug3: no such identity: /home/myuser/.ssh/id_ed25519: No such file or directory
debug2: we did not send a packet, disable method
debug3: authmethod_lookup password
debug3: remaining preferred: ,password
debug3: authmethod_is_enabled password
debug1: Next authentication method: password
myuser@centos-b's password:
将此与我看到的从centos-b
to 进行对比centos-a
,这很有效:
...
debug1: Unspecified GSS failure. Minor code may provide more information
Server not found in Kerberos database
debug3: send packet: type 50
debug2: we sent a gssapi-with-mic packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug2: we did not send a packet, disable method
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/myuser/.ssh/id_rsa
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: pkalg rsa-sha2-512 blen 279
debug2: input_userauth_pk_ok: fp SHA256:nAO5pVOzqUQzEUSEBN37WKp6ADs9Sk4rfTRGmk0FHEY
debug3: sign_and_send_pubkey: RSA SHA256:nAO5pVOzqUQzEUSEBN37WKp6ADs9Sk4rfTRGmk0FHEY
debug3: send packet: type 50
debug3: receive packet: type 52
debug1: Authentication succeeded (publickey).
我已启用 sshd 登录消息/etc/ssh/sshd_config
并重新启动服务
# Logging
SyslogFacility AUTH
SyslogFacility AUTHPRIV
LogLevel INFO
但是/var/log/secure
或中没有其他有用的消息/var/log/messages
。
有趣的是,ssh from centos-b
tocentos-b
正在使用 gssapi 身份验证。如果我强制它使用 publickey 它会失败:
[myuser@centos-b ~]$ ssh -vvv -o PreferredAuthentications=publickey centos-b hostname
...
debug1: Offering RSA public key: /home/myuser/.ssh/id_rsa
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
...
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
我看到/var/log/messages
:
Jul 7 13:52:10 centos-b sshd[23266]: Connection closed by 192.168.1.100 port 48064 [preauth]
公钥已启用:
[root@centos-b ssh]# sshd -T | grep -i pub
pubkeyauthentication yes
pubkeyacceptedkeytypes [email protected],ecdsa-sha...
这sshd_config
是一个股票 Centos7 ,并且在andsshd_config
之间是相同的(通过在两台机器上通过管道传递以下命令来验证centos-a
centos-b
md5sum
[root@centos-b ssh]# grep -v -e '^#' -e '^$' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
对我所缺少的有什么建议吗?