Siri に本当の愛を問う
- しくみ
- Raspberry Pi Zero W の GPIO と赤外線 LED を接続
- raspi に Homebridge と LIRC をインストール
- Homebridge にスイッチを登録し iOS 端末と Bluetooth 接続
- スイッチがオンになったら LIRC 経由で赤外線 LED を制御
- カラオケパセラの Σsystem - Wikipedia にリクエストを送信する
- 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 を設定
- Anker PowerCore 10000 でオートパワーオフせずに 80mA で駆動できる と先人がおっしゃるので購入、動いた
突然ですが、けものフレンズのアニメから外れる事になりました。ざっくりカドカワさん方面よりのお達しみたいです。すみません、僕もとても残念です
— たつき/irodori (@irodori7) 2017年9月25日
- 愛はどこにある…
サーバレスに OpenID Connect で AWS にサインイン
- サーバレスの言葉の意味を理解していませんが、「サーバインスンタンスを使わない」程度に思っておきましょう
- サーバインスタンスを使わずに、Google の OpenID Connect による認証で AWS マネジメントコンソール | AWS へのサインインおよび AWS コマンドラインインターフェイス(CLI - AWS サービスの制御・管理)|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
- 出力された origin を、先ほどの Google Cloud Platform のウェブアプリケーションを開き "承認済みの JavaScript 生成元" に追加して、準備は完了です
利用
- 出力された https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Dev をブラウザでアクセスすると、OAuth 同意画面を経由して、AWS コンソールに Dev ロールでサインインできるはずです
-
- できない場合は、反映が遅れている可能性があるため、少し待って再度試してください
- AWS CLI を使用する際は、URL の末尾に &export=1 をつけて認証をおこなうと、ブラウザに環境変数が表示されます
$ 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 コンソールへのサインインが提供されているが…
- そういった事情により OpenID Connect 採用
- Implicit Grant Flow なんて、バックエンドで検証しなきゃいけないし一生使わねえと思ってたけど、まるでサーバレスのために用意されていたかのよう
- G Suite 環境では OAuth の濫用が懸念だったが、昨日解決した
社員がG Suiteと併用してもよいサードパーティアプリケーションをアドミンが管理できるようになる | TechCrunch Japan @asannou https://t.co/u0VDvceeg5
— nov matake (@nov) 2017年8月2日
- フェデレーションユーザーに対して AWS マネジメントコンソール へのアクセスを許可する URL の作成(カスタムフェデレーションブローカー) - AWS Identity and Access Management が CORS に対応していないせいで、API Gateway まで使う羽目になった
Vuls で EC2 をバルスされないために(実践編)
これは Amazon EC2 Systems Manager Advent Calendar 2017 の -129 日目の記事です。
- Vuls を実行する IAM ユーザ "Bob" が、対象 EC2 インスタンス "i-1234567890abcdef0" の管理者ではない場合、アカウントの作成や SSH 公開鍵の登録や vuls-ssh-command.sh のインストールを依頼する必要があります
- それでは不便なので、ユーザが AWS Systems Manager – 運用のインサイトを入手して迅速に対応 を使用して、これらを自身でおこなえる方法を用意します
- Amazon EC2 Systems Manager とは、EC2 インスタンスにリモートのシェルスクリプト実行などを提供する、管理サービスです
- 対象 EC2 インスタンスにて Amazon EC2 Systems Manager (SSM) エージェントが使用可能になっていることが前提です
- AWS Systems Manager のセットアップ - AWS Systems Manager に手順が掲載されていますが、要点のみ書き出しました
- EC2 インスタンスにまだ IAM ロールがアタッチされていない場合は、作成してアタッチする
$ 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 インスタンスに SSM エージェントをインストール
[ec2-user ~]$ sudo yum install amazon-ssm-agent [ec2-user ~]$ sudo start amazon-ssm-agent
-
- Amazon EC2 Systems Manager は、なにかと便利なため、EC2 インスタンスの作成時にセットアップしておくことをおすすめします
- 前提を満たしたら、やっていきます
- 管理者に、最初の一回だけ vuls-ssh-command/terraform at master · asannou/vuls-ssh-command · GitHub の実行を依頼します
- "Bob" が、すべての EC2 インスタンスに対して https://github.com/asannou/vuls-ssh-command/blob/master/terraform/CreateVulsUser.json を実行できるようになります
$ 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
$ 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.