JAWS DAYS 2018 に参加した (5)

AWSセキュリティ事始め~基礎からはじめてクラウドセキュリティの恩恵を受ける~

クラウドを利用しないことについて、セキュリティ的に不安という声

・クラウドよりもオンプレミスがセキュリティ面で優れている理由を上司に聞いてみよう。
・最近、日本法の適用も可能になった。
https://aws.amazon.com/jp/blogs/news/how-to-change-aws-ca-by-artifact/

いくつかのマネージメントサービスの紹介する。
これらを単独や組み合わせて使っていくことでセキュリティを向上させるべし。

Amazon Inspector

・1エージェント1評価0.30USDから
・各サーバで月1回定期スキャンしても良いかも

WAFマネージメントルール

・常に最新のルールにメンテナンスされる

AWS Shield

・L3/L4レベルのDDoSは無料で防がれている
・なぜAWSがDDoSに強いか
 https://www.slideshare.net/AmazonWebServicesJapan/aws-shield-managed-ddos-protection

GuardDuty

・機械学習で怪しい通信を検知する
・機械学習には膨大なデータが必要となるが、一企業で用意することは難しい。
 AWSの膨大なデータの学習データを利用することができる。

Macie

・S3に保存されているデータを機械学習で自動的に発見するサービス
 S3の漏洩などに早めに気が付けるかも

JAWS DAYS 2018 に参加した (4)

Amazon Rekognitionを使って親御さんの写真探しのお手伝いができた話

はいチーズ!とは

全国5000団体が利用する写真販売サービス
写真販売がいつでもどこでも気楽に可能となる。

顔検索機能

ミッションは、園児一人一人が主人公の写真を撮る。
大規模園であると10000の写真の中から子供を見つけないといけない。
親は忙しいため、顔検索機能を実現しようとした。

これまで顔認識製品を検証してきたが、速い、安い、高精度がなかなか見つからない。
エンジンの自社開発は技術的に難しい。
あきらめかけていた時にAmazon Rekognitionを知った。

Amazon Rekognition

学習済みのAIが3種類。
Lex・Polly・Rekoginition(画像の物体やシーン、顔の検出)
Rekoginitionに顔と顔が似ているかどうかの判定する機能があった。

主に利用するAPIは3つ。
CreateCollection:顔コレクションを作成
IndexFaces:顔メタデータ(顔の特徴を表すベクトル)を顔コレクションに追加
SearchFacesByImage:類似顔画像を探す

優位点

他社製品と比較して、Rekognitionが優位なポイント
・S3上の画像を処理可能
・顔メタデータ作成がスケール可能
・顔メタデータ保持コストが安い
・精度が高い
・検索が速い
 数万件のデータから1,2秒で検索可能

問題点

導入当時は問題があった。
・東京リージョンになかった(2月28日より利用できるように)
・1画像から同時検出できる顔の数が上限15である問題(当時)
 そのため集合写真が扱えなかったため、画像を分割して探すような処理を入れていた。
 ⇒人混みモードがリリースされ、1画像あたり100個検出されるようになった。

利用されるまで

ベータリリースで一部の顧客へ利用してもらった。
効果がなかなか現れず、使用率が低い時期が続いた。

「画像をアップロードが手間なのではないか」
⇒注文履歴を分析して、必要な子供の顔を取得して、オススメ写真として表示するようにしたところ
 ユーザの使用率が上がり、コンバージョン率がアップした。

JAWS DAYS 2018 に参加した (3)

「AIアナウンサー」を20分で解説!

Amazon Pollyは初心者にオススメ!

プログラムしなくてもマネージメントコンソールから利用可能。

他のクラウドのサービスと比較して
価格的メリットは少ないが、日本語音声の質が一番良かったらしい。

確かにすぐ利用できた。

no border

すべての人が開発者になる時代がきている。
自分で問題を見つけ出し、解決できる人材が増えていく。
ITはさらに一部の企業だけのものではなくなっていく。

JAWS DAYS 2018 に参加した (2)

AWS のマネージドサービスを使ったセキュリティ強化のための自動化

freeeは少数のSRE(5名)で支えられており、リソースは限られている。
マネージドサービスや自動化をうまく利用して
ユーザーにとって本質的に価値のあることにフォーカスするべき。

WAF対応

攻撃者IPアドレスをnginxのconfに入れて拒否していたが、WEBサーバの負荷があがってきたためWAFを利用することに。
WAFでのブロック結果をSlackに飛ばしており、重要度によって色分けされるようにしている。

GuardDutyを利用した攻撃検知

Cloud Trail・VPCフローログ・DNSログなどを収集して、攻撃されているかどうかを検出する。
ポートスキャニングなどはほぼリアルタイムで検知する。
通知の機能はないため、Cloud Watch Eventsから、Lambdaが動作し、Slackで通知するようにしている。

JAWS DAYS 2018 に参加した (1)

AWS × 形式手法で人知を超えたセキュリティを手に入れろ

システムを数学的対象として記述すること(形式手法)で
直感に頼ることがなくなる。ただし習熟者は少なく学習コスト高め。

理解できなかったため、少し調べてみた。

形式手法

「テストでは、欠陥が無いことは保証できない」(Edsger W. Dijkstra)
この問題を解決するため、形式手法では、仕様を数学的に記述し、テスト漏れがないことを証明する。
形式手法とモデリング – AlloyAnalyzerを中心に

モデル検査機 Alloy

Alloy Analyzerをダウンロードして

java -jar "C:\Users\shimizu\Downloads\alloy4.2_2015-02-22.jar"

とすることでAlloy Analyzerが起動した。

試しに1つ実行してみた。

sig User {
	policy : Policy,
}

sig Policy {}

run {}

aws cli で EC2 一覧を取得する

EC2一覧

# ACCOUNT=accountname
# aws ec2 describe-instances --profile $ACCOUNT --query 'Reservations[].Instances[].{Tags:Tags[?Key==`Name`].Value|[0]}' | jq -r '.[].Tags' | sort

EIP一覧

# ACCOUNT=accountname
# aws ec2 describe-addresses --profile $ACCOUNT --query "Addresses[].PublicIp" | jq -r '.[]'| sort

S3をリバースプロキシする際の疑問点調査

nginx(EC2)でリバースプロキシしてS3を公開した際に
・Static website hosting は必要かどうか?
・S3エンドポイント を利用すると設定で変更するところはあるのか?
がわからなかったため調査。

結論として
・Static website hostingは必要なし。
・S3エンドポイントをバケットポリシーで制御する必要がある。
ことがわかった。

S3設定

バケット名:bucket–name
を作成して、[1.png]をアップロードした。

URLは以下となる。
http://bucket–name.s3.amazonaws.com/1.png
http://bucket–name.s3-ap-northeast-1.amazonaws.com/1.png
http://s3-ap-northeast-1.amazonaws.com/bucket–name/1.png

また外部から閲覧するためにアクセス権限を設定した。
(以下はIPアドレスx.x.x.xに公開する場合)

{
  "Id": "Policy1505038915778",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1505038910815",
      "Action": [
        "s3:GetObject"
      ],
      "Principal": "*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket--name/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "x.x.x.x"
        }
      }
    }
  ]
}

nginxのリバースプロキシ設定

location / {
        set $s3_bucket        'bucket--name.s3.amazonaws.com';
        proxy_set_header       Host $s3_bucket;
        proxy_hide_header      x-amz-id-2;
        proxy_hide_header      x-amz-request-id;
        proxy_hide_header      Set-Cookie;
        resolver               10.0.0.2 valid=300s;
        resolver_timeout       10s;
        proxy_pass             http://$s3_bucket;
}

Static website hosting について

・有効にすると、公開用のURLが追加で作成される。(無効にすると利用できなくなる。)
http://bucket–name.s3-website-ap-northeast-1.amazonaws.com
・上記URLに限り、インデックスドキュメントとエラードキュメントやリダイレクトが動作する。
・DNSを設定することで、独自ドメイン(バケット名)も利用できる。

つまりこの機能を利用しなくても、リバースプロキシのオリジンに設定することが可能。

S3エンドポイント時の設定

バケットポリシーに以下を追加する必要がある。

{
    "Version": "2012-10-17",
    "Id": "Policy1505038915778",
    "Statement": [
        {
            "Sid": "Stmt1505038910815",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket--name/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "x.x.x.x"
                    ]
                }
            }
        },
        {
            "Sid": "Stmt1505038910816",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket--name/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": "vpce-xxxxxxx"
                }
            }
        }
    ]
}

参考

[Nginx] Nginx で S3 をリバースプロキシする
http://blog.serverworks.co.jp/tech/2016/08/22/vpc_endpoint_s3_backet-2/

S3へのバックアップ取得

s3cmd + debian8 で実現する

事前準備

S3を操作できるユーザをIAMで作成しておく
2015-10-31_202237

インストールとセットアップ

root@hostname:/home/shimizu# aptitude install s3cmd
以下の新規パッケージがインストールされます:
  python-dateutil{a} python-magic{a} s3cmd
...

root@hostname:/home/shimizu# s3cmd --configure
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key: *****
Secret Key: *****

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: *****
Path to GPG program [/usr/bin/gpg]:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]:

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name:*****

...
Configuration saved to '/root/.s3cfg'

root@hostname:/home/shimizu# s3cmd --version
s3cmd version 1.5.0-rc1

s3cmd操作

すべてはmanコマンドに

COMMANDS
 s3cmd can do several actions specified by the following commands.

 s3cmd mb s3://BUCKET
        Make bucket

 s3cmd rb s3://BUCKET
        Remove bucket

 s3cmd ls [s3://BUCKET[/PREFIX]]
        List objects or buckets

 s3cmd la
        List all object in all buckets

 s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
        Put file into bucket

 s3cmd get s3://BUCKET/OBJECT LOCAL_FILE
        Get file from bucket

 s3cmd del s3://BUCKET/OBJECT
        Delete file from bucket

 s3cmd rm s3://BUCKET/OBJECT
        Delete file from bucket (alias for del)
 s3cmd restore s3://BUCKET/OBJECT
        Restore file from Glacier storage

 s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
        Synchronize a directory tree to S3 (checks files freshness using size and md5 checksum, unless overriden bns, se e below)

 s3cmd du [s3://BUCKET[/PREFIX]]
        Disk usage by buckets

 s3cmd info s3://BUCKET[/OBJECT]
        Get various information about Buckets or Files

 s3cmd cp s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
        Copy object

 s3cmd modify s3://BUCKET1/OBJECT
        Modify object metadata

 s3cmd mv s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
        Move object

 s3cmd setacl s3://BUCKET[/OBJECT]
        Modify Access control list for Bucket or Files

 s3cmd setpolicy FILE s3://BUCKET
        Modify Bucket Policy

 s3cmd delpolicy s3://BUCKET
        Delete Bucket Policy

 s3cmd multipart s3://BUCKET [Id]
        show multipart uploads

 s3cmd abortmp s3://BUCKET/OBJECT Id
        abort a multipart upload

 s3cmd listmp s3://BUCKET/OBJECT Id
        list parts of a multipart upload

 s3cmd accesslog s3://BUCKET
        Enable/disable bucket access logging

 s3cmd sign STRING-TO-SIGN
        Sign arbitrary string using the secret key

 s3cmd signurl s3://BUCKET/OBJECT expiry_epoch
        Sign an S3 URL to provide limited public access with expiry

 s3cmd fixbucket s3://BUCKET[/PREFIX]
        Fix invalid file names in a bucket

 s3cmd expire s3://BUCKET
        Set or delete expiration rule for the bucket

 s3cmd setlifecycle s3://BUCKET
        Upload a lifecycle policy for the bucket

 s3cmd dellifecycle s3://BUCKET
        Remove a lifecycle policy for the bucket

よく使いそうなコマンドを試してみる

### bucket作成 ###
root@hostname:/home/shimizu# s3cmd mb s3://www.akat.info.bk
Bucket 's3://www.akat.info.bk/' created

### bucket表示 ###
root@hostname:/home/shimizu# s3cmd ls
2014-07-02 15:22  s3://www.akat.info

### ファイルを送る ###
root@hostname:/home/shimizu# s3cmd put test.txt s3://www.akat.info
test.txt -> s3://www.akat.info/test.txt  [1 of 1]
 25623 of 25623   100% in    0s   279.38 kB/s  done

### 確認する ###
root@hostname:/home/shimizu# s3cmd la

2015-10-31 13:59     25623   s3://www.akat.info/test.txt

### ファイルを修得する ###
root@hostname:/home/shimizu# s3cmd get s3://www.akat.info/test.txt

### 容量が大きいとリトライが何回もかかってエラー ###
root@hostname:/home/shimizu# s3cmd put 5G.file s3://www.akat.info
...
WARNING: Upload failed: /5G.file?partNumber=23&uploadId=... ([Errno 104] Connection reset by peer)
WARNING: Retrying on lower speed (throttle=0.00)
...

### 容量が大きいファイルを送る場合(--multipart-chunk-size-mbというオプションもあり) ###
root@hostname:/home/shimizu# s3cmd  --multipart-chunk-size-mb=5 put 5G.file s3://www.akat.info

### 容量算出 ###
root@hostname:/home/shimizu# s3cmd du s3://www.akat.info
5368709120   s3://www.akat.info/

### s3間でコピー(移動も可能) ###
root@hostname:/home/shimizu# s3cmd cp s3://www.akat.info/test.txt s3://www.akat.info.bk/
File s3://www.akat.info/test.txt copied to s3://www.akat.info.bk/test.txt
root@hostname:/home/shimizu# s3cmd la
2015-10-31 13:59     25623   s3://www.akat.info/test.txt

2015-10-31 14:07     25623   s3://www.akat.info.bk/test.txt

### 期限付きアクセス ###
root@hostname:/home/shimizu# s3cmd signurl s3://www.akat.info/test.txt 300
http://www.akat.info.s3.amazonaws.com/test.txt?AWSAccessKeyId=AKIAIKWXKI6T6S3VPCPA&Expires=300&Signature=5MEpFuEGrOzTgCNVDpAfsLMn02Q%3D
…URLはできたが、アクセスするとなぜかうまくいかなかった

### syncする ###
root@hostname:/home/shimizu# s3cmd sync testdir s3://www.akat.info
testdir/test -> s3://www.akat.info/testdir/test  [1 of 2]
 4 of 4   100% in    0s    43.85 B/s  done
testdir/test2 -> s3://www.akat.info/testdir/test2  [2 of 2]
 13 of 13   100% in    0s   276.01 B/s  done
Done. Uploaded 17 bytes in 0.2 seconds, 104.52 B/s.  Copied 0 files saving 0 bytes transfer.

### 完全同期する ###
root@hostname:/home/shimizu# s3cmd --delete-removed sync test3.txt s3://www.akat.info
File s3://www.akat.info/delete.txt deleted
File s3://www.akat.info/testdir/test deleted
File s3://www.akat.info/testdir/test2 deleted
test3.txt -> s3://www.akat.info/test3.txt  [1 of 1]
 0 of 0     0% in    0s     0.00 B/s  done

### restoreする ###
root@hostname:/home/shimizu# s3cmd sync s3://www.akat.info/test3.txt testdir/

参考URL

サーバのデータバックアップをAmazon S3に置く