Synology DSM 6.2.x:如何以非管理员用户身份进行 SSH

Synology DSM 6.2.x:如何以非管理员用户身份进行 SSH

从 DSM 6.2.2 开始,我们无法通过 ssh 以非管理员用户身份连接到 Synology NAS。以前,只需将登录 shell 从 更改为 即可/etc/passwd/sbin/nologin现在/bin/sh似乎不再有效了。

我还尝试过/etc/ssh/sshd_conf明确地编辑AllowUsers,但无济于事。看来客户端成功进行了身份验证,但随后某个 PAM 模块(?) 又关闭了连接。

有人在最新版本的 DSM 下以非管理员身份使用 ssh 工作吗?

这是日志输出:

2019-05-23T21:55:36+02:00 hostname sshd[13551]: pam_unix(sshd:session): session opened for user test by (uid=0)
2019-05-23T21:55:36+02:00 hostname sshd[13551]: pam_unix(sshd:session): session closed for user test

答案1

在具有 Docker 的 DiskStations 上,我发现使用 OpenSSH 容器最容易。我选择了linuxserver/openssh-server。这样,我就可以只将相关数据安装到容器中,而不必弄乱 Synology 的配置。

答案2

这是解决除非您是管理员组成员,否则无法通过 ssh 登录 Synology NAS 的问题的解决方案。从网上阅读有关此问题的几篇文章来看,这个问题存在于 DSM 6.2.x 中

有很多正当理由可以授予用户 ssh 访问权限。同时,并非每个用户都需要管理员访问权限,因此 Synology Inc. 强制执行此规则似乎是一个糟糕的决定。我还没有找到使用库存 sshd 修复此问题的方法,所以我编译了自己的 sshd。

如果您洒了咖啡、在椅子上绊倒、摔倒在猫身上,或者因本指南而受到其他伤害,我概不负责。但截至 2019 年 10 月,所有内容均已在我的实验室中测试过。

开始吧。

测试系统:

 Synology DS418j with DSM 6.2.2-24922 Update 3, Linux hostname 4.4.59+ 
  #24922 aarch64 GNU/Linux synology_rtd1296_ds418j  
 Qubes release 4.0 (R4.0) with an App-VM running Fedora release 30 (Thirty)

先决条件:

  • 您可以通过 ssh 使用管理员组中的现有用户访问 Synology NAS。
  • Linux 环境,可以虚拟化。在 Mac 上,系统终端就足够了。按照我的指导,安装 Fedora 30。如果你使用 Ubuntu,至少需要使用 apt-get 而不是 dnf,可能还有其他发行版特定的元素。

警告,如果您习惯在安装 Linux 软件时使用“make install”。请不要在遵循本指南时这样做,除非您知道自己在做什么并且偏离了指南。如果这样做,可能会破坏您的系统。此外,从编译主机的角度来看,在按照本指南工作时,除了普通用户之外,不需要任何其他人。只有偶尔才需要 sudo。

此外,如果您出于某种原因设法破坏了 ssh 守护程序,您可以随时通过 DSM Web UI 启用 telnet,并通过 telnet 连接到 synology cli 以纠正您的错误。此外,明智的做法是记下您正在做的所有事情,并在执行之前备份您要替换的所有文件和您要更改的所有文件。请注意,如果您正在执行本指南,使用远程 synology 服务器,并且您不完全确定自己在做什么,那么您可能会将自己锁定在服务器之外。至少,确保您有一个出口,例如可以为您恢复访问权限的管理员现场。

在本指南的其余部分中,Synology 和 DS(Disk Station)将互换使用。

由于 Synology Inc. 似乎已经改变了原始的 sshd 二进制文件,本指南将教您如何添加一个 sshd 二进制文件,以便管理员组之外的用户可以通过 ssh 访问 synology 框。

有趣的是,可以做一些称为交叉编译的事情,这意味着你可以在一个平台上编译可以在另一个平台上运行的软件。

openssh 的源代码已经可用,依赖项也已可用。这意味着我们可以在 Linux 系统上编译它,并在具有 ARM CPU 的 Synology 上运行它。

首先,您需要访问 Linux 机器。如果您没有安装 Linux,请下载虚拟化软件(如 vmware 或 virtualbox)并安装或加载 Linux 虚拟机。使用 cygwin 作为 Windows 中的子系统也可能有效。请参阅相关文档。

请注意,本指南的某些内容可能不适合您的独特情况,请相应地调整本指南的流程。即使您的设置与我不同,本指南也应该为您提供一些修复 ssh 问题的指示。

首先,找出你的 DS 具有哪种处理器。

在这里找到您的特定 Synology 型号:https://www.synology.com/en-global/knowledgebase/DSM/tutorial/Compatibility_Peripherals/What_kind_of_CPU_does_my_NAS_have

还要检查您的 synology 终端上的 ssh 会话,uname -a 应该会给您一些提示。

就我而言,Synology 支持中心链接和 uname -a 的输出都显示我有一个 Realtek RTD1293 CPU,它是一个 ARM 处理器,有关更多有趣的信息,请查看https://en.wikichip.org/wiki/arm/aarch64

因此,我们需要获取源代码并在 Linux 笔记本电脑上进行交叉编译,这样我们就可以将二进制文件 scp 到 synology 并绕过登录限制。

在继续之前,请验证您是否可以 ssh 进入您的 synology,如果您的 ssh-fu 很强大,您可能已经在 ~/.ssh/config 中设置了一个如下所示的条目:

#My synology
Host DS
    Port 22
    Hostname 192.168.10.100
    User localuser
    IdentityFile /home/localuser/.ssh/id_ed25519

根据您当地的情况替换变量。

至少,你应该能够通过运行 ssh 之类的命令登录到你的 synology[电子邮件保护]。如果您具有非默认身份文件或非默认端口,请添加这些参数。如何配置无密码 ssh 超出了本指南的范围。请注意,在允许 ssh 登录之前,synology 还会对属于用户的所有文件和目录的权限非常挑剔。网上有很多关于此的帖子。但是,您可以继续使用密码登录,但是如果您在本地网络上并使用私有的最终消费者设备,则使用 ssh-keys 登录 ssh 会更方便。您也可以在私钥上使用密码。还要检查使用现​​有用户登录时是否可以执行 sudo whoami。除非您已将 sudo 配置为不需要用户密码,否则这会提示您输入 sudo 密码,按下 Enter 键后您将看到“root”。

现在是有趣的部分!!

在您的 Linux(Fedora?)实例上,登录、启动终端并创建一个项目目录并输入它。

mkdir ~/crosscompile ; cd ~/crosscompile

在您的 Linux 实例中使用 Web 浏览器,然后转到https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/,在底部找到最新版本。Pr. 2019 年 10 月这是 openssh-8.1p1。

返回 Linux 终端并下载它,我将使用 8.1p1,但如果您在发布新版本时看到本指南,请使用较新的版本。

wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.1p1.tar.gz
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.1p1.tar.gz.asc

第二行获取文件的 PGP 签名。

现在,如果尚未安装,请安装 pgpdump:

sudo dnf install pgpdump

与..一起处理

pgpdump openssh-8.1p1.tar.gz.asc

示例输出:

Old: Signature Packet(tag 2)(451 bytes)
    Ver 4 - new
    Sig type - Signature of a binary document(0x00).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA512(hash 10)
    Hashed Sub: issuer fingerprint(sub 33)(21 bytes)
     v4 -   Fingerprint - 59 c2 11 8e d2 06 d9 27 e6 67 eb e3 d3 e5 f5 6b 6d 92 0d 30 
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Wed Oct  9 02:39:36 CEST 2019
    Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0xD3E5F56B6D920D30
    Hash left 2 bytes - 1c 52 
    RSA m^d mod n(3195 bits) - ...
        -> PKCS-1

注意密钥 ID,0xD3E5F56B6D920D30(新版本可能会有所不同..)还请注意指纹,我们会回到这一点。

现在,如果尚未安装,请安装 gpg2;

sudo dnf install gpg2.

从发布者处获取 pgp-key:

wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/DJM-GPG-KEY.asc

导入:

gpg2 --import DJM-GPG-KEY.asc

获取发布密钥并导入:

wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/RELEASE_KEY.asc
gpg2 --import RELEASE_KEY.asc

现在验证下载:

gpg2 --verify openssh-8.1p1.tar.gz.asc openssh-8.1p1.tar.gz

结果:

gpg: Signature made Wed Oct  9 02:39:36 2019 CEST
gpg:                using RSA key 59C2118ED206D927E667EBE3D3E5F56B6D920D30
gpg: Good signature from "Damien Miller <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 59C2 118E D206 D927 E667  EBE3 D3E5 F56B 6D92 0D30

请注意,指纹与 pgpdump 从 pgp 签名中告诉我们的指纹相匹配。一切看起来都很好。如果您担心密钥不受签名信任,则需要自己编辑密钥的信任,或者找人来做。如果您有一个非常关键的安装,联系 Damien Miller 并让他读取指纹是一种选择。您可能应该为此给他一些补偿!

无论如何,为了确保下载尽可能安全,您应该通过多个来源进行验证,所以让我们尝试一下。

快速搜索后,你会看到 Miller 的博客。这篇文章提供了更多详细信息:

http://blog.djm.net.au/2013/12/pgp-keys-rotated.html

现在将整个密钥 blob 复制到磁盘上的文件中,然后对其执行 pgpdump 文件名。

这应该会给你如下输出:

pgpdump keyblob | grep 0D30  | grep fin
Key fingerprint = 59C2 118E D206 D927 E667  EBE3 D3E5 F56B 6D92 0D30

如果您感兴趣,请将命令的整个输出复制到文本编辑器并搜索“0xD3E5F56B6D920D30”,如指南前面所述。然后您将看到 release-key 是 Miller 个人密钥的子密钥。

好的,此时,我们假设 openssh 下载是成功的。

解压 openssh:

tar xvzf openssh-8.1p1.tar.gz

您必须确定您需要哪个工具链:https://originhelp.synology.com/developer-guide/compile_applications/download_dsm_tool_chain.html

就我而言,我使用以下命令下载了我需要的那个:

wget https://sourceforge.net/projects/dsgpl/files/DSM%206.2.2%20Tool%20Chains/Realtek%20RTD129x%20Linux%204.4.59/rtd1296-gcc494_glibc220_armv8-GPL.txz/download -O rtd1296-gcc494_glibc220_armv8-GPL.txz

据我所知,没有办法验证下载。我将其上传到virustotal,但没有找到引擎。

提取工具链:

sudo tar Jxvf rtd1296-gcc494_glibc220_armv8-GPL.txz -C /usr/local

此外我们还需要 zlib 和 openssl。

  wget https://zlib.net/zlib-1.2.11.tar.gz
  wget https://zlib.net/zlib-1.2.11.tar.gz.asc

(也可在此处查看更新版本)

pgpdump zlib-1.2.11.tar.gz.asc | grep ID

给出密钥 ID - 0x783FCD8E58BCAFBA

获取并导入:

wget http://pgp.key-server.io/download/0x783FCD8E58BCAFBA
gpg2 --import 0x783FCD8E58BCAFBA

验证下载:

gpg2 --verify zlib-1.2.11.tar.gz.asc zlib-1.2.11.tar.gz

这应该能得到 Mark Adler 的良好签名[电子邮件保护]

此时,如果您需要进一步验证,您可以使用指纹或 DSA 密钥,尝试在网络上的其他地方查找参考资料。

Extract zlib: tar xvzf zlib-1.2.11.tar.gz

我们还需要 openssl:

  wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
  wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz.sha256
  wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz.asc

sha256sum openssl-1.1.1d.tar.gz gives 1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2  
cat openssl-1.1.1d.tar.gz.sha256 gives 1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2

现在我们已经验证了文件的完整性。让我们也检查一下签名。

pgpdump openssl-1.1.1d.tar.gz.asc  | grep -E "Fin|ID"

结果:

 v4 -   Fingerprint - 86 57 ab b2 60 f0 56 b1 e5 19 08 39 d9 c4 d2 6d 0e 60 44 91 
Sub: issuer key ID(sub 16)(8 bytes)
    Key ID - 0xD9C4D26D0E604491

让我们获取密钥并将其导入到密钥环:

 wget http://pgp.key-server.io/download/0xD9C4D26D0E604491
 gpg2 --import 0xD9C4D26D0E604491 

结果:

gpg: key D9C4D26D0E604491: public key "Matt Caswell <[email protected]>" imported

我们现在验证下载:

gpg2 --verify openssl-1.1.1d.tar.gz.asc openssl-1.1.1d.tar.gz

gpg: Signature made Tue Sep 10 15:13:14 2019 CEST
gpg:                using RSA key 8657ABB260F056B1E5190839D9C4D26D0E604491
gpg: Good signature from "Matt Caswell <[email protected]>" [unknown]
gpg:                 aka "Matt Caswell <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 8657 ABB2 60F0 56B1 E519  0839 D9C4 D26D 0E60 4491

指纹匹配,并且在这里也可以找到对相同指纹的引用:https://wiki.freebsd.org/OpenSSL/Base/Update111

此时我们必须假设我们下载的所有软件都已经验证没问题,现在让我们构建 ARM sshd 二进制文件!

cd zlib-1.2.11

让我们配置zlib:

CC=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-gcc LD=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-ld CFLAGS+=-I/usr/local/aarch64-unknown-linux-gnueabi/aarch64-unknown-linux-gnueabi/sysroot/usr/include LDFLAGS+=-L/usr/local/aarch64-unknown-linux-gnueabi/aarch64-unknown-linux-gnueabi/lib ./configure 

然后这样做:

make

我们来验证一下:

ls -l libz* 

现在应该显示如下内容:

-rw-rw-r-- 1 user user 155378 Oct 20 04:45 libz.a
lrwxrwxrwx 1 user user     14 Oct 20 04:45 libz.so -> libz.so.1.2.11
lrwxrwxrwx 1 user user     14 Oct 20 04:45 libz.so.1 -> libz.so.1.2.11
-rwxrwxr-x 1 user user 133664 Oct 20 04:45 libz.so.1.2.11

好的 Synology 用户!让我们编译 openssl!

让我们提取它并改变到工作目录:

cd .. && tar xvzf openssl-1.1.1d.tar.gz && cd openssl-1.1.1d

然后我们进行配置:

CFLAGS+=-I/usr/local/aarch64-unknown-linux-gnueabi/aarch64-unknown-linux-gnueabi/sysroot/usr/include LDFLAGS+=-L/usr/local/aarch64-unknown-linux-gnueabi/aarch64-unknown-linux-gnueabi/lib ./Configure  linux-generic64 shared  -DL_ENDIAN --prefix=/home/user0/opensslArm --openssldir=/home/user/opensslArm  CC=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-gcc RANLIB=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-ranlib AR=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-ar LD=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-ld MAKEDEPPROG=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-gcc PROCESSOR=ARM 

现在让我们来做一下:

make

这需要一段时间,所以请耐心等待。

我们来验证一下:

ls lib*so* 

应该给予

libcrypto.so  libcrypto.so.1.1  libssl.so  libssl.so.1.1

恭喜,您离实现这一目标已经越来越近了!

让我们编译 openssh!

首先我们必须配置它:

./configure --host=arm-linux --with-libs --with-zlib=/home/user/crosscompile/zlib-1.2.11 --with-ssl-dir=/home/user/crosscompile/openssl/openssl-1.1.1d --disable-etc-default-login CC=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-gcc AR=/usr/local/aarch64-unknown-linux-gnueabi/bin/aarch64-unknown-linux-gnueabi-ar

现在,实现它:

make

现在在 ~/crosscompile/openssh-8.1p1 中创建了几个可执行二进制文件

让我们看看我们是否可以使用我们创建的新 sshd 二进制文件通过 ssh 以普通用户身份登录 DS。现在您应该可以使用属于管理员组的现有用户无密码登录 DS。

我们将新的 sshd 和 libcrypto 复制到 DS:

scp ~/crosscompile/openssh-8.1p1/sshd DS:~/newsshd
scp ~/crosscompile/openssl-1.1.1d/libcrypto.so.1.1 DS:~

然后我们以普通方式 ssh 到 DS:

ssh DS

然后我们复制 sshd_config:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_new

编辑新的配置文件:

vim /etc/ssh/sshd_config_new

将“UsePAM yes”更改为“#UsePAM yes”

取消注释 HostKey /etc/ssh/ssh_host_ed25519_key

保存并退出。

更改新 sshd 的所有权:

sudo chown root:root newsshd

我们现在需要对几个文件进行一些修改。首先备份我们要编辑的文件:

sudo cp /etc/passwd /etc/passwd.org && sudo cp /etc/group /etc/group.org

在 /etc/passwd 的底部插入此行:

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

同样,将此行插入到 /etc/group 的底部:

/etc/group:sshd:*:27:

如果不进行上述更改,则在运行刚刚传输的 sshd 二进制文件时,您将收到“权限分离用户 sshd 不存在”的信息。

现在,让我们进行连接测试!

在 DS 上:

sudo LD_LIBRARY_PATH="/absolutepathtohomedir:$LD_LIBRARY_PATH" /absolutepathtohomedir/newsshd -p 444 -f /etc/ssh/sshd_config_new -h /etc/ssh/ssh_host_ed25519_key -d

这将以调试模式启动新的 sshd 二进制文件。

现在,你可以使用以下命令从 Linux 实例正常连接该服务器:

ssh -p 444 user@DS

终于——伟大的替代。

确保记下您所做的每一件事,并将其与您拥有的文件一起保存在某处。众所周知,Synology Inc. 有时会在更新时替换编辑和文件。如果发生这种情况,您需要通过 DSM 启用 telnet,并通过本地网络上的 telnet 登录以恢复设置。也许,您可以设置一个 cronjob 来监控系统,并自动恢复更新带来的任何更改。根据您的设置,如果您已经处于非常安全且分段的网络中,则可能不需要经常更新 DSM。

我们为 ARM 架构编译的相关二进制文件位于 ~/crosscompile/openssh-8.1p1 中:

  • ./ssh-agent(身份验证代理)
  • ./sftp-server(SFTP 服务器子系统)
  • ./ssh(OpenSSH SSH客户端(远程登录程序))
  • ./ssh-keyscan(收集 ssh 公钥)
  • ./ssh-keygen(认证密钥生成、管理和转换)
  • ./sftp(安全文件传输程序)
  • ./ssh-keysign(默认禁用)
  • ./ssh-add(将 RSA 或 DSA 身份添加到身份验证代理)
  • ./scp(安全复制(远程文件复制程序))
  • ./ssh-pkcs11-helper (ssh-agent(用于 PKCS#11 支持的帮助程序)
  • ./sshd(OpenSSH SSH 守护进程)

您必须决定需要其中哪一个。如果您只打算使用 sshd 和 scp,那么替换这些二进制文件可能就足够了。

首先,编辑原始 /etc/ssh/sshd_config 文件,将“UsePAM yes”注释为“#UsePAM yes”,然后取消注释“HostKey /etc/ssh/ssh_host_ed25519_key”。

您实际上应该只使用 ed25519 密钥,如果您使用其他类型的密钥,请相应地取消注释。

让我们确保 openssl 支持可用。

在我的 DS 上,这不会覆盖任何内容,您的里程可能会有所不同。检查目标是否已经存在。我这样做了,因为这是一种让其工作的简单方法。可能可以将共享对象文件放在自定义路径中并添加到共享对象文件的搜索路径中。

sudo mv ~/libcrypto.so.1.1 /usr/lib/

找到要替换的文件的位置:

which sshd ; which scp

结果:

/bin/sshd
/bin/scp

备份这两个文件。

sudo cp /bin/sshd /bin/sshd.DS.orginal
sudo cp /bin/scp /bin/scp.DS.orginal

退出到 linux 实例并复制新创建的 scp 文件:

scp scp DS:~

SSH 到 DS,然后移动 scp 文件并设置正确的所有权:

sudo mv ~/scp /bin
sudo chown root:root /bin/scp

由于 /bin/sshd 处于活动状态,因此无法覆盖它,因此我们需要将其终止。但在此之前,我们需要启动新创建的 sshd,以便我们有一条通往 DS 的备用路径。

在您的 Linux 实例上启动一个新终端,然后以正常方式 ssh 到 DS:

ssh DS

然后,创建新的 sshd 服务器的实例:

sudo /absolutepathtohomedir/newsshd -p 777 -f /etc/ssh/sshd_config_new -h /etc/ssh/ssh_host_ed25519_key

退出 ssh 会话,并尝试登录到由新生成的 ssh 二进制文件控制的会话:

ssh -p 777 user@DS

现在,终止端口 22 上的原始 ssh 服务器。

sudo su

然后编辑 ssh 配置

vim /etc/init/sshd.conf

注释掉重生行,因此它们看起来如下所示:

#respawn
#respawn limit 5 10

然后:

netstat -ap | grep ssh

找到右侧的进程 id

该行看起来应如下:

tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      9508/sshd

停止 ssh-shell

synoservice --hard-stop ssh-shell

终止 sshd 进程。

kill -9 9508

检查进程是否消失,并且没有任何内容在监听端口 22:

netstat -tpa | grep 22

如果您在本指南中尝试过各种端口,则可能需要关闭 sshd 的其他实例。

如果一切都失败了,您可以通过 DSM 禁用 ssh。

最后:

cp /fullhomepath/newsshd /bin/sshd && chown root:root /bin/sshd

将之前对 /etc/init/sshd.conf 所做的重生注释撤销

创建此符号链接,因为新的 sshd 抱怨本地 sshd_config 文件不存在

ln -s /etc/ssh/sshd_config /usr/local/etc/sshd_config

重新启用 sshd:

synoservice --hard-enable ssh-shell

现在,验证复制的文件是否与编译的文件匹配:

在 DS 上:

sha256sum /bin/sshd /bin/scp

在 Linux 实例上:

sha256sum ~/crosscompile/openssh-8.1p1/sshd ~/crosscompile/openssh-8.1p1/scp

系统间各个二进制文件的哈希值应该匹配。

我们还可以检查新文件和旧文件的版本:

 ash-4.3# /bin/sshd.DS.orginal --version ; /bin/scp.DS.orginal --version

 unknown option -- - OpenSSH_7.4p1, OpenSSL 1.0.2r-fips  26 Feb 2019 usage: sshd [-46DdeiqTt] [-C connection_spec] [-c
     host_cert_file]
                 [-E log_file] [-f config_file] [-g login_grace_time]
                 [-h host_key_file] [-o option] [-p port] [-u len] unknown 

option -- - usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i
         identity_file]
                    [-l limit] [-o ssh_option] [-P port] [-S program]
                    [[user@]host1:]file1 ... [[user@]host2:]file2

ash-4.3# /bin/sshd --version ; /bin/scp --version

unknown option -- -
OpenSSH_8.1p1, OpenSSL 1.1.1d  10 Sep 2019
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-o option] [-p port] [-u len]
unknown option -- -
usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file]
            [-J destination] [-l limit] [-o ssh_option] [-P port]
            [-S program] source ... target

您现在可以尝试再次正常连接到 Synology:

ssh DS

您现在将收到类似“警告:远程主机标识已更改!”的提示。

这是预料之中的。通过编辑 /home/user/.ssh/known_hosts 手动纠正,删除旧密钥并重新连接,然后接受新密钥就足够了。

最后,为了检查重启后是否有任何变化,可以选择重启 DS。

为了确保 /etc/passwd 和 /etc/group 中的自定义行能够保留,请使用以下脚本,将其保存到 /usr/local/bin/pwdgroupfixer.sh,记得通过 chmod +x 使其可执行。

在 root crontab 中创建一个条目:

*/5 *   *   *   *   root    /bin/sh /usr/local/bin/pwdgroupfixer.sh

请注意,synology 对其 crontab 的格式非常讲究。使用制表符代替空格,使用现有条目并将其复制到新行并进行修改是一个好建议。

最后重新启动 crontab 服务:

sudo synoservice -restart crond

#!/bin/sh
#pwdgroupfixer.sh

#Entries to support sshd

PASSWORDFILE=/etc/passwd
USERLINE="sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin"

GROUPFILE=/etc/group
GROUPLINE="/etc/group:sshd:*:27:"


itemcheck(){
  FILE=$1
  ITEM=$2
DATE=`/bin/date +%Y-%m-%d`
TEMPFILE=/tmp/$DATE
/bin/echo '0' > $TEMPFILE

FOUND=0
/bin/sed '/^[ \t\r\n]*$/d' $FILE | while read LINE; do
    if [[ ${LINE:0:1} != "#" ]]; then
         if [ "$LINE" == "$ITEM" ];
         then
            let FOUND++
            /bin/echo $FOUND > $TEMPFILE
         fi
     fi
  done

FOUND=`/bin/cat $TEMPFILE`

if [ "$FOUND" -eq "0" ]; then
    /bin/cp $FILE $FILE.`/bin/date +%Y-%m-%d`
    /bin/echo $ITEM >> $FILE
fi

}

itemcheck $PASSWORDFILE "$USERLINE"
itemcheck $GROUPFILE $GROUPLINE

#end pwdgroupfixer.sh

答案3

我尝试过以下方法,既不安装额外的软件,也不向不应获得特权的用户授予特权。但是,我尚未确认此解决方案是否有效;我怀疑我可能需要在过程结束时再次重新启动 NAS。我会在了解更多信息后在此处更新。如果有人一直尝试到第二次重新启动,请发表评论!

我意识到我可以玩 Synology 的游戏并将“管理员”用户组减少为仅授予您 SSH 权限的组。

我创建了第二个组,并赋予它与默认“管理员”组相同的权限。假设您将该组命名为“realadmin”。所有实际应该具有管理员权限的用户都应添加到此组中(为了安全起见,也请将他们保留在原始“管理员”中)。创建此组并添加所有应该具有管理员权限的用户后,使用管理员帐户和 ssh 进入 NAS sudo vi /etc/sudoers。替换%administrators%realadmin(请确保您正确输入了此内容,也许可以从 DSM 管理面板复制粘贴以确保正确无误),然后输入 保存并关闭wq!。重新启动 NAS 以使此更改生效(在重新启动 NAS 之前,您将失去 sudo 访问权限)。最后,从“管理员”组中删除所有权限,除了您可能与 SSH 一起使用的权限,例如 rsync。更新描述以反映“管理员”现在基本上是 SSH 用户组。添加所有您想要授予 SSH 访问权限的用户;他们现在不应从“管理员”获得任何管理权限。确保/bin/sh为每个用户将 shell 设置回,/etc/passwd并在他们的主目录中创建一个.ssh/authorized_keys文件,其中包含他们应该能够进行身份验证的公钥。

我执行了上述步骤,然后尝试使用已添加到“管理员”组的非真实管理员帐户通过 SSH 进入 NAS。但仍然无法访问permission denied (publickey)。我不确定此时缺少什么。也许我需要重新启动 NAS,以使将用户添加到“管理员”组的操作生效。我也尝试将同一用户添加到“真实管理员”组,但用户仍然无法使用 SSH,至少在不重新启动 NAS 的情况下无法使用 SSH。我还没有第二次重新启动 NAS,因为我正在运行一些进程,我不想经常中断它们,而且我找到了另一种快速而简单的解决方法,可以暂时解决我的特定问题。

我最初在 Synology 社区论坛上描述了这个(理论上的)解决方案,并在此页面上进行了一些额外的讨论:https://community.synology.com/enu/forum/1/post/125859?page=2(第 16 条回复,撰写本文时最新的一条)。

答案4

我绝不是 NAS 专家,但启用用户访问权限会将git_reposshell 设置/etc/passwd/var/packages/Git/target/bin/git-shell开启DSM 6.2.4-25556 Update 5(因此它符合DSM 6.2.x类别)。将其更改为/bin/sh授予 SSH 访问权限。

相关内容