書いた。
マネーフォワードのコーポレートエンジニアがやっているSaaSの障害検知方法 moneyforward.com
書いた。
マネーフォワードのコーポレートエンジニアがやっているSaaSの障害検知方法 moneyforward.com
過去に何回かAzure環境(私の用途だとAzureADだけど)をTerraform管理するため、構築してきたけど 毎回やり方を忘れて数時間無駄にするのでメモ。
az account list --query "[].{name:name, subscriptionId:id, tenantId:tenantId}"
az account set --subscription="<<上記のsubscriptionIdの値>>"
SUBSCRIPTION_ID=<<上記のsubscriptionIdの値>>
SUBSCRIPTION_NAME="Terraform"
az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}" --name "${SUBSCRIPTION_NAME}"
(念の為、上記URLのスクリプト内容を転記)
#!/bin/bash RESOURCE_GROUP_NAME=tstate STORAGE_ACCOUNT_NAME=tstate$RANDOM CONTAINER_NAME=tstate # Create resource group az group create --name $RESOURCE_GROUP_NAME --location eastus # Create storage account az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob # Get storage account key ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query [0].value -o tsv) # Create blob container az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME --account-key $ACCOUNT_KEY echo "storage_account_name: $STORAGE_ACCOUNT_NAME" echo "container_name: $CONTAINER_NAME" echo "access_key: $ACCOUNT_KEY"
上記までで、TerraformによるAzure環境の管理ができるようになったので下記のようなtfファイルを作って管理する。
main.tf(azureadプロバイダを使う宣言と、stateファイルの保管場所の指定)
provider "azuread" { version = "0.7" } terraform { backend "azurerm" { resource_group_name = "tstate(手順2でリソースグループ名を変えてた場合はその名前にする)" storage_account_name = "<<手順2のstorage_account_name>>" container_name = "<<手順2のcontainer_name>>" } }
※MSのサイトではbackendにkeyも指定しているが、それは危険なのでterraform initするときに指定するようにする。(後述)
enterpriseApp.tf(エンタープライズアプリケーションの管理)
resource "azuread_application" "appName" { name = "appName" homepage = "https://account.activedirectory.windowsazure.com:444/applications/default.aspx?metadata=customappsso|ISV9.1|primary|z" app_role { allowed_member_types = [ "User" ] description = "User" display_name = "User" is_enabled = true } app_role { allowed_member_types = [ "User", ] description = "msiam_access" display_name = "msiam_access" is_enabled = true } } resource "azuread_service_principal" "appName" { depends_on = ["azuread_application.appName"] app_role_assignment_required = "true" application_id = "${azuread_application.appName.application_id}" tags = [ "8adf8e6e-67b2-4cf2-a259-e3dc5476c621", "WindowsAzureActiveDirectoryCustomSingleSignOnApplication", "WindowsAzureActiveDirectoryGalleryApplicationNonPrimaryV1", "WindowsAzureActiveDirectoryIntegratedApp", ] }
※1 azuread_service_principalについて補足1
エンタープライズアプリケーションの種類はtags欄で決まる模様。上記は「ギャラリー以外のアプリケーション」を作成する例。
※2 azuread_service_principalについて補足2
depends_onを設定しないとazuread_applicationとの整合性がとれなくなってつむ。
azureuser.tf(ユーザーやグループを管理するtf)
# AzureADからObject IDを取得 data "azuread_user" "user1" { user_principal_name = "user1@hogehoge.com" } # グループ作成 resource "azuread_group" "group1" { name = "group1" # AzureADのグループにメンバー追加 resource "azuread_group_member" "group1" { group_object_id = azuread_group.group1.id member_object_id = data.azuread_user.user1.id }
手順4のtfファイルが存在するディレクトリで下記を実行。
export ARM_SUBSCRIPTION_ID="<<手順1のsubscriptionId>>" export ARM_CLIENT_ID="<<手順1のappId>>" export ARM_CLIENT_SECRET="<<手順1のpassword>>" export ARM_TENANT_ID="<<手順1のtennant>>" terraform init -backend-config="key=<<手順2のaccess_key>>"
無事、successとなったら
terraform plan
で作成されるリソースの確認。 terraform apply
でリソース作成して終了!
GitHub ActionsやCircle CI等でCIしたいときは上記値を環境変数とかに埋め込めばできます。
雑メモ。 TerraformからAzureAD アプリケーションを作成しようとすると、下記のエラーが。。
Error: graphrbac.ApplicationsClient#Create: Failure responding to request: StatusCode=400 -- Original Error: autorest/azure: Service returned an error. Status=400 Code="Unknown" Message="Unknown service error"
権限も、下記のような感じで問題ないはず。。
と悩んでたら、「name」の箇所に記号が入ってたのが原因だった。 でも、GUIでは記号入れられるのになー??なんでだ??と思ってたら、下記みたいに「name」からデフォルトURLを作成するのね。。そりゃエラーになるわ。。
というわけで、「homepage = "https://dummy/" 」とかってのを入れたら無事に作成できた。 (記号以外にも、空白や2バイト文字でも起きる模様)
いつも忘れて調査に時間がかかるのでメモ。 ※情報が正しくない恐れありです。いつか清書します。
Global Protect用のドメインを取得 & TXTレコードが書き換えられる環境を用意しておく。
下記を事前にインストールしておく。
下記コマンドを実行。変数の箇所は各自の環境に合わせて書き換えてください。
DOMAIN=hogehoge.com #Global Protect用のドメイン MAIL=admin@hogehoge.com #証明書失効について通知したりするメールアドレス certbot certonly --manual \ -d ${DOMAIN} -m ${MAIL} --agree-tos --manual-public-ip-logging-ok \ --preferred-challenges dns-01 \ --server https://acme-v02.api.letsencrypt.org/directory
下記のような感じで登録するテキストレコードが表示するので、それを登録し、ちょっと時間を置いてからEnterする。
Please deploy a DNS TXT record under the name _acme-challenge.hogehoge.com with the following value: xxxxxxxxxxxxxxxxxxxxxxx Before continuing, verify the record is deployed.
証明書作成に成功したらpfx形式の証明書を生成する。
TEMP_PWD=$(openssl rand -hex 15) sudo openssl pkcs12 -export -out letsencrypt_pkcs12.pfx -inkey /etc/letsencrypt/live/${DOMAIN}/privkey.pem -in /etc/letsencrypt/live/${DOMAIN}/cert.pem -certfile /etc/letsencrypt/live/${DOMAIN}/chain.pem -passout pass:$TEMP_PWD
Palo AltoのAPIキーを得る。下記変数の箇所は各環境に合わせてください。
#変数 PAN_MGMT=192.168.xx.xx #Palo AltoのIP USERNAME=admin PASSWORD=hogehoge #APIキー発行 panxapi.py -h ${PAN_MGMT} -l ${USERNAME}:${PASSWORD} -k
成功するとこんな感じで表示
keygen: success API key: "xxxxx"
下記のような感じでアップロードする。
# 変数 CERT_NAME=LetsEncryptWildcard #任意の証明書名 API_KEY="xxxxx" #上記で生成されたAPIキー # アップロード curl -k --form file=@letsencrypt_pkcs12.pfx "https://$PAN_MGMT/api/?type=import&category=certificate&certificate-name=$CERT_NAME&format=pkcs12&passphrase=$TEMP_PWD&key=$API_KEY" && echo " " curl -k --form file=@letsencrypt_pkcs12.pfx "https://$PAN_MGMT/api/?type=import&category=private-key&certificate-name=$CERT_NAME&format=pkcs12&passphrase=$TEMP_PWD&key=$API_KEY" && echo " "
成功すると下記のような結果が表示される。
<response status="success"><result>Successfully imported LetsEncryptWildcard into candidate configuration</result></response>
あとはPalo AltoのGUIコンソールで「デバイス」-「証明書の管理」-「証明書」でアップロードした証明書が現れているので、Global Protectポータル等でアップロードした証明書を使えばOK。
コーポレートエンジニアとして生きていく以上、お友達にならないといけない(?)Google Apps Script。
使いこなすと、色々と便利なので大変役立つので業務で使っている方も多いと思います。
ですが、最大のデメリットとして、 「Google Apps Scriptは標準機能だけではコード管理ができない」 ということがあげられると思います。
このページはGASをコード管理するためにステップバイステップで手順を記載したページになります。
上記につきると思うのですが、具体的になにが嬉しいかというと
といったことがあるかなと。そして、
これは何かというと、共有のGASを作成した場合、よくあるケースとして「共有用Gsuiteアカウントを作成して、そのアカウントのID/PASSを共用してGASを編集する」というのがあると思います。
これは実は危険で、「誰が編集したかがわからない」とか、そもそもGAS以外にGmailとかも使えるので「共有用アカウントでGmail等から情報持ち出し&誰が持ち出したかがわからない」という問題がおきます。
繰り返しになりますが、これは非常に厄介。
しかもそのアカウントが「Webアプリケーションとして公開」(詳細は後述)が可能なユーザだったりすると、各種社内資料の閲覧権限をいじってしまい、Internetに公開されてしまうかもしれないという問題も。
これが、CI化することで
という嬉しいことがおきます。
色々なケースに対応できるように下記要件で構成しようと思います。 管理対象のGASのケースに応じて下記要素の不要なところを適宜削ってもらえればと思います。
構成図でいうと、こう。
まず、事前に下記アカウント、リポジトリを用意しておきます。2はお近くのコーポレートエンジニアにお願いするといいと思います。 1についてもコーポレートエンジニアに相談すると検証用のアカウントくれるかもしれません。
claspで使用するための認証Tokenを取得します。
自分のPCでclaspを一時的にインストールしてtokenを取得しますが、tokenを得られたら自PCからはclaspを削除してもOKです。
npm i @google/clasp -g
clasp create SAMPLE
以上までの準備が整いましたらいよいよ構築です。
GitHub Actions用のワークフローとして下記ymlをGitHub側にアップロード(push)するので事前に作成しておきます。
,"webapp": { "access": "ANYONE_ANONYMOUS", "executeAs": "USER_DEPLOYING"}
上記までが完了しましたら、GitHubでGASのコードが管理できるようになります。
具体的には
参考までに:運用デモ
https://streamable.com/dfzyv
色々と初期設定は煩雑ですが、一回設定が終わればGitHubにpushするだけでGASに反映されるので便利です。
また、GitHubの機能を使ったレビュー機能が使えたり、GASのオーナー権限を絞ることができたりと色々と応用の幅があると思いますのでぜひぜひ試してみてくださいませ。
Apple社デバイス管理者にとって悲願(?)のApple IDがIdP(今のところAzureADだけ?)によるログインが可能になったので検証してみました。
結論から言うと、 「まだ社内展開は早いかな...。」 という所感を持ったのでそこについて触れていきます。
ちなみに、現状、フェデレーションログインによるメリットが享受できる企業としては下記になると考えています。(詳細は後述)
なんといってもメリットは1につきると思います。
2についても、新入社員はiPhone/iPadを支給されたらAzureADでログインする"だけ"で良くなるのでとても簡単になります。
...とここまではメリットしかなくて「最高だぜ!!!ヒャッハー!」なんですが、デメリットもあります。大きすぎるデメリットが。
最大のデメリットは1ですね。
おそらく、会社展開の場合は、「会社使用のメールアドレス」にApple IDを紐付けていると思います。
そして、大多数の方はフェデレーションログインする際にメールアドレスのドメイン部でフェデレーション設定をしたいと思うはずです。
ところが...今回のフェデレーション設定をすると今回のケースのような場合、既存ユーザは別Apple ID作成を強制されます。しかも別ドメインに!
例: 会社のメールアドレスがtaro@hoge-apple.comであり、AppleIDもそのメールアドレスで作成した場合。
こんな事態になります。
つまり...
Apple IDを多量に展開済であればあるほど、フェデレーションログインへの移行は難しくなるわけです。。
現実解としては下記のようになるかなと考えます。
(ぜんぜん、現実的ではないがこれくらいしか打開策が思いつかない)
さて、ここからが本題。
デメリットがとても大きいリリースですが、メリットもゼロじゃないのでいざ設定をしてみようと思います。
手順は公式サイトの下記を参考にやります。
support.apple.com
前提として下記が必要なので準備しておいてください。
前提:
このフェデレーションは 一度設定するとそのドメインは削除できません (2019.12.2時点) のでご注意ください。
ドメインの追加自体はできるのでまあいいのかもしれませんが、気にされる方はお気をつけを。
(指摘頂いた khakさんありがとうございます!!)
元記事はこちらです。
feedproxy.google.com
ざっくりいうと、
AWS SSOの認証元として、3rdPartyのSSO製品でユーザ認証ができるようになった
というやつです。
今までは、下記方法によりAWS SSOのユーザ認証が可能でしたがそれぞれ頭を悩ますデメリットがありました。
また、上記デメリットがあるゆえに、IAMでIdentity Providerを登録して運用している人も多いと思います。(私もそうでした)
ただ、これにもデメリットがあり
というなかなか辛い状況もあります。(幸い、Terraform化できるのでコード化できてればそこまで苦労はないといえば無いですが面倒は面倒)
それが、今回のリリースにより 3rdPartyのIdentity Providerが使用できることによりAWS Directory ServiceもAD Connectorも必要なくなったので上記デメリットが払拭された形になります。
また、上記デメリットが払拭されるばかりか、メリットとして
というメリットもあります。(これが地味にすごく便利!!!)
今までは こういった ツールに頼らざるを得なかったので、今回のリリースはもうメリットしかないわけです。
(厳密にいうと、少しだけデメリットはありますが)
というわけで今後、AWS環境とSSOを結ぶ際には今回の方式がデファクトスタンダードになると思われますので、設定してみます。
基本的には下記記事を実行しているだけなのですが、元記事では手順がざっくりしている箇所もあるのでステップバイステップで少し詳細に書いていきます。 feedproxy.google.com
前提として、下記準備が必要です。
それでは、上記記事を参考に実装していきます。
設定自体はとても簡単で、導入後の運用も煩雑なところがなくデメリットが特にないように思えます。 今まで、最初に述べたデメリットのせいでAWS SSOが導入できていなかった方はこの機会に是非導入することをおすすめします。 快適ですよ。