/
カテゴリー

こんにちは,ICTSCのインフラチームの竹村です.
普段は監視基盤の構築や運用を行っています.

ICTSCのインフラチームでは,使用しているサービスに対してアクセス制御を行うためにPomeriumと呼ばれるID認識型プロキシを使用しています. 本記事ではICTSCがPomeriumを導入した経緯とPomeriumの構築手順,最後に正常に構築できているかを確認します.

Pomeriumについて

Home – Pomerium

Pomeriumは,内部のアプリケーションの前段にプロキシとして存在し,
外部のIDプロバイダーを用いてユーザを識別します.識別したユーザやユーザが所属するグループごとにポリシーを適用して,アクセスコントロールを行うことができます.
他のID認証型プロキシとしては,GoogleのIdentity-Aware ProxyやAkamaiのEnterprise Application Accessがあります.
公式の動画を見てもらえると,大体のイメージをつかんでもらえると思います.

Pomerium demo

今までのアクセスコントロール方法について

今までのアプリケーションへのアクセスコントロールの方針としては,認証が組み込まれていないアプリケーションはBasic認証を使用していました.例えばインフラチームでは,監視に使っているPrometheusに認証の仕組みがないため,Basic認証を使用していました.

認証が組み込まれているアプリケーションではadminアカウントを作成し,そのアカウントをチーム内で共有して運用を行っていました.

一方で,各アプリケーションごとに作成された管理用のユーザのパスワードを探す必要があるという問題や管理用のアカウントを複数人で共有しているためアクセスコントロールができないという問題がありました.

Pomeriumの導入

今までのアクセスコントロールの問題を解決するために,Pomeriumを導入しました.また,ICTSCではGitHub Organizationを使用しています.GitHub Organizationでのチームやメンバーに関しては,Terraformを使って管理しています.Pomeriumでは,IDプロバイダーとしてGitHubを使用することができます.また,GitHubのチームごとにアクセスコントロールの設定を簡単に行うことができます.

Pomeriumの構築手順

Pomeriumの構築手順を示します.インフラチームでは,HelmfileとArgo CDを使いデプロイの自動化を行っています.ここでは,Helmfileを使用したPomeriumの構築方法を示します.
Helmfileの書き方や使い方に関しては,以下のスライドに詳しくまとめられています.

Kubernetes Dashboard | Pomerium
Helm/Helmfileについて

以下のバージョンのソフトウェアを使用しています.

  • Helm v3.4.1
  • Helmfile v0.135.0
  • Kubernetes v1.19.3
  • Pomerium v0.12.1

IDプロバイダーとしては,GitHubを利用しています.

NGINX Ingress ControllerとCert-managerの構築とPomeriumでアクセスコントロールを行いたい内部のアプリケーションの用意が終わっていることが前提となります.今回の例では,内部のアプリケーションとして,Prometheusを使用しています.

次に,Pomeriumの構築を行っていきます.
まず,helmfile.yaml を用意します.

environments:
workspace:
values:
- environment/workspace/values.yaml
develop:
values:
- environment/develop/values.yaml
production:
values:
- environment/production/values.yaml
repositories:
- name: pomerium
url: https://helm.pomerium.io
releases:
- name: helm-pomerium
namespace: monitoring
chart: pomerium/pomerium
values:
- environment/{{ .Environment.Name}}/values.yaml

次に,各enviromentに対応したvalues.yamlのファイルを用意します.

authenticate:
idp:
provider: "github"
clientID: GitHub_CLIENT_ID
clientSecret: GitHub_CLIENT_SECRET
serviceAccount: "ewogICJ1c2VybmFtZSI6ICJZT1VSX0dJVEhVQl9VU0VSTkFNRSIsCiAgInBlcnNvbmFsX2FjY2Vzc190b2tlbiI6ICJHRU5FUkFURURfR0lUSFVCX0FDQ0VTU19UT0tFTiIKfQo="

forwardAuth:
enabled: true

config:
sharedSecret: YOUR_SHARED_SECRET
cookieSecret: YOUR_COOKIE_SECRET
rootDomain: dev.example.com

policy:
- from: https://dashboard-proxied.dev.example.com
to:  http://prometheus.monitoring.svc.cluster.local:9090
allowed_groups: ["ictsc_infra"]
tls_skip_verify: true

- from: https://kibana.dev.example.com
to:  http://kibana.monitoring.svc.cluster.local:5601
allowed_groups: ["ictsc_infra"]
tls_skip_verify: true

ingress:
hosts:
- dashboard-proxied.dev.example.com
- kibana.dev.example.com
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod" # see `le.issuer.yaml`
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
secretName: pomerium-ingress-tls

IDプロバイダーがGitHubの場合は,clientIDとclientSecret,serviceAccountの3つのトークンが必要になります.
これらのトークンの取得方法は,この後に説明します.

rootDomainを定義することにより,rootDomainを起点としてPrometheusの各コンポーネントのIngressが作成されます.
policyでは,該当するURLに対してアクセスしてきたユーザを識別しポリシーにマッチした場合,どのアプリケーションにルーティングするかを定義します.

policyの1つ目の例だと,ictsc_infraという名前のチームに所属しているユーザを http://dashboar-proxied.dev.example.com から,内部のサービスのPrometheusにルーティングされます.

次に,GitHubでOAuth2を行うためのアプリケーションを作成します.

GitHub | Pomerium

[Settings] →[Developer settings] → [New OAuth App]の順番にボタンを押し,新しくOAuthアプリケーションを作成します.

HomepageURLには,Pomeriumと統合するアプリケーションのホームページURLを入力します.Authorization callback URLにはPomeriumのauthenticate_service_urlを入力します.先ほどのvalues.yamlの例だと, https://authenticate.dev.example.com/oauth2/callback になります.

Client IDとClient Secretsが作成されるので,その値を values.yaml のclientIDとclientSecretに貼り付けます.

最後に,policyでallowed_groupを使用するために,サービスアカウントを設定します.GitHubのサービスアカウントは,github.com/settings/tokens/new から新しく取得できます.

GitHub | Pomerium

取得したアクセストークンを以下のJSONに貼り付け,base64でエンコードします.
エンコードした結果を,values.yamlに貼り付けます.

{
"username": "YOUR_GITHUB_USERNAME",
"personal_access_token": "GENERATED_GITHUB_ACCESS_TOKEN"
}
$ base64 service_account.json
ewogICJ1c2VybmFtZSI6ICJZT1VSX0dJVEhVQl9VU0VSTkFNRSIsCiAgInBlcnNvbmFsX2FjY2Vzc190b2tlbiI6ICJHRU5FUkFURURfR0lUSFVCX0FDQ0VTU19UT0tFTiIKfQo=

あとは,設定をもとにPomeriumを立ち上げます.
以下のコマンドを実行します.

$ helmfile -e develop apply

サービスが起動しているを確認するために,以下のコマンドを実行します.

$ helm ls -n monitoring
NAME                            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
helm-pomerium                   monitoring      2               2021-02-22 09:08:06.869077288 +0900 JST deployed        pomerium-15.0.0         0.12.1

$ kubectl -n monitoring get ing

NAME              CLASS    HOSTS                                                                                        ADDRESS           PORTS     AGE
helm-pomerium     <none>   dashboard-proxied.dev.example.com,kibana.dev.example.com,forwardauth.dev.example.com + 1 more...       80, 443   28h

Ingressのhostに定義したドメインにアクセスをすると,GitHubのログイン画面にリダイレクトされます.今回はICTSC Pomerium(dev)という名前のOAtuh アプリケーションで認可を行っています.

GitHubのユーザでログインを行います.policyのallowed_groupsで設定したチームに所属するユーザが,内部のサービスにアクセスできれば成功です.下の図では,内部サービスのPrometheusにアクセスできています.

最後に

インフラチームでPomeriumを利用することにより,GitHubのチームに基づいてアプリケーションのアクセスコントロールをできるようになりました.
後日にインフラチームが運用しているKubernetesの記事も公開されるので,楽しみにしてください!

 /
カテゴリー
 /
カテゴリー

近年、ICTSCでは大会をオンラインで開催することが増えてきています。その際、必要となるのがSSH接続とダイナミックポートフォワーディング(SOCKSプロキシ)です。本稿ではそれらの方法をご紹介します。

SSHとダイナミックポートフォワーディング

SSHはリモートのサーバに接続し、シェルを実行できるサービスです。Linuxなどで標準的に利用されており、サーバを運用する上でも必須となる技術です。

ダイナミックポートフォワーディングはSSHサーバを介して通信を行える機能です。例えば、SSHサーバにダイナミックポートフォワーディングを行い、SOCKSプロキシに対応しているアプリケーションで接続することで、SSHサーバからのみ接続ができるサーバに接続することができます。

ICTSCにおいては、参加者のミスオペレーションや故意に脆弱に作っている問題環境があるため、問題環境をグローバル環境に晒さないようにしています。そのため、参加者には、グローバルIPを設定してあるサーバにSSH接続してもらい、必要に応じてダイナミックポートフォワーディングしてもらうことで、問題環境に接続してもらう形が多くなっています。

SSH接続の方法

Windows 10 / Mac OS X / Linux の環境のおいて共通のコマンドで接続できます。Windows 10の場合はコマンドプロンプト、もしくはPowerShellを起動したうえで、コマンドを実行してください。Mac OS X / Linux の場合はターミナルを起動し、コマンドを実行してください。

パスワード認証の場合

ssh $USER_NAME@$HOST

$USER_NAME にはログインユーザーの名前を、$HOST には接続したいホストのドメイン名、もしくはIPアドレスを入力します。接続後のパスワードを求められるので、入力してください。

公開鍵認証の場合

公開鍵認証方式でsshを行う場合は、手元にある秘密鍵ファイルを指定して接続します。

ssh $USER_NAME@$HOST -i $KEY

$USER_NAME にはログインユーザーの名前を、$HOST には接続したいホストのドメイン名、もしくはIPアドレスを、$KEYには秘密鍵ファイルのパスを入力してください。

例として、 test.example.comuser としてパスワード認証でログインするとします。 以下のように、ホストへの接続に成功した場合はパスワードを問われるのでuser のパスワードを入力します。初めてホストに接続する際には、初めてホストに接続していることを確認されるので yes と入力します。

$ ssh user@test.example.com
The authenticity of host 'test.example.com (***.***.***.***)' can't be established.
ECDSA key fingerprint is SHA256:***************.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'test.example.com' (ECDSA) to the list of known hosts.
user@test.example.com's password:

正常にログインできた場合、自由に操作できるシェルが立ち上がっているはずです。問題を解くには開いたシェルから更に問題のVMにSSH接続する必要があるでしょう。

Windows 10 以前の環境には ssh コマンドがインストールされていないため、自分でインストールする必要があります。[こちら](https://github.com/PowerShell/Win32-OpenSSH/releases) からダウンロードし、インストールしてください。

ダイナミックポートフォワーディングの方法

ダイナミックポートフォワーディングを行うには、通常のSSH接続に加えてオプションを追加します。具体的には以下のとおりです。

ssh -D $PROXY_PORT $USER_NAME@$HOST

$PROXY_PORTにはダイナミックポートフォワーディングをするポートを指定します。SOCKSプロキシに対応しているアプリケーションは、ここで指定したポートでデータを送受信することで、SSHサーバを介して目的のサーバに接続することができます。

SOCKSプロキシの使い方

Windows 10

設定 > ネットワークとインターネット > プロキシ を開くと以下の図のようになります。

そのうえで、以下のように設定することでSOCKSプロキシを使うことができます。

  • プロキシサーバーを使う をオン
  • アドレスsocks://127.0.0.1 を入力
  • ポート$PROXY_PORT で設定した値を入力

Mac OS X

設定 > ネットワーク > 詳細 > プロキシ を開くと以下の図のようになります。

file

そのうえで、以下のように設定することでSOCKSプロキシを使うことができます。

  • SOCKSプロキシ にチェックをつける
  • SOCKSプロキシサーバ127.0.0.1$PROXY_PORT を入力

Linux

アプリケーションによって異なります。どうしてもわからない場合はFirefoxをインストールし、以下の方法で接続してください。

Firefox

オプション > ネットワーク設定 > 接続設定 を開くと以下の図のようになります。

file

そのうえで、以下のように設定することでSOCKSプロキシを使うことができます。

  • 手動でプロキシを設定する を選択
  • SOCKS ホスト127.0.0.1 を入力
  • SOCKS ホスト と同じ行の ポート$PROXY_PORT を入力
  • SOCKS v5 を選択

まとめ

以上の方法で、問題環境へはアクセスできるはずです。みなさん、頑張ってください。

 /
カテゴリー

ICTSC2018 1次予選の予選環境にアクセスするためには、踏み台サーバを経由してアクセスする必要があります。踏み台サーバへは、SSHもしくはVNCを用いて接続することが出来ます。

macOS

SSHを用いる場合

ターミナルを開き、以下のコマンドを実行します。

$ ssh -D [proxy-port] -p [port] [user]@[remote addr]

VNCを用いる場合

インストール方法

homebrewを用いてインストールする場合は以下のコマンドを実行してください。

$ brew cask install vnc-viewer

公式サイトを用いる場合はこちらからダウンロードしてください。

接続方法

Spotlightなどで「VNC Viewer」を開き、上部のテキストボックスにホスト名とポート番号を入力してEnterを押します。

その後、ユーザ名とパスワードを入力してログインします。

Windows

SSHを用いる場合

こちらでは、SSH接続するため環境をMobaXterm、ブラウザはfirefoxで説明させていただきます。
※MobaXterm未インストールの方はコチラから無料の方をダウンロードしてください。
※firefox未インストールの方はコチラからダウンロードしてください。

接続方法

  • MobaXtermの設定
    • Dynamic port forwardingを用いた新しいtunnelingを追加します。
    • 使用するポート番号と、接続先のipアドレスユーザー名ポート番号を入力してください。
  • firefoxの設定
    • ネットワークプロキシの接続から手動でプロキシを設定します。
    • その際、SOCKSの欄にipアドレスポート番号を設定してください。

VNCを用いる場合

※UltraVNC未インストールの方はこちらからダウンロードしてください。

  1. 「VNC Server」の項目に接続先ip addressを入力します
  2. 右側にあるConnectを押して接続完了です。
 /
カテゴリー

こんにちは!運営委員の門脇です!

ICTSC6に参加して頂きました皆様、お疲れ様でした!

 

 

さて、準備期間中に運営はラック内配線の整理もやっていました。

今回は「運営委員が何をしていたか」を少しでもご紹介できれば、と思います。

続きを読む