kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

Firefox で「サーバが適正な中間証明書を送信しない可能性があります」という表示が出た時に見るページ

あるいは中間証明書の解説

f:id:kasei_san:20180817183111p:plain

原因

中間証明書 がサーバにupされていない

中間証明書ってなあに?

証明書3階層の中間にある証明書

ルート証明書 → **中間証明書** → サーバ証明書

証明書の証明ってどうやっているの?

上位の証明書の公開鍵で電子署名を複合することで、正しい証明書かチェックしている

電子署名 is 何?

証明書の本文のhash値を、発行局の秘密鍵で暗号化したもの

電子署名を使った証明書の証明の流れ

  1. 発行局の証明書(中間証明書)をダウンロード
  2. A.発行局の公開鍵で、電子署名を複合
    1. 証明書の本文のhash値を取得
  3. AとBが一致していることを確認

なお、中間証明書の証明のためには、最上位のルート証明書の公開鍵が必要

ついでに、ルート証明書について

予めブラウザに入っている世界で信頼できるとされている認証局の証明書

ルート証明書は自分の秘密鍵電子署名を作成している(オレオレ証明書)

中間証明書の補完について

ほとんどのブラウザでは、サーバに中間証明書が無くても、勝手になんとかしてくれる

  • 証明書のAuthority Information Access 拡張フィールドに、中間証明書のURLが書かれている
  • これを見て中間証明書を取ってきてくれるらしい

当然対応していないブラウザや、curl などではセキュリティ警告が出る

「俺の環境では動いた」系問題なので厄介

第六種オレオレ証明書

正規の証明書だが中間証明書はupされていない状態

高木浩光先生が命名

第六種オレオレ証明書

正規の認証局(中間認証局)から取得したサーバ証明書であるが、中間認証局の証明書をサーバに設置していないため、クライアントが認証パスを検証できないもの。

高木浩光先生は今後は増加してくのではないかと予測している

(ブラウザで補完してれるので、気づきづらいため)

Docker For Mac の docker build で `no space left on device` した時の対策

原因

docker for mac仮想マシン上で動いているが、その仮想ディスクの容量がいっぱいになると発生

対策

prefarence で仮想ディスクのサイズを変更する

画面上、変更できないように見えるけど、クリックしたら普通に変更できた

f:id:kasei_san:20180808104401p:plain

f:id:kasei_san:20180808104422p:plain

ただし、今回はディスクリセットで対応

f:id:kasei_san:20180808104436p:plain

余談

仮想ディスクをクリアしたら、フォーマットが Docker.qcow2 から Docker.raw に変わった

  • なお、仮想ディスクのありかは ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.raw

最近 raw フォーマットになったらしい。こっちのほうがスループットが良いらしいですよ!

円記号問題の歴史

円記号問題の歴史をまとめました

ISO/IEC 646 の誕生

元々、文字コードの国際規格 ISO/IEC 646 では 0x5C は国ごとに自由に設定してよい領域 だった

  • アメリカ(ascii) では、 0x5C をバックスラッシュ
  • 日本(JIS X 0201) では、0x5C¥

アメリカで 0x5C を特殊な用途に使う例が発生

  • MS-DOSでは、0x5C をディレクトリ区切り記号
  • C言語などでも、 0x5C をエスケープシーケンス等の制御コードに

なんでわざわざ国ごとに異なる文字を特殊な用途つかうの...

そのため、日本では 0x5C に2つの意味が...!

  • 円記号
  • ディレクトリ区切り記号やエスケープシーケンス等の制御コード

日本で SHIFT_JIS が生まれる

  • JIS X 0201 ベースなので、0x5C¥ のまま

欧州で文字コード規格 ISO/IEC 8859-1(Latin-1) が作られる

  • ¥0xA5

世界の文字コードを統一すべく、unicode が生まれた

  • U+005C は バックスラッシュ
  • ¥ は、U+00A5

windowsのunicode対応が始まる

  • SHIFT_JIS(windowsだとcp932) から、unicodeに変換するときどうしよう?
    • ¥ に2つの意味があるため、単純な変換はできない

そうだ! 💡 0x5C0xA5¥ を表示しよう💡

  • なおキーボードで ¥ を入力すると 0x5C が入力される

そして悲劇へ...

日本語版windowsで円記号を入力しても、他の環境ではバックスラッシュに見える

見た目上バックスラッシュか円記号かわからないので、コードを書く時に混乱したり予期せぬエラーが発生する

参考

srad.jp

naruse.hateblo.jp

misspell で無視したい単語をgitで管理する方法

スペルチェッカー misspell。超便利なのでみんな使いましょう

github.com

前提

misspell では、-i オプションにカンマ区切りで、スペルチェックを無視する単語を追加できる

misspell -i "hoge,fuga" .

やりたいこと

misspell のチェックを無視する単語を git で管理したい

  • スペルチェッカー的には間違いだけれど、いろんな経緯で使わざるを得ない単語とか

解決方法

  • 無視する単語を .misspell_ignore.txtに保管
  • そのファイルで -i オプションを作るスクリプトを組んだ

ファイル

.misspell_ignore.txt

hoge
fuga
  • 1行1単語(差分をわかりやすくするため)

./script/misspell.sh

#!/bin/sh
misspell -i `cat .misspell_ignore.txt | tr '\n' ','` -error .
  • .misspell_ignore.txt の中身をカンマ区切りに変換して -i オプションに渡している

これで、無視したい単語をgitで管理できる!! 🎉

CircleCIで使いたい場合

checkout してから、上記のスクリプトを実行する

  misspell:
    docker:
      - image: nickg/misspell
    steps:
      - checkout
      - run: ./script/misspell.sh

workflows:
  version: 2
  ci:
    jobs:
      - misspell

参考

kakakakakku.hatenablog.com

Dockerのディスクioがボトルネックになる原因とその対策

dockerのディスクのマウント先がループバックデバイスだと遅い

ストレージドライバがaufsだと遅い

ただし現在はデフォルトでaufsが選択されることはほぼない → Docker = AUFSという図式はもう忘れたほうがいいかもしれない、あるいはDockerとストレージドライバの話 - Qiita

Dockerのmemory, memory-reservation について

  • memory : ハードリミット。ここで指定した以上のメモリを使用しようとするとOOMKillerが走る
  • memory-reservation : ソフトリミット。ホストのメモリに余裕がある時は、これ以上使用することもある
    • 余裕が無いときは、memory_reservation 内にとどめる
    • ECSでは設定上のこの値を見て、ホストにコンテナを追加できるか判断する

AWS 認定ソリューションアーキテクト – アソシエイト (新版) 対策メモ

自分が知らなかったAWS用語のおぼえがき

Amazon Redshift

Amazonが提供するデータウェアハウス

データウェアハウス(DWH)とは、意思決定のために、基幹系などの複数システムから、必要なデータを収集し、目的別に再構成して時系列に蓄積した統合データベースで、データ分析や意思決定に役立てます。

Redshift 拡張VPCルーティング

VPCエンドポイントやゲートウェイと接続したい場合に設定する必要がある

Amazon Glacier

アーカイブに最適な低コストのオブジェクトストレージ

  • 耐久性 99.999999999%

アーカイブの取り出しオプション

  • 迅速 : 250 MB 以下のアーカイブ 1〜5 分以内で取得可能
  • 標準 : デフォルト。 3〜5 時間で取得可能
  • 大容量 : 5〜12 時間で取得可能。安い

Vault Lock

ロックを掛けて、以降そのデータの編集を不可能にする仕組み。 コンプライアンス目標を達成しやすくなります とのこと

Amazon S3

PUTできるファイルのサイズ制限は5G

アクセス制限

  • バケットポリシー : IAM、バケット単位で制限
  • アクセス・コントロール・リスト(ACL): AWSアカウント単位で、バケット/オブジェクトのread/writeを制限できる
    • 削除権限の制御はない
  • IAM ポリシー: S3へのAPIアクセスを制限

S3 MFA Delete

オプションでオブジェクトの削除にMFAデバイスによる二段階認証をできるようにする

オプションで有効な機能

  • オブジェクトの暗号化
  • アクセスログの取得
  • オブジェクトのバージョニング

暗号化

KMSを使って、いろいろな方法で暗号化できる

高速化のベストプラクティス

ファイル名の先頭にランダムな文字列を入れると、格納先のパーテーションが分散して、速度が上がる

  • S3はオブジェクトをキー名毎にアルファベット順に、複数のパーテーションに格納している
  • タイムスタンプやアルファベット順のキーを大量に作成すると、特定のパーテーションにアクセスが集中して、速度が低下する

リクエスト率およびリクエストパフォーマンスに関する留意事項 - Amazon Simple Storage Service

古いノウハウになってしまったが、テストではそのままなので残す...

Amazon EBS

AWS KMSを使って、ディスクの暗号化ができる

ボリュームの種類

汎用SSD

価格と性能のバランスが良い

  • 容量: 1G〜16T
  • 最大IOPS: 10,000

プロビジョンドIOPS SSD

スループット&高価

  • 容量: 4G〜16T
  • 最大IOPS: 32,000

スループット最適化HDD

低コスト&低性能 ブートボリュームにはできない

  • 容量: 500G〜16T
  • 最大IOPS 500

スループット最適化HDD

ブートボリュームにはできない

さらに低コスト&低性能

  • 容量: 500G〜16T
  • 最大IOPS 250

Amazon EBS ボリュームの種類 - Amazon Elastic Compute Cloud

Amazon EFS

EC2インスタンスに紐づけできるファイルストレージサービス

Amazon EFSを使ってみた(前編) - 株式会社ネディア

Amazon ECS

タスクのIAMロール

タスクにIAMロールを紐づけることができる

異なるユーザのタスクを1つのクラスタで実行しても、権限のないコンテナやサービスへの接続を制御することができる

AmazonCloudFront

Amazon CloudFront は、静的および動的なウェブコンテンツ (.html、.css、.js、イメージファイルなど) をユーザーに高速に配信するウェブサービスです。

キャッシュを破棄するのに10分ほどかかるので、リアルタイム性が求められるデータには向かない

AWS CodeBuild

CIサービス

AWS CodeDeploy

EC2などのAWSサービスへの自動デプロイサービス

AWS Cloud​Formation

クラウド環境内のすべてのリソースを記述してプロビジョニングするためのツール

  • terraformとよく比較される

AWS STS

AWS Security Token Service

AWS リソースへのアクセスを制御できる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。

一時的なIAMを作るようなサービス

Amazon SQS

メッセージキューサービス

Amazon SNS

プッシュサービス、SMSやメールやアプリへのpushができる

Amazon Kinesis

大規模なストリーミングデータを処理するサービス

EC2で直接受けたり、SQSで受けるよりも安く、スケールするらしい

Amazon EMR(Elastic MapReduce)

分散処理基盤

ETL(雑多な情報をデータウェアハウスにまとめる処理)向け

EC2でClusterを作ってくれる(インスタンスタイプと台数を指定できる

Map Reduce とかの分散コンピューティング用の実装が必要

AWS Batch

EMR と違って、分散コンピューティング用の処理は不要

Amazon Aurora

MySQLPostgreSQL と互換性のあるリレーショナルデータベース

  • 最大テーブルサイズは64TiB
  • RDSのテーブルのファイルサイズは最大16TiB

[Amazon RDS]

ポイントインタイムリカバリ

自動バックアップからの復帰のこと

サポートエンジン

PostgreSQLMySQLMariaDBOracleMicrosoft SQL Server

  • DB2は未サポート

AWS Direct Connect

  • インターネットVPN: 安い、遅い、即時に設定可能
  • 専用線: 高い、速い、設置に数週間

Amazon Kinesis

データストリームの処理基板

  • 最大ファイルサイズが1GiB

EC2関係

EBS BackedインスタンスインスタンスストアBackedインスタンス

スポットインスタンス

AWSで余剰したインスタンスを格安で利用できるが、確実に取得できるとは限らないので 問題の用途によっては不適なインスタンスタイプ

料金設定が上限を超えたり、そもそもインスタンスがなくなった時等に強制終了される

  • 2017年までは、1時間以内に強制終了された場合は無料だった。現在は秒課金

Cloud Watch 関係

Amazon EC2 メトリクス

標準メトリクスは以下のとおり

  • CPU クレジット利用数(CPUCreditUsage)
  • CPU クレジット累積数(COUCreditBalance)
  • CPU 利用率(CPUUtilication)
  • 1秒あたりの Disk 読み込み回数(DiskReadOps)
  • 1秒あたりの Disk 書き込み回数(DiskWriteOps)
  • インスタンスストレージの読み取りバイト数(DiskReadBytes)
  • インスタンスストレージの書き込みバイト数(DiskWriteBytes)
  • 受信したバイト数(NetworkIn)
  • 送信したバイト数(networkOut)
  • OS・インフラストラクチャステータスチェックの成功・失敗(StatusCheckFailed)
  • OSステータスチェックの成功・失敗(StatusCheckFailedInstance)
  • インフラステータスチェックの成功・失敗(StatusCheckFailedSystem)

基本モニタリング

無料

ステータスチェック系は1分間隔 他は5分間隔

詳細モニタリング

有料

全て1分間隔でモニタリングできる

Auto Scaling グループ

  • クールダウンタイム: インスタンスが起動してから準備完了になるまでの時間を指定できる
  • 終了ポリシー: 最初に終了するインスタンスを指定できる、作成日が古い/新しいなど

ロードバランシング関係

ELBはマルチリージョン不可

Weighted Round Robin (WRR

Route53の機能。マルチリージョンでロードバランシングするならこっち

設定した割合でラウンドロビンされる

ネットワークACL関係

ネットワークACLとセキュリティグループの違い

ネットワークACL

セキュリティグループ

AWSのネットワークACLとセキュリティグループの違い - プログラマでありたい

0.0.0.0/0 の意味

ワイルドカード

一時ポート(エフェメラルポート)

TCP/IPにて、通信の帰りに特定範囲のポートを使用する ネットワークACLでは、エフェメラルポートのイン/アウトバウンドを許可する必要がある

ネットワーク ACL - Amazon Virtual Private Cloud

VPC関係

VPCエンドポイント

プライベートサブネットから、インターネットを経由せずにS3やRedshiftにアクセスする仕組み

VPCルートテーブルで、S3やRedshiftへアクセスするときのIPアドレスを、VPCエンドポイントに設定する

インターネットを経由しない分、よりセキュアにS3やRedshiftにアクセスできる

プライベート、パブリックサブネット

サブネットのトラフィックがインターネットゲートウェイにルーティングされる場合、そのサブネットはパブリックサブネットと呼ばれます。

インターネットゲートウェイへのルートがないサブネットは、プライベートサブネットと呼ばれます

NATゲートウェイ

プライベートサブネット内のインスタンスから、インターネットに接続するためのゲートウェイ

逆にインターネットからは、プライベートサブネットに接続できない

インターネット側へのトラフィックはNATのIPアドレスになる

インターネットゲートウェイと、NATゲートウェイの違い

NATゲートウェイは、プライベートサブネットとインターネットゲートウェイの仲介をするゲートウェイ

ルートテーブル

コンピュータネットワークにおけるルーティングテーブルとは、ルーターやネットワーク接続されたコンピュータが持つ、個々のネットワークの宛先への経路の一覧を保持しているテーブル状のデータ構造である。