👻

ひとりMongoDB University 12/14 - Basic Security

2020/12/14に公開

この記録は、アドベントカレンダー形式の、MongoDB Universityの学習コースの記録、14日目になります!
ただいまコース: M103[1]を進めています。目標は12/25までにChapter1の完走!

Chapter 1: Basic Security: Part 1 (動画)

まずはATMでの現金の引き落としの流れを例に解説。

  • ATMはチャレンジを発行(その個人を特定するための質問や番号の要求)
  • ユーザは氏名やPINコードを返答
  • 認証が行われたら、次にユーザが操作したいのはなにかを確認
    • 操作内容に応じて、その操作が許可されるかをチェック

...と言った感じ。

MongoDBもこの流れは、認証と認可という2つのフェーズに別れている。

  • Authentication
    • ユーザを特定する
    • そのユーザの妥当性を検証する
  • Authorization
    • そのユーザが要求した処理を行う権限があるかどうかを検証する

Authentication

4つのタイプの認証をサポート。

  • SCRAM
    • MongoDBのデフォルトで基本の認証方式
    • mongodが認証するデフォルトで、かならずこの方式は備えている
    • チャレンジ / レスポンスは一般的にパスワードを利用
  • X.509
    • 利用可能な認証の中では、かなり複雑性が高くセキュアである

MongoDB Enterpriseでのみ利用可能なもの

  • LDAP
    • Active Directoryのようなディレクトリサービスを使う(ここでは深く扱いません!)
  • Kerberos
    • MITが開発したパワフルな認証方式!(ここでは深く扱いません!)

クラスタ間のセキュリティ

クライアント / サーバ間の認証だけでなく、MongoDBのクラスタ間でも認証がある
ハンドシェイクを利用
(ここでは深くは扱わない)

まとめ

  • クライアント認証と、クラスタ間の認証のメカニズムがあるよ!
  • より詳しいセキュリティのコースはM310を受講してね!
  • クライアント認証は、2デーズあるよ!

認証と認可はロールベース

- 各ユーザはなんらかのロールに属する

  • ロールには許可された複数の権限が紐づく

    • これは操作したいリソースに対してグループ分けされた権限を設定するのに有効
  • ロールベースの権限だと、データベースやコレクション単位で権限を分けられる

  • ユーザ単位で可能なことを分離分割できる

    • 管理者:ユーザ作成、削除
    • 開発者:データの登録、削除
      - データサイエンティスト:データの読み取りのみ

etc....

Chapter 1: Basic Security: Part 2 (動画)

次も動画!!

mongod.confの確認

security:
  authorization: enabled

この設定では、2つの意味がある。

  • ロールベースでのアクセスコントロールや認可を行うこと
  • 認可を行うということは、明示的に認証も要求するということ

認証用のユーザをどうするか?

上記の設定が有効な場合、たとえユーザがまだ作成されていなくても、接続をするクライアントは認証を求められることになる。
まずは接続用のユーザを作らないといけない。

Localhostでの例外

  • ローカル接続では、まだユーザが作成されていなくても管理上の接続ができる
  • 一度ユーザが作成されると、この例外は無効になり、その後は必ず認証が必要になる
  • 最初のユーザは管理者として作成すること
# dockerコンテナの中のmongodに接続してみる
# まだ認証の設定は無し
root@719df74a3d27:/# mongo
MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb

---
> use admin
switched to db admin
> db.stats()
{
        "db" : "admin",
        "collections" : 1,
        "views" : 0,
        "objects" : 1,
        "avgObjSize" : 59,
        "dataSize" : 59,
        "storageSize" : 20480,
        "indexes" : 1,
        "indexSize" : 20480,
        "totalSize" : 40960,
        "scaleFactor" : 1,
        "fsUsedSize" : 10142826496,
        "fsTotalSize" : 62725623808,
        "ok" : 1
}

# dbごとにユーザを設定
# 今回は adminデータベースに対し、rootという名前でroot用のロールを割り当て
# role: rootはビルトインで管理者用ロール
> db.createUser({
...   user: "root",
...   pwd: "root123",
...   roles : [ "root" ]
... })
Successfully added user: { "user" : "root", "roles" : [ "root" ] }

一度抜けてから再接続してみる。

# mongo --username root --password root123 \
    --authenticationDatabase admin
.....
---
>
  • ユーザはデータベースごとに存在する
    • adminデータベース用のユーザ Bobと、testデータベースのBobは違うよ!
  • 基本はSCRAM認証なので、管理者アカウントは強力なパスワードを用意して作成してね!

Basic Security: Part 2 (クイズ)

Problem

When should you deploy a MongoDB deployment with security enabled?
セキュリティの設定はどのタイミングで有効になりますか?

こたえ

  • 本番とか検証環境とか、環境を問わず、認証は設定しましょう!!

今日の進捗

むりせず3つ進めました。木曜くらいにはChapter 1が終われるかな?

きょうのzenn

しばし同じ方法で進めています!毎日変わる絵文字が楽しい。

脚注
  1. M103: Basic Cluster Administration のコースになります。コースを開始すると、完了までの期限は2ヶ月以内です。 ↩︎

Discussion