用 AWS API Key 登入 AWS 管理主控台 (Web Console)

前言

雖然平常都使用標準帳號來登入 AWS 的管理主控台 (Web Console),但如果我們只有 API Key 的時候,是不是也能用來登入 Web Console 呢 ?

答案是: 可以

我們只需要透過 聯合存取/登入 ( Federated Access/Login ) 機制,就可以拿 AWS API Key 來登入 AWS 的管理主控台 (Web Console)。

整體流程

流程摘要

透過聯合存取/登入機制產生登入連結的大致上流程如下:

  1. 向 AWS STS 請求 Federation Token
  2. 向 AWS Signin Federation 送出請求,取得 Signin Token
  3. 產生登入網址
  4. 登入 Web Console

流程說明

向 AWS STS 請求 Federation Token

我們先使用 AWS API Key 向 AWS STS (AWS Security Token Service),請求一個 Federation Token。

# aws sts get-federation-token --name "Rilakkuma" --policy '{"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Action": "*", "Resource": "*"}]}'

參數的 name 可以隨意填寫,不需要真的存在。

Policy 的部分我們直接給 All ,來避免拿不到任何權限,但這也不代表我們可以拿到 Root ,AWS 會進行權限交集運算,計算最終可以拿到的權限。


來源: AWS Policies Evaluation Logic

從回應中我們可以得到 STS Token 三件組 AccessKeyId, SecretAccessKey, SessionToken

向 AWS Signin Federation API 送出請求,取得 Signin Token

在拿到 STS Token 三件組後,我們就可以向 AWS Signin Federation API (https://signin.aws.amazon.com/federation) 提出請求

請求結構如下

{
    "Action": "getSigninToken",
    "Session": {
       "sessionId": AccessKeyId,
       "sessionKey": SecretAccessKey,
       "sessionToken": SessionToken
   }
}

使用 HTTP Get 方式送出請求

curl "https://signin.aws.amazon.com/federation?Action=getSigninToken&Session=%7B%22sessionId%22:%22[AccessKeyId]%22,%22sessionKey%22:%22[SecretAccessKey]%22,%22sessionToken%22:%22[SessionToken]%22%7D"

記得要 URL Encode

從回應中取得 SigninToken

產生登入網址

取得 SigninToken 後,我們就可以產生登入網址

請求結構如下

{
    "Action": "login",
    "Issuer": "Keniver",
    "Destination": "https://console.aws.amazon.com/console/home",
    "SigninToken": SigninToken
}

將請求結構進行 URL Encode 後直接做為參數傳入 https://signin.aws.amazon.com/federation

https://signin.aws.amazon.com/federation?Action=login&Issuer=Keniver&Destination=https%3A%2F%2Fconsole%2Eaws%2Eamazon%2Ecom%2Fconsole%2Fhome&SigninToken=[SigninToken]

登入 Web Console

最後,我們訪問上面做出來的網址,就可以成功登入 AWS 的管理主控台 (Web Console)

Python Code

偵測

這類型的登入行為,透過 AWS CloudTrail 是很容易可以發現的。

我們可以從 ConsoleLogin 事件下手

在事件的細節中,可以觀察到聯合登入的使用者名稱(可能是假的),以及這個 Token 簽出的使用者

或者可以考慮用更前期的事件 GetFederationToken 去做偵測

後記

雖然有 API Key 就可以直接操作 API ,但對於雲端不太熟悉的同仁來說,直接用 Web GUI 會比較輕鬆。

請各位好好保護 AWS API Key,非自動化的帳號不要沒事產生 API Key。

Security Hardening Guides 的 Compilers 是什麼?

在很多檢查工具中都會有一個類別叫做 Hardening, 在這個類別中常見的東西有 安裝防毒, 定時稽核… 等, 其中有一個項目叫做 Compiler(s), 這個項目是我被問過最多次的一個項目, 在這邊跟大家分享這個項目的主要目的

說明

Compiler(s) 項目表示主機內有可供使用的編譯器, 像是 gcc, g++ 這類可以直接編出 Binary 的編譯器

風險

基本上在大多數正確設置的主機中, 若權限設定得宜可以將入侵後的破壞風險控制住, 但 Kernel 漏洞是很多人難以處置的問題, 可能原因是主機無法任意重開或者懶得管, Kernel 漏洞跟編譯器的主要關聯在於Kernel 漏洞可以透過編譯 exploit 來進行提權, 藉此獲取更高的權限, 這將使權限設定的效果降低, 而這樣的過程需要使用編譯器, 因此一個可以被使用者使用的編譯器會讓主機在某些層面上增加風險.

補充

  1. Lynis 有檢查這個項目
  2. 2016/10/20 – Linux 發現一個存在9年的 Kernel exploit – Dirty COW(CVE-2016-5195), 就是一個需要在編譯 exploit 的例子. 參考來源: The Hacker News – Dirty COW

Lynis: 忽略特定檢查

Lynis 讓我們可以快速的檢查主機的安全問題, 但有些檢查是我們不感興趣(例如提示), 或者主機特殊需求造成的誤判, 實際上 Lynis 是可以讓我們自定要跳過哪些項目

我們可以在 Lynis 的設定檔案中定義想要忽略的檢查, 這邊我使用預設的profile

default.prf

在最下面加入以下內容

skip-test=你想跳過的檢查編號

這邊的例子是想忽略 PKGS-7392 這個檢查項目

skip-test=PKGS-7392

如果想跳過多個就多寫幾行

skip-test=跳過檢查編號1
skip-test=跳過檢查編號2
skip-test=跳過檢查編號3

這樣在下次執行 Lynis 的檢查時將不會檢查我們希望忽略的檢查項目了

Lynis: Linux 主機安全性掃描工具

作為一個主機維運人員, 資訊安全一直都是我們非常注重的一個目標, 但主機一多就不容易顧及到所有細節.

本篇文章介紹的 Lynis 是一套 Linux 的主機稽核工具, 可以用來檢查主機的漏洞與弱點, 以及簡易的後門檢查, 也可以針對各種設定做出建議, 是一套非常好用的主機安全維護工具

安裝 Lynis

方法一: 使用 apt-get

使用 Debian, Ubuntu 的使用者可以使用 apt-get 進行安裝

apt-get install lynis 

雖然 apt 很方便, 但 apt 上的版本不會是最新的, 安全檢測工具最好要維持在最新版, 才能提供最完善的檢測效果, 建議從官方網站下載最新版本

方法二: 從官方網站下載(建議)

前往 官方網站 下載最新的版本

我在寫這邊文章的時候最新版本是 2.3.4, 下方指令使用 2.3.4 版作為示範, 記得要更換為最新版本喔!

wget https://cisofy.com/files/lynis-2.3.4.tar.gz
tar zxvf lynis-2.3.4.tar.gz
cd lynis

執行 Lynis

Lynis 的執行分為 root 模式與一般使用者模式, root 模式會檢查所有細節, 一般使用者模式僅檢查一些通用項目, 在這邊建議各位使用 root 模式

使用 root 執行 Lynis

sudo ./lynis audit system -Q

新版本還可以檢查 dockerfile, 挺厲害的呢

Lynis 將會開始進行各項稽核

執行完成後 Lynis 會將 log 放置於

/var/log/lynis.log

Lynis 結果報告

報告解讀與改善

透過 Lynis 的執行結果, 我們會發現 [FOUND], [NONE] 各種檢測結果, 這些結果根據不同的分類會有不同的解釋, 最簡易的判定方式是藉由顏色分辨, 綠色正常, 黃色提醒, 紅色警告, 但這不是絕對, 實際上需要依據實際需求狀況去做探討.


上圖就是一個例子, 由於這台主機的角色為路由器, 因此很多特殊的設定都被打開, 在這邊的紅字反而但表著正常.

在 Lynis 檢查結果的最後會附上如下圖的建議事項表

拿其中的一項做舉例

Warnings (1):
  ----------------------------
  ! Found one or more vulnerable packages. [PKGS-7392]
      https://cisofy.com/controls/PKGS-7392/

這個例子中舉例有弱點套件沒有更新, 前往下方的網址 PKGS-7392 就可以了解詳細的內容, 像是如何修補的建議與漏洞成因之類的, 在這次的範例中給出了下方的指令, 看樣子是更新系統的指令

apt-get update
apt-get upgrade

更新之後再一次的執行 Lynis, 就發現這個項目消失了, 代表我們解決了這個問題, 主機的安全更進一步了.

報告細節

有些公司可能會要求記錄稽核改善過程, Lynis 可以幫助你寫出好像很厲害的細節, 延續上面的例子, 我們針對 PKGS-7392 這個稽核項目進行更深入的了解

Lynis 提供的 show details 指令, 讓我們可以查詢每一項稽核結果的細節, 下方以PKGS-7392為例

sudo ./lynis show details PKGS-7392

Lynis 就會從 /var/log/lynis.log 中取出關於 PKGS-7392 的部分

2016-10-21 12:49:46 Performing test ID PKGS-7392 (Check for Debian/Ubuntu security updates)
2016-10-21 12:49:46 Action: updating repository with apt-get
2016-10-21 12:49:51 Result: apt-get finished
2016-10-21 12:49:51 Test: Checking if /usr/lib/update-notifier/apt-check exists
2016-10-21 12:49:51 Result: apt-check (update-notifier-common) not found
2016-10-21 12:49:51 Result: found vulnerable package(s) via apt-get (-security channel)
2016-10-21 12:49:51 Found vulnerable package: bind9-host
2016-10-21 12:49:51 Found vulnerable package: dnsutils
2016-10-21 12:49:51 Found vulnerable package: exim4
2016-10-21 12:49:51 Found vulnerable package: exim4-base
2016-10-21 12:49:51 Found vulnerable package: exim4-config
2016-10-21 12:49:51 Found vulnerable package: exim4-daemon-light
2016-10-21 12:49:51 Found vulnerable package: fontconfig
2016-10-21 12:49:51 Found vulnerable package: fontconfig-config
2016-10-21 12:49:51 Found vulnerable package: host
2016-10-21 12:49:51 Found vulnerable package: libbind9-90
2016-10-21 12:49:51 Found vulnerable package: libcurl3-gnutls
2016-10-21 12:49:51 Found vulnerable package: libdns-export100
2016-10-21 12:49:51 Found vulnerable package: libdns100
2016-10-21 12:49:51 Found vulnerable package: libfontconfig1
2016-10-21 12:49:51 Found vulnerable package: libgcrypt20
2016-10-21 12:49:51 Found vulnerable package: libgd3
2016-10-21 12:49:51 Found vulnerable package: libgdk-pixbuf2.0-0
2016-10-21 12:49:51 Found vulnerable package: libgdk-pixbuf2.0-common
2016-10-21 12:49:51 Found vulnerable package: libgraphite2-3
2016-10-21 12:49:51 Found vulnerable package: libidn11
2016-10-21 12:49:51 Found vulnerable package: libintl-perl
2016-10-21 12:49:51 Found vulnerable package: libirs-export91
2016-10-21 12:49:51 Found vulnerable package: libisc-export95
2016-10-21 12:49:51 Found vulnerable package: libisc95
2016-10-21 12:49:51 Found vulnerable package: libisccc90
2016-10-21 12:49:51 Found vulnerable package: libisccfg-export90
2016-10-21 12:49:51 Found vulnerable package: libisccfg90
2016-10-21 12:49:51 Found vulnerable package: libjasper1
2016-10-21 12:49:51 Found vulnerable package: liblwres90
2016-10-21 12:49:51 Found vulnerable package: libmodule-build-perl
2016-10-21 12:49:51 Found vulnerable package: libtasn1-6
2016-10-21 12:49:51 Found vulnerable package: linux-image-3.16.0-4-amd64
2016-10-21 12:49:51 Found vulnerable package: linux-libc-dev
2016-10-21 12:49:51 Found vulnerable package: ntp
2016-10-21 12:49:51 Found vulnerable package: ntpdate
2016-10-21 12:49:51 Found vulnerable package: openssh-client
2016-10-21 12:49:51 Found vulnerable package: openssh-server
2016-10-21 12:49:51 Found vulnerable package: openssh-sftp-server
2016-10-21 12:49:51 Found vulnerable package: python-pil
2016-10-21 12:49:51 Found vulnerable package: qemu-guest-agent
2016-10-21 12:49:51 Warning: Found one or more vulnerable packages. [test:PKGS-7392] [details:-] [solution:-]
2016-10-21 12:49:51 Suggestion: Update your system with apt-get update, apt-get upgrade, apt-get dist-upgrade and/or unattended-upgrades [test:PKGS-7392] [details:-] [solution:-]
2016-10-21 12:49:51 ===---------------------------------------------------------------===

這樣我們就可以依據Log結果來寫稽核報告了呢

定時執行

稽核要定時執行才能達到最好的效果, 我們可以藉由加入 crontab 來達到自動重複執行的目的

crontab -e

這邊假設 每天凌晨四點執行 (小提醒: 請注意主機時區)

0  4   *   *   *   root    /were/is/the/lynis audit system --no-colors -q -Q

這樣每天凌晨四點就可以去 /var/log/lynis.log 取得 分析結果, 有空的網管可以自己寫一支程式去分析結果然後寄送mail, Lynis 有提供可程式讀取的報告檔案

/var/log/lynis-report.dat

更新 Lynis

Lynis 要積極更新才能發揮他完整的作用, 可以使用以下指令來查詢是否有新的版本

./lynis update info

這部分有點可惜的是, Lynis 2.2 以後免費版就不再提供官方更新點了

雖然 Lynis 內建了更新指令, 但要自行架設更新主機

./lynis update release

由於不能直接更新, 各位要記得定時到官方網站下載最新版, 至於更新點的架設, 下次有機會的時候再來與各位分享