Synology DSM 6.2.x:如何以非管理員使用者身分進行 SSH

Synology DSM 6.2.x:如何以非管理員使用者身分進行 SSH

自 DSM 6.2.2 起,我們透過 ssh 以非管理員使用者身分連線至 Synology NAS 時遇到問題。在此之前,只需將登入 shell 從/etc/passwdfrom更改/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 功能的 DiskStation 上,我發現使用 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 Box。

有趣的是,可以執行稱為交叉編譯的操作,這意味著您可以在一個平台上編譯可以在另一個平台上運行的軟體。

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 金鑰登入 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 簽名中告訴我們的內容相符。一切看起來都不錯。如果您擔心簽名不信任金鑰,則需要自己編輯金鑰的信任,或找人來做。如果您的安裝非常關鍵,可以選擇聯繫達米安米勒並讓他讀取指紋。或許你應該補償他!

無論如何,為了確保下載盡可能安全,您應該驗證多個來源,所以讓我們嘗試一下。

快速搜索就會發現顯然是米勒的博客。這篇文章提供了更多詳細資訊:

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”,如指南前面所述。然後您將看到釋放密鑰是米勒個人密鑰的子密鑰。

好的,此時,我們假設 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

Afaik,沒有辦法驗證下載。我把它上傳到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

這應該給馬克·阿德勒一個很好的簽名[電子郵件受保護]

此時,如果需要進一步驗證,您可以使用指紋或 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

群暉用戶好!讓我們編譯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才能讓新增至「管理員」的使用者生效。我也曾短暫嘗試將同一用戶添加到“realadmin”,但該用戶仍然無法使用 SSH,至少在不重新啟動 NAS 的情況下無法使用。我還沒有第二次重新啟動 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-shellon DSM 6.2.4-25556 Update 5(因此它屬於DSM 6.2.x類別)。更改它以/bin/sh授予 SSH 存取權限。

相關內容