獲得雲主機帳戶和密碼后,須進行一些配置,提升安全性和使用便捷性:

  1. 提升安全性 防止暴力破解密碼:

    • 關閉 root 帳戶遠程登陸(防暴力破解密碼)
    • 添加新帳戶(降低帳戶風險)
    • 開啟密鑰登陸(基於密鑰文件驗證登陸)
    • 添加二次驗證登陸(需要輸入密碼和驗證碼才能登陸)2FA/MFA
  2. 增強易用性

    • 配置本地ssh config文件簡化本地登錄命令
    • 新建帳戶sudo時無需輸入密碼

1 提升安全性

1.1 新建帳戶并添加sudo权限

通常拿到的是 root 帳戶,但 root 帳戶有兩個問題:

  1. 權限太大,誤操作容易讓系統崩潰,如刪除系統文件
  2. 帳戶名眾所周知,只需破解密碼即可遠程登陸,風險較高

為確保安全,需新建一帳戶作為主要帳戶:

  1. 該帳戶有sudo權限,而且可以 ssh 登陸
  2. 同時禁止 root 帳戶 ssh 登陸

新帳戶執行其它權限操作時候需要添加sudo和輸入密碼,會在一定程度上減小誤操作。關閉 root 帳戶 ssh 登陸之後,若要獲得系統權限,須同時破解帳戶名和密碼,安全性大大提升。

禁用 root 帳戶登陸之前,必須確保新建帳戶能夠 ssh 登陸。否則禁用 root 帳戶 ssh 登陸之後就無法用 ssh 登陸機器了。

1.1.1 添加新用戶

sudo useradd userA # add a new account
sudo passwd userA # set password for userA

其中passwd命令也可修改其它已知帳戶密碼。

1.1.2 添加sudo權限

userA 需要添加sudo權限才能進行sudo dnf upgrade等操作。有兩種方式:

sudo vim /etc/sudoers
sudo visudo

两种方式本质都是修改/etc/sudoers文件,在文件最後添加一行:

userA ALL = ALL : ALL

這裡添加到配置文件最后一行添加,原因是/etc/sudoers配置文件后面项目会覆盖前面項目

1.1.3 測試新帳戶登陸和sudo權限

此時 userA 可以遠程登陸,且可以sudo操作。此时进行测试:

先不要關閉 root 帳戶的登陸,客戶端新開終端,用 userA 帳戶登陸并执行sudo操作(如sudo cat /etc/sudoers),查看是否成功。

如果失敗,则登陆 root 账户重新操作。后面还有其它操作,需要 root 账户保底,暂时先不要關閉 root 账户 ssh 登陸。

1.2 配置密鑰驗證登陸

1.2.1 密鑰登陸原理

登陸遠程服務器有多種驗證方式,可參考redhat 給出的說明。除密碼驗證之外,另一種常見方式是密鑰驗證。登陸過程中服務器會驗證客戶端上密鑰(一個文件),驗證通過則登陸。

要通過偽造密鑰的方式來偽造登陸,通常是不可能的。通常使用的 rsa 加密算法,密碼長度有 1024 位,幾乎不可能破解。

1.2.2 密鑰登陸操作

使用密鑰登陸,通常需要三步:

  1. 客戶端生成密鑰

    客户端运行ssh-keygen

    ssh-keygen -t rsa

    這個過程中提示輸入密碼,可以輸入密碼,也可以直接回車(就是無密碼)。運行完成後在客戶端的~/.ssh/文件夾中生成id_rsa(私鑰)和id_rsa.pub(公鑰)兩個文件

  2. 上傳公鑰到服務器

    id_rsa.pub上傳到服務器

    scp ~/.ssh/id_rsa.pub userA@cloud_linux_ip:~
  3. 服務器上配置密鑰

    用 userA 帳戶登陸服務器,將公鑰配置到固定位置

    mkdir ~/.ssh
    cat ~/id_rsa.pub ~/.ssh/authorized_keys
    rm ~/id_rsa.pub # 刪除公鑰

通常情況下,密鑰登陸就實現了。私有密鑰id_rsa一定不能洩漏,否則其他人可以使用私鑰登陸。

1.2.3 密鑰登陸失敗 debug

如果上面操作後,依舊不能密鑰登陸,可以客戶端上如下操作獲得詳細 log:

ssh -vvv usrA@cloud_linux_ip

常見解決方式:

  1. 配置/etc/ssh/sshd_config,允許密鑰登陸:

    RSAAuthentication yes
    PubkeyAuthentication yes
  2. 修改服務器上.ssh文件夾和authorized_keys文件的權限:

    sudo chmod 744 ~/.ssh
    sudo chmod 600 ~/.ssh/authorized_keys

1.3 二次驗證登陸

在沒有密鑰的客戶端上,若確實有登陸服務器的需求,應該用密碼驗證。此時可添加二次驗證,登陸時不僅要輸入密碼,而且要輸入驗證碼。

二次驗證碼來自手機 app,可以使用Microsoft Authenticator或者 Google Authenticator。

可參考redhat 的說明在服務器上配置二次登陸。在/etc/ssh/sshd_config中配置AuthenticationMethods的方式需要特別說明一下。假定配置如下:

AuthenticationMethods MethodA MethodB,MethodC MetchodD MetchodE,MethodF
  • 这里用空格作为分隔;
  • 如果驗證方式MethodA通過,則停止驗證,登陸成功;
  • 如果MetchodA不通過,則會驗證MethodBMethodC,只有同時通過才能登陸;
  • 如果上面不通過,則會驗證MethodD
  • 以此類推,如果到MetchodF都沒有通過,則會驗證失敗;

如果一種驗證方式沒有在/etc/ssh/sshd_config中被允許,強行使用這種方式來驗證只會失敗。一般服務器支持的驗證方式,可以查看redhat 給出的說明。本機配置如下:

AuthenticationMethods publickey keyboard-interactive

keyboard-interactive包含兩個過程,先輸入密碼,然後輸入驗證碼。這個方式和password是不同的方式,服務器最終實現效果:

  1. 客戶端有私鑰,快速登陸

  2. 客戶端沒有私鑰,需要先輸入帳戶密碼,再輸入驗證碼登陸

    二次驗證

1.4 關閉 root 远程登陸

关闭 root 远程登陆之前,一定要保证有其他有用sudo權限的账户可以远程登陆。

修改/etc/ssh/sshd_config关闭 root 账户登陆:

PermitRootLogin no

確保可以密鑰登陸後,可同時关闭密码登陆:

PasswordAuthentication no

若由於其它原因無法關閉 root 帳戶登陸,一定要給 root 帳戶設定複雜密碼,可以openssl生成隨機密碼,提升安全性:

openssl rand -base64 32 #生成一個長度為32的密碼

2 易用性配置

2.1 去掉sudo密碼

通常并不以 root 身份登录,但有些操作又要用到 root 权限,則在命令前添加sudo來實現,後面需要輸入密碼。每次輸入密碼,會比較麻煩。可以修改/etc/sudoers的配置,去掉輸入密碼的過程。

可以按組或用戶配置,可以讓所有命令或者部分命令免密碼。

  1. 用戶 userA 帶sudo運行所有命令無密碼:

    userA ALL=NOPASSWD: ALL
  2. 用戶 userA 帶sudo運行部分命令無密碼:

    userA ALL=/usr/bin/ls: ALL
  3. 某組用戶groupAsudo運行所有命令無密碼:

    %groupA ALL=NOPASSWD: ALL

可能配置後並不生效。此時查看當前配置是否被覆蓋,如配置文件後面內容覆蓋了前面的內容,組帳戶配置覆蓋了個人帳戶配置。將當前用戶的設定移動到配置文件最後面,退出後再登陸。

2.2 客戶端配置 config 別名

在客戶端上登陸,需要輸入ssh userA@cloud_linux_ip等各種參數,十分繁瑣,通過修改客戶端~/.ssh/config來減少登陸時輸入信息:

Host name
    HostName server_ip
    User userA
    ForwardAgent yes
    ServerAliveInterval 20
    ServerAliveCountMax 999
    Port 22

運行ssh name就可以直接登陸了。

3. 一些实惠云服务

  1. oracle cloud 真免费,可以选择的地方有东京或者美国。
  2. google cloud 300 刀的免费体验
  3. ms azure 免费体验
  4. cloudflare

總結

本文介紹了獲取雲計算主機後的相關操作,主要目的在於提升安全性和操作的便捷性。實現了服務器上帳戶的添加,密碼修改,登陸方式的修改等。