SSH 學習筆記

前言

本篇為未整理的個人學習紀錄

正文

  • 建立一組公私鑰?

    ssh-keygen -t rsa -b 4096 -C "Ray@gmail.com" 
  • 如何將指定的 key 加到 ssh-agent?

    ssh-add keyFile
  • private_key 的名稱不是預設的 id_rsa 時,何解?
    將指定的 key 加到 ssh-agent

  • 如何打開 ssh-agent?

    eval "$(ssh-agent -s)"
  • 在 macOS 上,當我們想要將目前這組 key 刪掉,但是新的 key 要沿用相同的檔案名稱,可能會遇到什麼問題?
    macOS 的 keychain 將舊的 key 記住了,導致怎麼樣都驗不過,驗到人都覺得厭世了

  • 承上,何解?

    ssh-add -K keyFile
  • 承上,在 GCP 上何解?

    ssh-add -D && ssh-add keyFile
  • GCP 上,如何安裝 ssh client ?

    apt-get update -y && apt-get install openssh-client -y
  • 如果我已經將 key 加到 ssh-agent, 那我還需要將 key 的實體檔案放在 .ssh 的資料夾內嗎?
    不需要的哦!

  • 如何查詢指定 Server 的公鑰?

    ssh-keyscan to-be-conneted-instance-ip 
# 127.0.0.1 SSH-2.0-OpenSSH_6.6.1
127.0.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWBZ3XrIajPmnd6R+g/wcUuOPOiRBMOYjAl4Dv8SfcZtgHqKTK6Zb1EeG3u/uzRYxqXMctG/2A4iXRDG9mvg9H9bimCWbA3xtR79NImPYg4m7BNuH9C+OXRYYJwoOGpjVMs0rGLXkq3/WVkXvQreBuhVD8NI2pEPnQsT1J5abdVbCHlwFYG6wVCJQqFY6jdntJJlxQv5EJu6w4/+Fd4LvdjysH+ngqArac6HMJUxqSxLQjzMdCRWEQKp3ySwmnRp9rHYVaJnnsXeYPfnMN1iMjdIQJPzc89Mepg4ip1q2bCMbMcx2XFO3I7YjYRdcOameFNafMGY0q5RHzhvgnNnal
# 127.0.0.1 SSH- 2.0-OpenSSH_6.6.1
127.0.0.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCPWoEQ7iCCYDrpyb5KeMmCaQ8aOnSfehqmrplZRkbqqnkS9++PdSX/eSLJ0tkFd5902/C+HTCqbDgso4mCKpMo=
# 127.0.0.2 SSH-2.0-OpenSSH_6.6.1
127.0.0.2 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCWBZ3XrIajPmnd6R+g/wcUuOPOiRBMOYjAl4Dv8SfcZtgHqKTK6Zb1EeG3u/uzRYxqXMctG/2A4iXRDG9mvg9H9bimCWbA3xtR79NImPYg4m7BNuH9C+OXRYYJwoOGpjVMs0rGLXkq3/WVkXvQreBuhVD8NI2pEPnQsT1J5abdVbCHlwFYG6wVCJQqFY6jdntJJlxQv5EJu6w4/+Fd4LvdjysH+ngqArac6HMJUxqSxLQjzMdCRWEQKp3ySwmnRp9rHYVaJnnsXeYPfnMN1iMjdIQJPzc89Mepg4ip1q2bCMbMcx2XFO3I7YjYRdcOameFNafMGY0q5RHzhvgnNnal
# 127.0.0.2 SSH-2.0-OpenSSH_6.6.1
127.0.0.2 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCPWoEQ7iCCYDrpyb5KeMmCaQ8aOnSfehqmrplZRkbqqnkS9++PdSX/eSLJ0tkFd5902/ C+HTCqbDgso4mCKpMo=

取最短的那組即可,例如:

127.0.0.2 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCPWoEQ7iCCYDrpyb5KeMmCaQ8aOnSfehqmrplZRkbqqnkS9++PdSX/eSLJ0tkFd5902/ C+HTCqbDgso4mCKpMo=
  • 當我們初次從 a 電腦 經由 ssh 連到 b 電腦時,當 a 電腦要將 b 電腦的公鑰加到 known_host 檔案時,會跳出詢問視窗 yes/no, 如何避免掉這個視窗?

    ssh -o StrictHostKeyChecking=no
  • 如何在 GitHub 以及 Gitlab 上使用不同的 key

    # GitLab
    Host gitlab.com
    Preferredauthentications publickey
    IdentityFile ~/.ssh/gitlab
# GitHub
Host github.com
Preferredauthentications publickey
IdentityFile ~/.ssh/github
  • scp
    利用 config 檔案來驗證
    scp -F SSHconfig sourceFile targetUser@targetIP:targetLocation

如果是要傳資料夾過去

scp -F SSHconfig -r sourceFile targetUser@targetIP:targetLocation

利用 private key 產生 public key

ssh-keygen -y -f fileName

把公鑰傳到遠端主機

ssh-copy-id -i key.pub user@IP



啟動密碼登入

  • 打開 ssh 配置檔

    vim /etc/ssh/sshd.config
  • 修改設定如下

    # To disable tunneled clear text passwords, change to no here!
    PasswordAuthentication yes
  • 重啟 ssh

    systemctl restart ssh



在 Git 指令中指定 key

"SSH -i /root/.ssh/id_rsa" git clone git@gitlab.com:qcdn/qcdn-aircraft-carrier.git


SFTP

語法

sftp account@ip

用法

針對遠方伺服器主機 (Server) 之行為


針對本機 (Client) 之行為 (都加上 l, L 的小寫)


針對資料上傳/下載的行為




SCP

語法

[root@www ~]# scp [-pr] [-l 速率] file  [帳號@]主機:目錄名 <==上傳
[root@www ~]# scp [-pr] [-l 速率] [帳號@]主機:file 目錄名 <==下載
選項與參數:
-p :保留原本檔案的權限資料;
-r :複製來源為目錄時,可以複製整個目錄 (含子目錄)
-l :可以限制傳輸的速度,單位為 Kbits/s ,例如 [-l 800] 代表傳輸速限 100Kbytes/s

範例

將本機的 /etc/hosts* 全部複製到 127.0.0.1 上面的 student 家目錄內

scp /etc/hosts* student@127.0.0.1:~

將 127.0.0.1 這部遠端主機的 /etc/bashrc 複製到本機的 /tmp 底下

scp student@127.0.0.1:/etc/bashrc /tmp



sshd 設定檔

[root@www ~]# vim /etc/ssh/sshd_config
# 1. 關於 SSH Server 的整體設定,包含使用的 port 啦,以及使用的密碼演算方式
# Port 22
# SSH 預設使用 22 這個port,也可以使用多個port,即重複使用 port 這個設定項目!
# 例如想要開放 sshd 在 22 與 443 ,則多加一行內容為:『 Port 443 』
# 然後重新啟動 sshd 這樣就好了!不過,不建議修改 port number 啦!

Protocol 2
# 選擇的 SSH 協定版本,可以是 1 也可以是 2 ,CentOS 5.x 預設是僅支援 V2。
# 如果想要支援舊版 V1 ,就得要使用『 Protocol 2,1 』才行。

# ListenAddress 0.0.0.0
# 監聽的主機介面卡!舉個例子來說,如果你有兩個 IP,分別是 192.168.1.100 及
# 192.168.100.254,假設你只想要讓 192.168.1.100 可以監聽 sshd ,那就這樣寫:
# 『 ListenAddress 192.168.1.100 』預設值是監聽所有介面的 SSH 要求

# PidFile /var/run/sshd.pid
# 可以放置 SSHD 這個 PID 的檔案!上述為預設值

# LoginGraceTime 2m
# 當使用者連上 SSH server 之後,會出現輸入密碼的畫面,在該畫面中,
# 在多久時間內沒有成功連上 SSH server 就強迫斷線!若無單位則預設時間為秒!

# Compression delayed
# 指定何時開始使用壓縮資料模式進行傳輸。有 yes, no 與登入後才將資料壓縮 (delayed)

# 2. 說明主機的 Private Key 放置的檔案,預設使用下面的檔案即可!
# HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私鑰
# HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私鑰
# HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私鑰
# 還記得我們在主機的 SSH 連線流程裡面談到的,這裡就是 Host Key ~

# 3. 關於登錄檔的訊息資料放置與 daemon 的名稱!
SyslogFacility AUTHPRIV
# 當有人使用 SSH 登入系統的時候,SSH 會記錄資訊,這個資訊要記錄在什麼 daemon name
# 底下?預設是以 AUTH 來設定的,即是 /var/log/secure 裡面!什麼?忘記了!
# 回到 Linux 基礎去翻一下。其他可用的 daemon name 為:DAEMON,USER,AUTH,
# LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,

# LogLevel INFO
# 登錄記錄的等級!嘿嘿!任何訊息!同樣的,忘記了就回去參考!

# 4. 安全設定項目!極重要!
# 4.1 登入設定部分
# PermitRootLogin yes
# 是否允許 root 登入!預設是允許的,但是建議設定成 no!

# StrictModes yes
# 是否讓 sshd 去檢查使用者家目錄或相關檔案的權限資料,
# 這是為了擔心使用者將某些重要檔案的權限設錯,可能會導致一些問題所致。
# 例如使用者的 ~.ssh/ 權限設錯時,某些特殊情況下會不許用戶登入

# PubkeyAuthentication yes
# AuthorizedKeysFile .ssh/authorized_keys
# 是否允許用戶自行使用成對的金鑰系統進行登入行為,僅針對 version 2。
# 至於自製的公鑰資料就放置於使用者家目錄下的 .ssh/authorized_keys 內

PasswordAuthentication yes
# 密碼驗證當然是需要的!所以這裡寫 yes 囉!

# PermitEmptyPasswords no
# 若上面那一項如果設定為 yes 的話,這一項就最好設定為 no ,
# 這個項目在是否允許以空的密碼登入!當然不許!

# 4.2 認證部分
# RhostsAuthentication no
# 本機系統不使用 .rhosts,因為僅使用 .rhosts太不安全了,所以這裡一定要設定為 no

# IgnoreRhosts yes
# 是否取消使用 ~/.ssh/.rhosts 來做為認證!當然是!

# RhostsRSAAuthentication no #
# 這個選項是專門給 version 1 用的,使用 rhosts 檔案在 /etc/hosts.equiv
# 配合 RSA 演算方式來進行認證!不要使用啊!

# HostbasedAuthentication no
# 這個項目與上面的項目類似,不過是給 version 2 使用的!

# IgnoreUserKnownHosts no
# 是否忽略家目錄內的 ~/.ssh/known_hosts 這個檔案所記錄的主機內容?
# 當然不要忽略,所以這裡就是 no 啦!

ChallengeResponseAuthentication no
# 允許任何的密碼認證!所以,任何 login.conf 規定的認證方式,均可適用!
# 但目前我們比較喜歡使用 PAM 模組幫忙管理認證,因此這個選項可以設定為 no 喔!

UsePAM yes
# 利用 PAM 管理使用者認證有很多好處,可以記錄與管理。
# 所以這裡我們建議你使用 UsePAM 且 ChallengeResponseAuthentication 設定為 no
 
# 4.3 與 Kerberos 有關的參數設定!因為我們沒有 Kerberos 主機,所以底下不用設定!
# KerberosAuthentication no
# KerberosOrLocalPasswd yes
# KerberosTicketCleanup yes
# KerberosTgtPassing no
 
# 4.4 底下是有關在 X-Window 底下使用的相關設定!
X11Forwarding yes
# X11DisplayOffset 10
# X11UseLocalhost yes
# 比較重要的是 X11Forwarding 項目,他可以讓視窗的資料透過 ssh 通道來傳送喔!
# 在本章後面比較進階的 ssh 使用方法中會談到。

# 4.5 登入後的項目:
# PrintMotd yes
# 登入後是否顯示出一些資訊呢?例如上次登入的時間、地點等等,預設是 yes
# 亦即是列印出 /etc/motd 這個檔案的內容。但是,如果為了安全,可以考慮改為 no !

# PrintLastLog yes
# 顯示上次登入的資訊!可以啊!預設也是 yes !

# TCPKeepAlive yes
# 當達成連線後,伺服器會一直傳送 TCP 封包給用戶端藉以判斷對方式否一直存在連線。
# 不過,如果連線時中間的路由器暫時停止服務幾秒鐘,也會讓連線中斷喔!
# 在這個情況下,任何一端死掉後,SSH可以立刻知道!而不會有僵屍程序的發生!
# 但如果你的網路或路由器常常不穩定,那麼可以設定為 no 的啦!

UsePrivilegeSeparation yes
# 是否使用權限較低的程序來提供使用者操作。我們知道 sshd 啟動在 port 22 ,
# 因此啟動的程序是屬於 root 的身份。那麼當 student 登入後,這個設定值
# 會讓 sshd 產生一個屬於 sutdent 的 sshd 程序來使用,對系統較安全

MaxStartups 10
# 同時允許幾個尚未登入的連線畫面?當我們連上 SSH ,但是尚未輸入密碼時,
# 這個時候就是我們所謂的連線畫面啦!在這個連線畫面中,為了保護主機,
# 所以需要設定最大值,預設最多十個連線畫面,而已經建立連線的不計算在這十個當中

# 4.6 關於使用者抵擋的設定項目:
DenyUsers *
# 設定受抵擋的使用者名稱,如果是全部的使用者,那就是全部擋吧!
# 若是部分使用者,可以將該帳號填入!例如下列!
DenyUsers test

DenyGroups test
# 與 DenyUsers 相同!僅抵擋幾個群組而已!

# 5. 關於 SFTP 服務與其他的設定項目!
Subsystem sftp /usr/lib/ssh/sftp-server
# UseDNS yes
# 一般來說,為了要判斷用戶端來源是正常合法的,因此會使用 DNS 去反查用戶端的主機名
# 不過如果是在內網互連,這項目設定為 no 會讓連線達成速度比較快。



安全設定

/etc/ssh/sshd_config

# 1. 先觀察一下所需要的帳號是否存在呢?
[root@www ~]# for user in sshnot1 sshnot2 sshnot3 testssh student; do \
> id $user | cut -d ' ' -f1-3 ; done
uid=507(sshnot1) gid=509(sshnot1) groups=509(sshnot1),508(nossh)
uid=508(sshnot2) gid=510(sshnot2) groups=510(sshnot2),508(nossh)
uid=509(sshnot3) gid=511(sshnot3) groups=511(sshnot3),508(nossh)
uid=511(testssh) gid=513(testssh) groups=513(testssh)
uid=505(student) gid=506(student) groups=506(student)
# 若上述帳號並不存在你的系統,請自己建置出來!UID/GID 與鳥哥的不同也沒關係!

# 2. 修改 sshd_config 並且重新啟動 sshd 吧!
[root@www ~]# vim /etc/ssh/sshd_config
PermitRootLogin no <==約在第 39 行,請拿掉註解且修改成這樣
DenyGroups nossh <==底下這兩行可以加在檔案的最後面
DenyUsers testssh

[root@www ~]# /etc/init.d/sshd restart

# 3. 測試與觀察相關的帳號登入情況吧!
[root@www ~]# ssh root@localhost <==並請輸入正確的密碼
[root@www ~]# tail /var/log/secure
Jul 25 13:14:05 www sshd[2039]: pam_unix(sshd:auth): authentication failure;
logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost user=root
# 你會發現出現這個錯誤訊息,而不是密碼輸入錯誤而已。

[root@www ~]# ssh sshnot1@localhost <==並請輸入正確的密碼
[root@www ~]# tail /var/log/secure
Jul 25 13:15:53 www sshd[2061]: User sshnot1 from localhost not allowed because
a group is listed in DenyGroups

[root@www ~]# ssh testssh@localhost <==並請輸入正確的密碼
[root@www ~]# tail /var/log/secure
Jul 25 13:17:16 www sshd[2074]: User testssh from localhost not allowed
because listed in DenyUsers

/etc/hosts/allow, /etc/hosts.deny

[root@www ~]# vim /etc/hosts.allow
sshd: 127.0.0.1 192.168.1.0/255.255.255.0 192.168.100.0/255.255.255.0

[root@www ~]# vim /etc/hosts.deny
sshd : ALL

iptables 封包過濾防火牆

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT

[root@www ~]# /usr/local/virus/iptables/iptables.rule



設定 ssh 在不同 port 口

新增 port

[root@www ~]# vim /etc/ssh/sshd_config
Port 22
Port 23 <==注意喔!要有兩個 Port 的設定才行!

[root@www ~]# /etc/init.d/sshd restart

自定義 SELinux 規則放行模組

# 1. 於 /var/log/audit/audit.log 找出與 ssh 有關的 AVC 資訊,並轉為本地模組
[root@www ~]# cat /var/log/audit/audit.log | grep AVC | grep ssh | \
> audit2allow -m sshlocal > sshlocal.te <==副檔名要是 .te 才行
[root@www ~]# grep sshd_t /var/log/audit/audit.log | \
> audit2allow -M sshlocal <==sshlocal 就是剛剛建立的 .te 檔名
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i sshlocal.pp <==這個指令會編譯出這個重要的 .pp 模組!

# 2. 將這個模組載入系統的 SELinux 管理當中!
[root@www ~]# semodule -i sshlocal.pp

# 3. 再重新啟動 sshd 並且觀察埠口吧!
[root@www ~]# /etc/init.d/sshd restart
[root@www ~]# netstat -tlunp | grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7322/sshd
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 7322/sshd
tcp 0 0 :::22 :::* LISTEN 7322/sshd
tcp 0 0 :::23 :::* LISTEN 7322/sshd

非正規 port 號連接方式

[root@www ~]# ssh -p 23 root@localhost
root@localhost's password:
Last login: Tue Jul 26 14:07:41 2011 from 192.168.1.101
[root@www ~]# netstat -tnp | grep 23
tcp 0 0 ::1:23 ::1:56645 ESTABLISHED 7327/2
tcp 0 0 ::1:56645 ::1:23 ESTABLISHED 7326/ssh
# 因為網路是雙向的,因此自己連自己 (localhost),就會抓到兩隻連線!

Q&A

  • SSH 的全寫是?
    Secure SHell protocol

  • SSH 中, 公鑰的作用?
    提供給遠端主機進行資料加密, 也就是說, 每個人都可以有你的公鑰, 用來加密要傳送給你的資料

  • SSH 中, 私鑰的作用?
    公鑰用來加密要傳送給你的資料, 而私鑰用來解密這些資料

  • 如果有兩台電腦利用 SSH 來互相傳送資料, 共有至少幾把公鑰, 幾把私鑰?
    兩把公鑰, 兩把私鑰

  • 非對稱式金鑰系統是什麼意思?
    伺服器:『具有伺服器的私鑰與用戶端的公鑰』,而用戶端則是: 『具有伺服器的公鑰以及用戶端自己的私鑰』

  • SSH 連線的具體步驟?

  1. 用戶端對伺服器端發出主動連線要求
  2. 伺服器端回傳伺服器公鑰
  3. 用戶端紀錄/比對伺服器公鑰
  4. 用戶端回傳伺服器用戶端公鑰
  5. 開始加解密
  • SSH 中, 當我們接收到對方電腦的公鑰時, 會儲存在哪?
    ~/.ssh/known_hosts

  • SSH 中, 自家預設的公鑰會放在哪?
    /etc/ssh/ssh_host*

  • 如何產生新的伺服器端的 ssh 公私鑰?

    rm /etc/ssh/ssh_host*
    /etc/init.d/sshd restart
  • 在 sftp 中, 我可以隨意更改 local 或 remote 的資料夾所在位置嗎?
    可以哦, 可以參考這裏

  • 在 scp 中, 保留原本檔案的權限資料嗎?
    可以哦, 可以參考這裏

  • 在 ssh 中, 可以開啟多個 port 且都使用在 ssh 上嗎?
    可以哦! 請參考sshd 設定檔

  • 在 ssh-keygen 中, 如果我沒有特別指令密碼演算法的話, 預設是哪一種?
    RSA

  • .ssh 目錄的權限必須要是多少?
    700

  • ssh 中, 私鑰的權限必須得是多少?
    600

  • ssh 中, 私鑰的擁有者必須得是誰?
    該 user 目錄下的擁有者

  • ssh 中, 如果自建 key-pair 卻無法通過驗證, 很有可能是甚麼原因?
    sshd 檔案中的 AuthorizedKeysFile 設定沒有打開, 可參考 sshd 設定檔

  • ssh 中, 如果我是透過自建 key 的方式, 那我公鑰應該要放在伺服器端的哪個檔案中?
    預設檔名為 .ssh/authorized_keys, 可透過 sshd 設定檔 修改

  • ssh 中, 如果我是透過自建 key 的方式, 預設的伺服器端公鑰放置檔案 authorized_keys 的權限該設定為多少?
    644

  • ssh 中, 如果登入失敗, log 可以在哪裡看?

    tail /var/log/secure
  • ssh 中, 可以限制僅有指定的 user 或 group 才可經由 ssh 登入嗎?
    可, 可參考 sshd config

  • ssh 中, 可以限制僅有指定的 IP 才可經由 ssh 登入嗎?
    可, 可參考 hosts.allow & hosts.deny

  • ssh 中, 可以透過 iptable 限制指定的 ip 才可經由 ssh 登入嗎?
    可, 可參考 iptables.allow & iptables.rule

  • ssh 中, 我可以修改預設 port 22 到別的 port 號嗎?
    可以, 可參考 ssh port 號變更

pm2 - 用法大全 gcloud CLI 用法

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×