Siri に本当の愛を問う


  • カメラがドッタンバッタンしてるのと iMovie 編集丸出しなのはご容赦ください


  • raspi と赤外線 LED の回路図その他は、多くの先人が英知を残しているので割愛
  • ミンティアのケースに入れた先達 に学び、赤外線 LED 関連も含めて格納する
  • カラオケへの送信は 先駆者 がいるのだが、リモコン信号のフォーマットが不明なので、自力で raspi に赤外線センサーを取り付けて LIRC で学習する
begin remote

  name            SIGMA
  bits            16
  flags           SPACE_ENC
  eps             30
  aeps            100
  header          9094  4425
  one             642   1608
  zero            642   481
  ptrail          646
  pre_data_bits   16
  pre_data        0xAA55
  gap             39822
  toggle_bit_mask 0x0

  begin codes
    0 0xc837
    1 0xf00f
    2 0xf20d
    3 0x728d
    4 0xe01f
    5 0xe21d
    6 0x629d
    7 0xc03f
    8 0xc23d
    9 0x42bd
    A 0xca35
    B 0x4ab5
    E 0x7c83
  end codes

end remote
    • 曲番号を 3825A4 とした場合、以下のようにパディングと終端をつけて送信する
$ irsend SEND_ONCE SIGMA 3 8 2 5 A 0 4 E
    • これを Homebridge のスイッチに登録
{
  "accessories": [
    {
      "accessory": "CMD",
      "name": "ようこそジャパリパークへ",
      "on_cmd": "/usr/bin/irsend SEND_ONCE SIGMA 3 8 2 5 A 0 4 E",
      "off_cmd": "true"
    }
  ]
}
  • iOS 端末の HomeKit を設定


  • 愛はどこにある…

引用元: LIVE DAM STADIUM / ようこそジャパリパークへ / どうぶつビスケッツ×PPP

サーバレスに OpenID Connect で AWS にサインイン

準備

$ git clone https://github.com/asannou/aws-signin-with-oidc
  • 適当な S3 バケット名を決め terraform.tfvars に書き込みます
  • Google Cloud Platform から、適当なプロジェクトを作り "OAuth クライアント ID" の API 認証情報を作成します
    • "OAuth 同意画面" でサービス名の設定が必要な場合がありますが、適当に入力します
    • "クライアント ID の作成" でアプリケーションの種類から "ウェブアプリケーション" を選択します
    • 適当に名前を決めて作成します
    • "クライアント ID" が表示されるので terraform.tfvars に書き込みます
  • Dev と Admin という IAM ロールがあるので、それぞれサインインを許可するユーザのメールアドレスを terraform.tfvars に書き込みます
    • Dev は ReadOnlyAccess ポリシー、Admin は AdministratorAccess ポリシーがアタッチされます
    • ここは適宜 カスタマイズ してください
  • 最終的にこのような感じになります
$ git diff
diff --git a/terraform.tfvars b/terraform.tfvars
index 2d3d635..ec5d990 100644
--- a/terraform.tfvars
+++ b/terraform.tfvars
@@ -1,17 +1,17 @@
 aws_region = "us-east-1"

-s3_bucket = "bucketname"
+s3_bucket = "aws-signin-with-oidc"

 client_id = {
-  google = "000000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"
+  google = "689439588880-vmco4me6g34au0h43ao9tbkb3slgffht.apps.googleusercontent.com"
 }

 email = {
   dev = [
-    "dev@example.com",
+    "asannou@gmail.com",
   ]
   admin = [
-    "admin@example.com",
+    "asannou@gmail.com",
   ]
 }
  • terraform を適用します
$ terraform apply
...
google = {
  admin = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Admin
  dev = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Dev
}
origin = https://aws-signin-with-oidc.s3.amazonaws.com

利用

    • できない場合は、反映が遅れている可能性があるため、少し待って再度試してください
  • AWS CLI を使用する際は、URL の末尾に &export=1 をつけて認証をおこなうと、ブラウザに環境変数が表示されます
    • 環境変数を設定すると、同等の権限で AWS CLI を実行することが可能です
$ export AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE; export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY; export AWS_SESSION_TOKEN=AQoDYXdzEJr...
$ aws sts get-caller-identity
{
    "Account": "123456789012",
    "UserId": "AROAIOSFODNN7EXAMPLEU:asannou@gmail.com",
    "Arn": "arn:aws:sts::123456789012:assumed-role/Dev/asannou@gmail.com"
}

雑感

  • SAML であれば、ネイティブで AWS コンソールへのサインインが提供されているが…
    • SAML ID プロバイダの少なさ(Google でいいのだが G Suite でのみ利用可)
    • ロールの指定はプロバイダ側の属性付与が必要(AWS のみで完結しない)
    • CLI で使うときは スクレイピング ってまじか
  • そういった事情により OpenID Connect 採用
    • Implicit Grant Flow なんて、バックエンドで検証しなきゃいけないし一生使わねえと思ってたけど、まるでサーバレスのために用意されていたかのよう
    • G Suite 環境では OAuth の濫用が懸念だったが、昨日解決した

Vuls で EC2 をバルスされないために(実践編)

これは Amazon EC2 Systems Manager Advent Calendar 2017 の -129 日目の記事です。

$ aws iam create-role --role-name EC2RoleSample --assume-role-policy-document '{"Version":"2012-10-17","Statement":{"Effect":"Allow","Principal":{"Service":"ec2.amazonaws.com"},"Action":"sts:AssumeRole"}}'
$ aws iam create-instance-profile --instance-profile-name EC2RoleSample
$ aws iam add-role-to-instance-profile --instance-profile-name EC2RoleSample --role-name EC2RoleSample
$ aws ec2 associate-iam-instance-profile --instance-id i-1234567890abcdef0 --iam-instance-profile Name=EC2RoleSample
    • EC2 インスタンスにアタッチされた IAM ロールに AmazonEC2RoleforSSM ポリシーをアタッチする
$ aws iam attach-role-policy --role-name EC2RoleSample --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM
[ec2-user ~]$ sudo yum install amazon-ssm-agent
[ec2-user ~]$ sudo start amazon-ssm-agent
    • Amazon EC2 Systems Manager は、なにかと便利なため、EC2 インスタンスの作成時にセットアップしておくことをおすすめします
  • 前提を満たしたら、やっていきます
$ terraform apply
var.vuls_roles
  Enter a value: []

var.vuls_users
  Enter a value: ["Bob"]

...
  • 晴れて IAM ユーザ "Bob" は EC2 インスタンス "i-1234567890abcdef0" に Vuls のためのユーザを作成できるようになりました
$ aws sts get-caller-identity --output text --query Arn
arn:aws:iam::123456789012:user/Bob
$ aws ssm send-command --document-name CreateVulsUser --instance-ids i-1234567890abcdef0 --parameters publickey="$(cat $HOME/.ssh/id_rsa.pub)" --output text --query Command.CommandId
854365f0-aefb-48eb-be4a-f2a0c6c2cf9e
  • 同時に実行結果として、インスタンスSSH ホスト公開鍵を取得できるので known_hosts に追加すれば安全に接続できます
$ aws ssm get-command-invocation --command-id 854365f0-aefb-48eb-be4a-f2a0c6c2cf9e --instance-id i-1234567890abcdef0 --output text --query StandardOutputContent | tee -a $HOME/.ssh/known_hosts
203.0.113.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJKQ5+Aauvvb5iPFfYeQhcIegsich7SJ1Ji97mh3sGx3wvXAV53wuzn4ILSEn9ENtb6bXT/puLiCUi2bza2To24= root@ip-172-31-28-103
$ ssh -t vuls@203.0.113.1 'stty cols 1000; curl --max-time 1 --retry 3 --noproxy 169.254.169.254 http://169.254.169.254/latest/meta-data/instance-id'
i-1234567890abcdef0Connection to 203.0.113.1 closed.