建立共用 Linux 的建議 AMIs - Amazon Elastic Compute Cloud

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立共用 Linux 的建議 AMIs

使用下列指導方針來減少攻擊面,並改善AMIs您建立的可靠性。

重要

沒有任何一份清單可詳盡列出所有的安全性準則。AMIs 仔細建置共用的 ,並花時間考慮您可能會在何處公開敏感資料。

如果您要AMIs為 建置 AWS Marketplace,請參閱 AWS Marketplace 賣方指南中的建置最佳實務AMIs,以取得指導方針、政策和最佳實務。

如需AMIs安全共用的詳細資訊,請參閱下列文章:

停用根使用者的密碼型態遠端登入

對公有使用者使用固定根密碼AMI是可以快速得知的安全風險。即便仰賴使用者於第一次登入時變更密碼,都會留下一些可能遭到濫用的空窗。

若要解決此問題,請停用根使用者的密碼型態遠端登入。

停用根使用者的密碼型態遠端登入
  1. 使用文字編輯器開啟 /etc/ssh/sshd_config 檔案,並找出下行:

    #PermitRootLogin yes
  2. 將行變為:

    PermitRootLogin without-password

    此組態檔案的位置可能因分發而有所不同,或者如果您未執行 Open SSH。若是這種情況,請參閱相關文件。

停用本機根存取

當您使用共用 時AMIs,最佳實務是停用直接根登入。若要停用,請登入運作中的執行個體,然後發出下列命令:

[ec2-user ~]$ sudo passwd -l root
注意

此命令不會影響 sudo 的使用。

移除SSH主機金鑰對

如果您計劃共用AMI衍生自公有 的 AMI,請移除位於 的現有SSH主機金鑰對/etc/ssh。當有人使用您的 啟動執行個體時,這SSH將強制產生新的唯一SSH金鑰對AMI,從而提高安全性並減少「man-in-the-middle」攻擊的可能性。

移除位在您系統中所有下列的金鑰檔案。

  • ssh_host_dsa_key

  • ssh_host_dsa_key.pub

  • ssh_host_key

  • ssh_host_key.pub

  • ssh_host_rsa_key

  • ssh_host_rsa_key.pub

  • ssh_host_ecdsa_key

  • ssh_host_ecdsa_key.pub

  • ssh_host_ed25519_key

  • ssh_host_ed25519_key.pub

您可以使用下列命令安全地移除所有這些檔案:

[ec2-user ~]$ sudo shred -u /etc/ssh/*_key /etc/ssh/*_key.pub
警告

像是 shred 等安全移除公用程式可能不會從儲存媒體中移除檔案的所有複本。可以透過日誌記錄檔案系統 (包括 Amazon Linux 預設 ext4)、快照、備份、 和臨時快取RAID來建立檔案的隱藏複本。如需詳細資訊,請參閱 shred 文件

重要

如果您忘記從公有 中移除現有的SSH主機金鑰對AMI,我們的例行稽核程序會通知您和所有執行 執行個體的客戶AMI,了解潛在的安全風險。在短暫寬限期後,我們會標記AMI私有。

安裝公有金鑰登入資料

設定 AMI以防止使用密碼登入後,您必須確定使用者可以使用其他機制登入。

Amazon EC2允許使用者在啟動執行個體時指定公有/私有金鑰對名稱。將有效的金鑰對名稱提供給RunInstancesAPI呼叫 (或透過命令列API工具) 時,公有金鑰 (Amazon 在呼叫 CreateKeyPair或 後EC2保留在伺服器上的金鑰對部分ImportKeyPair) 會透過針對執行個體中繼資料的HTTP查詢提供給執行個體。

若要透過 登入SSH,您的 AMI必須在開機時擷取金鑰值,並將其附加至 /root/.ssh/authorized_keys(或 上任何其他使用者帳戶的同等值AMI)。使用者可以AMI使用金鑰對啟動 的執行個體,並登入,而不需要根密碼。

包括 Amazon Linux 和 Ubuntu 等許多發行版本皆使用 cloud-init 套件來注入所設定使用者的公有金鑰登入資料。如果您的發行版本不支援 cloud-init,您可新增下列程式碼至系統啟動指令碼 (例如 /etc/rc.local),以納入您在啟動時為根使用者指定的公有金鑰。

注意

在下列範例中,IP 地址 http://169.254.169.254/ 是 link-local 地址且僅在執行個體中有效。

IMDSv2
if [ ! -d /root/.ssh ] ; then mkdir -p /root/.ssh chmod 700 /root/.ssh fi # Fetch public key using HTTP TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/my-key if [ $? -eq 0 ] ; then cat /tmp/my-key >> /root/.ssh/authorized_keys chmod 700 /root/.ssh/authorized_keys rm /tmp/my-key fi
IMDSv1
if [ ! -d /root/.ssh ] ; then mkdir -p /root/.ssh chmod 700 /root/.ssh fi # Fetch public key using HTTP curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key > /tmp/my-key if [ $? -eq 0 ] ; then cat /tmp/my-key >> /root/.ssh/authorized_keys chmod 700 /root/.ssh/authorized_keys rm /tmp/my-key fi

這會套用到任何使用者;無需將其限制到 root 使用者。

注意

基於此項目的回收執行個體AMI包括啟動該執行個體的金鑰。若要避免加入金鑰,您必須清除 (或刪除) authorized_keys 檔案或將此檔案排除於重新綁定之外。

停用 sshd DNS檢查 (選用)

停用 sshd DNS檢查會稍微削弱您的 sshd 安全。不過,如果DNS解析失敗,SSH登入仍然有效。如果您未停用 sshd 檢查,DNS解決失敗會阻止所有登入。

停用 SSH DNS檢查
  1. 使用文字編輯器開啟 /etc/ssh/sshd_config 檔案,並找出下行:

    #UseDNS yes
  2. 將行變為:

    UseDNS no
注意

如果未執行 Open ,則此組態檔案的位置會因分發或 而有所不同SSH。若是這種情況,請參閱相關文件。

移除敏感資料

我們建議您不要AMI將敏感資料或軟體存放在您共用的任何 上。啟動共用的使用者AMI可能可以將其重新綁定並註冊為自己的 。請按照以下準則幫助您避免一些容易遭到忽視的安全風險:

  • 建議使用 --exclude directoryec2-bundle-vol 選項跳過含有您不想加入到套件內之機密資訊的任何目錄和子目錄。特別是,在捆綁映像時,排除所有使用者擁有的SSH公有/私有金鑰對和SSHauthorized_keys檔案。Amazon 公有將這些AMIs內容存放在 中/root/.ssh,適用於根使用者,/home/user_name/.ssh/以及一般使用者。如需詳細資訊,請參閱ec2-bundle-vol

  • 綁定前務必刪除 shell 歷程記錄。如果您嘗試在相同的 中上傳多個套件AMI,則 Shell 歷史記錄會包含您的存取金鑰。以下範例應該是您在從執行個體內綁定之前執行的最後一項命令。

    [ec2-user ~]$ shred -u ~/.*history
    警告

    上面警告中提及的 shred 限制同樣適用於此處。

    請注意,bash 會在退出時將目前工作階段的歷程記錄寫入到磁碟。如果您在刪除 ~/.bash_history 後登出執行個體,然後再重新登入,您會發現 ~/.bash_history 已重新建立,並包含在先前工作階段中執行的所有命令。

    bash 以外的其他程式也會將歷程記錄寫入到磁碟。請小心使用,並移除或排除不必要以點開頭的檔案或以點開頭的目錄。

  • 綁定執行中的執行個體需要您的私有金鑰和 X.509 憑證。因此請將這些憑證和其他登入資料放在不會加入綁定的位置 (例如執行個體存放區)。