Merpay SRE Quiz @SRE Next 2020 解答・解説

これは何?

2020年1月25日に行われた SRE NEXT 2020 で,メルペイさんがブースで出していた SRE に関するクイズです。 正答数で景品がもらえたようです。

  • 3問以上:メルペイキーキャップ
  • 4問以上:メルペイキーキャップ+メルペイ SRE が推薦する本

メルペイ SRE が推薦する本って?

ツイートのスレッドをたどっていくと,ラインナップは以下のようでした。

名著ばかりですね。

第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:グループの属性を表示する AIXIBMUNIX 系 OS)のコマンドです。デフォルトパラメータがないので,グループを指定するか ALL を指定する必要があります。

これらのうち,ユーザーの所属グループが表示されるのは id コマンドです。

第3問 $ bash -c "echo 3 2 1 | awk '{print $1}'" の出力結果はどれか?

選択肢

  • 3
  • 3 2 1
  • error
  • 1

正解

3 2 1

解説

  • bash -c stringstringbash で実行されます。
  • echo messagemessage と改行を出力します。
  • パイプ |:コマンドの出力を次のコマンドの標準入力に渡します。ここでは,3 2 1\nawk コマンドの標準入力に渡します。
  • 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

serverfault.com

感想

骨のある問題が多いです。1,4を確実に正解して,その他をどれだけ正解できるかといった感じでしょうか。

知らなければ調べればいい話ですが,業務でよく使うコマンドなら覚えておいて手足のように使いこなせるほうが望ましいでしょう。