Merpay SRE Quiz @SRE Next 2020 解答・解説
これは何?
2020年1月25日に行われた SRE NEXT 2020 で,メルペイさんがブースで出していた SRE に関するクイズです。 正答数で景品がもらえたようです。
- 3問以上:メルペイキーキャップ
- 4問以上:メルペイキーキャップ+メルペイ SRE が推薦する本
今日は SRE NEXT に来ています!
— Mercari_Dev (@mercaridevjp) January 25, 2020
ブース出してます!
メルペイSREが考えたクイズに挑戦してみてください!#srenext pic.twitter.com/sQmndWucrP
メルペイ SRE が推薦する本って?
ツイートのスレッドをたどっていくと,ラインナップは以下のようでした。
- 『入門 監視』
- 『詳解 シェルスクリプト』
- 『Kubernetes 完全ガイド』
- 『Programming Kubernetes』
- 『パケットキャプチャの教科書』
- 『プロダクションレディ マイクロサービス』
- 『Linux カーネル Hacks』
- 『エンジニアリング組織論への招待』
- 『エンジニアのためのマネジメントキャリアパス』
名著ばかりですね。
第1問 SLO とはなんの略でしょうか?
選択肢
- Service Level Observability (サービスレベル可観測性)
- Service Level Objective (サービスレベル目標)
- System Level Observability (システムレベル可観測性)
- System Level Objective (システムレベル目標)
正解
Service Level Objective (サービスレベル目標)
解説
SRE 本の Chapter 4 - Service Level Objectives に書かれている定義は以下のとおりです。
An SLO is a service level objective: a target value or range of values for a service level that is measured by an SLI.
SLI(サービスレベル指標)の目標値または値の範囲を SLO(サービスレベル目標)といいます。
第2問 ユーザーが所属しているユーザーグループを知るためのコマンドはどれか?
選択肢
id
whoami
who
lsgroup
正解
id
解説
明示されていないですが,UNIX 系 OS のコマンドを前提としていますね。
id
:ユーザー情報を表示するコマンドで,ユーザー情報(ID,名前)とグループ情報(ID,名前)が表示されます。実行例:
foobar@darkstar:~$ id uid=1016(foobar) gid=100(users) groups=100(users)
whoami
:実行ユーザーの ID を表示するコマンドです。id -un
と等価です。who
:実行ユーザーの情報(名前,プロセス,起動時刻など)を表示するコマンドです。lsgroup
:グループの属性を表示する AIX(IBM の UNIX 系 OS)のコマンドです。デフォルトパラメータがないので,グループを指定するかALL
を指定する必要があります。
これらのうち,ユーザーの所属グループが表示されるのは id
コマンドです。
第3問 $ bash -c "echo 3 2 1 | awk '{print $1}'"
の出力結果はどれか?
選択肢
3
3 2 1
error
1
正解
3 2 1
解説
bash -c string
:string
が bash で実行されます。echo message
:message
と改行を出力します。- パイプ
|
:コマンドの出力を次のコマンドの標準入力に渡します。ここでは,3 2 1\n
をawk
コマンドの標準入力に渡します。 awk 'パターン {アクション}'
:AWK のコマンドで,入力に対してパターンにマッチしたものにアクションを適用します。パターンを省略(空パターン)すると,全パターンにマッチする扱いになります。$ bash -c "... $1 ..."
:""
で囲まれた$
は展開されます。1
という変数名は定義されていないので,$1
が展開されると空文字になります。
AWK に伝わるスクリプトは '{print }'
になり,全パターンに対してそのまま出力する挙動になります。したがって,
$ bash -c "echo 3 2 1 | awk '{print $1}'" 3 2 1
となります。
ちなみに,1番目のフィールドを表示させたい場合は,$
が展開されないように \$
とエスケープします。
$ bash -c "echo 3 2 1 | awk '{print \$1}'" 3
bash -c "..."
を噛まさなければ,シングルクォート ''
で囲まれた $
が展開されず,意図通りの挙動になります。
$ echo 3 2 1 | awk '{print $1}' 3
エスケープ・展開絡みの落とし穴を題材にした問題ですね。調べてみたら複数事例見つかり,ハマりポイントのようです。
第4問 DNS が使用するポート番号は何番ですか?
選択肢
- 22
- 53
- 80
- 443
正解
53
解説
すべて well-known ポート番号です。
第5問 Kubernetes の Deployment の Event を見られるコマンドは,以下のうちどれか?
選択肢
kubectl describe <Deployment Name>
kubectl logs -l <Deployment Label>
kubectl get deployment <Deployment Name> -o yaml
kubectl logs <Deployment Name>
正解
kubectl describe <Deployment Name>
解説
kubectl describe
:リソースの詳細な情報を出力します。Events:
セクションにイベント情報が表示されます。kubectl get events
コマンドで全リソースのイベントを表示することができます。
kubectl logs
:コンテナのログを出力します。--selector
(-l
) オプションで結果にフィルタをかけることができます。kubectl get
:リソースの基本的な情報を取得します。kubectl get deployment <Deployment Name> -o yaml
とすると,Deployment の定義を YAML 形式で出力します。
kubectl describe
コマンドの引数で Deployment の名称を指定すると,その Deployment に関連したイベントを取得できるので,kubectl describe <Deployment Name>
が正解です。
第6問 Web サイトに設定している TLS 証明書の有効期限を確認できるコマンドは以下のうちどれか?
選択肢
openssl s_client -connect www.merpay.com:443 | openssl x509 -noout -text | grep After
curl --tlsv1.2 -l https://www.merpay.com | grep Expire
wget --no-check-certificate https://www.merpay.com | grep Cert
nmap --script ssl-enum-ciphers -p 443 www.merpay.com | grep Date
正解
openssl s_client -connect www.merpay.com:443 | openssl x509 -noout -text | grep After
解説
openssl s_client -connect www.merpay.com:443 | openssl x509 -noout -text
:OpenSSL の SSL/TLS クライアントで指定されたホストに接続して証明書を取得し,x509
サブコマンドで証明書情報を取り出します。Not After :
で始まる行に有効期限が書かれるので,grep
で取り出せます。-text
オプションの代わりに-dates
オプションを指定すると,証明書の開始日と失効日だけが出力されます。
curl --tlsv1.2 -l https://www.merpay.com
:Response Body(ここでは HTML)が出力されます。TLS 証明書の情報は含まれません。wget --no-check-certificate https://www.merpay.com
:指定した URL の内容を証明書の検証をせずにダウンロードしてファイル(ここでは index.html)に保存します。標準出力にはリクエストの実行ログが吐かれますが,TLS 証明書の情報は含まれません。nmap --script ssl-enum-ciphers -p 443 www.merpay.com
:Nmap を用い,指定されたホストに対して SSL/TLS の暗号・圧縮方式を複数試行した結果を出力します。証明書の有効期限の情報は含まれません。実行例:
PORT STATE SERVICE REASON 443/tcp open https syn-ack | ssl-enum-ciphers: | TLSv1.0: | ciphers: | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A | TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A | TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A | TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A | TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C | TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C | TLS_ECDHE_ECDSA_WITH_RC4_128_SHA (secp256r1) - C | TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C | TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C | TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C | compressors: | NULL | cipher preference: server | warnings: | 64-bit block cipher 3DES vulnerable to SWEET32 attack | Broken cipher RC4 is deprecated by RFC 7465 | Ciphersuite uses MD5 for message integrity | Weak certificate signature: SHA1 | TLSv1.2: | ciphers: | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A | TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A | TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A | TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A | TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A | TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A | TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A | TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C | TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C | TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C | TLS_ECDHE_ECDSA_WITH_RC4_128_SHA (secp256r1) - C | TLS_ECDHE_RSA_WITH_RC4_128_SHA (secp256r1) - C | TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - C | TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - C | compressors: | NULL | cipher preference: server | warnings: | 64-bit block cipher 3DES vulnerable to SWEET32 attack | Broken cipher RC4 is deprecated by RFC 7465 | Ciphersuite uses MD5 for message integrity |_ least strength: C
cURL,Nmap で実現する例は以下のとおりです。
curl --tlsv1.2 -v https://www.merpay.com 2>&1 | grep expire
nmap --script ssl-cert -p 443 www.merpay.com | grep after
感想
骨のある問題が多いです。1,4を確実に正解して,その他をどれだけ正解できるかといった感じでしょうか。
知らなければ調べればいい話ですが,業務でよく使うコマンドなら覚えておいて手足のように使いこなせるほうが望ましいでしょう。