MongoDBのインストールと認証設定 (Ubuntu18.04,MongoDB 4.2.11)

# なぜ認証設定をするのか
認証設定については[DBセキュリティの第1歩、アカウント管理と認証](https://thinkit.co.jp/story/2010/11/02/1834)を参照頂けると非常にわかりやすいと思います．

簡単に言ってしまえば，
> 重要な情報資産を保護するため

ということになります．
認証設定がなされていない場合，情報資産が他人にさらけ出されている状況で，これはセキュリティ上非常に問題がある事実となります．

また，[40,000 UnProtected MongoDB Databases Found on the Internet](https://thehackernews.com/2015/02/mongodb-database-hacking.html)という記事(2015年：日本語訳「インターネット上で発見された40,000個の保護されていないMongoDBデータベース」)では，タイトル通りですが4万個のMongoDBに認証設定がされていないと記載されています．
現在は2020年ですので，この数はさらに増加していることが考えられます．

MongoDBはデフォルトで認証設定がされないので，インストールに合わせて認証設定まで行います．

# 目次
1. MongoDBをaptを使ってインストールする
2. MongoDBの認証設定(ユーザ名とパスワードの設定)をする

# 1.MongoDBをaptを使ってインストールする

## 1.1　MongoDBのレポジトリをaptに登録する
Ubuntu 18.04 の標準リポジトリでは最新版がインストールできないので，MongoDB から提供されているリポジトリを使用します。

---
### ※※追記※※ 最新バージョンが変更しているため最新版のインストールは[公式サイト](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/)を参照してください

---


```shell
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

gpg: key 68818C72E52529D4: public key "MongoDB 4.0 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
```
これはMongoDB リポジトリで使用される GPG キーをインポートしているコマンドです．
結果に**imported: 1**と表示されていればOKです．


次にリポジトリ情報を apt に追加します．

```shell
$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
```

あとは追加したレポジトリを認識されるために

```shell
$ sudo apt update
```

これでレポジトリの登録は完了です．

## MongoDBのインストール
aptコマンドでインストールを実行します．

```shell
$ sudo apt install mongodb-org
```

MongoDBを起動します．

```shell
$ sudo systemctl start mongod
```

MongoDBのステータスを確認してActive(running)となっていれば無事起動完了です．

```shell
$ systemctl status mongod
● mongod.service - MongoDB Database Server
   Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-10-28 02:49:10 UTC; 1 weeks 2 days ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 17358 (mongod)
   CGroup: /system.slice/mongod.service
           └─17358 /usr/bin/mongod --config /etc/mongod.conf
```


MongoDBのインストールはこれにて終了です．
次はMongoDBの認証設定を行います．

# ２． MongoDBの認証設定
MongoDBをインストールした直後は通常，どのユーザでもデータベースの中身を見れる状態になっています．
今後データベースを使っていく上で，データを剥き出しの状態のまま保持しておくのも怖いと思いますので，最初の段階で認証設定を行なってしまいましょう！

## 2.1 ユーザ認証を有効にする
まずはじめに設定ファイル(config)からユーザ認証の設定を有効にしましょう．（デフォルトは無効）

設定ファイルは通常，`/etc/mongod.conf`にありますので，テキストエディタで開いてください．

そして開いたら下記をそのままコピペ，もしくは設定ファイルにこの記載があれば以下のように変更してください．

```shell
$ sudo vim /etc/mongod.conf
```
（私はvimを使っていますが好きなテキストエディタで大丈夫です）

```shell
security:
  authorization: enabled
```

## 2.2 スーパーユーザー(admin)の設定
まず設定ファイルを変更していますのでmongodを再起動します．

```shell
$ sudo systemctl restart mongod
```

スーパーユーザーとはLinuxのrootのような認識で問題ないです．
admin/管理者というような認識でもOKです．
※ちなみに**sudo**は**スーパーユーザーdo**です．このスーパーユーザと同じ意味合いです．

MongoDBは決まったユーザーIDはありませんので、スーパーユーザーは何によってきまるかというとそれはロールになります．
ここではロールとしてビルトインされているrootを使います．

```shell
$ mongo
> use admin
switched to db admin
> db.createUser({user:"mongo"(※任意), pwd:"password"(※要変更), roles:["root"]})
Successfully added user: { "user" : "userName", "roles" : [ "root" ] }
```

usersとpwdは任意で大丈夫です．
これでユーザ名とパスワードの設定は完了です．
一度MongoDBを抜けてユーザ名/パスワードを指定入ってみます．

MongoDBを抜ける際

```shell
> exit
bye
```

## 2.3 ユーザ名とパスワードを指定してMongoDBへ接続
上記ではユーザ名を**userName**
パスワードを**password**
と指定したので，接続時は以下のようになります．

```shell
$ mongo -u userName(ユーザ名)
MongoDB shell version v4.2.10
Enter password: 
```

無事に認証ができれば以下のようになります．

```shell
$ mongo -u mongo
MongoDB shell version v4.2.10
Enter password: 


connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("xxxxxxxxxxxxxxxxxxxxxxxxx") }
MongoDB server version: 4.2.10
Server has startup warnings: 
2020-10-28T02:49:10.604+0000 I  STORAGE  [initandlisten] 
2020-10-28T02:49:10.604+0000 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-10-28T02:49:10.604+0000 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
---
Enable MongoDBs free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> 

```

試しに，プロンプトで以下のコマンドを入力してみてください．

```shell
> show dbs
admin          0.000GB
app            0.001GB
auth           0.001GB
config         0.000GB
demo           0.000GB
events         0.000GB
hosting        0.000GB
local          0.000GB
log            0.004GB
```

このようにデータベースが表示されれば問題なく認証ができている証拠です．

なお，ユーザ名を指定せずにMongoDBに接続すると以下のようになります．

```shell
$ mongo
MongoDB shell version v4.2.10
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("xxxxxxxxxxxxxxxxxxxxxx") }
MongoDB server version: 4.2.10
> show dbs
>
```

認証がされていないとデータベースの表示がそもそも表示されなくなりますのでお気をつけください．


# おわりに
ということで今回はMongoDBのインストールから，認証設定までをだらだらと書いていきました．
もうこれは私の備忘録ですね．読みにくくてすいません．
今度はPHPからMongoDBへの接続方法でも書こうと思います．

# 参考にさせて頂いたサイト
- https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=3370
- https://qiita.com/h6591/items/68a1ec445391be451d0d