웹사이트 검색

Ubuntu 16.04에서 MongoDB를 설치하고 보호하는 방법


소개

MongoDB는 무료이며 오픈 소스인 문서 지향 데이터베이스입니다. 기존의 테이블 기반 관계형 데이터베이스 구조에 의존하지 않기 때문에 NoSQL 데이터베이스로 분류됩니다. 대신 동적 스키마가 있는 JSON과 유사한 문서를 사용합니다. 관계형 데이터베이스와 달리 MongoDB는 데이터베이스에 데이터를 추가하기 전에 미리 정의된 스키마가 필요하지 않습니다. 업데이트된 스키마로 새 데이터베이스를 설정하지 않고도 필요할 때마다 언제든지 스키마를 변경할 수 있습니다.

이 튜토리얼의 1부에서는 MongoDB 리포지토리를 사용하여 최신 버전의 MongoDB를 설치합니다. 2부에서는 인증을 활성화하여 로컬 시스템에서 보안을 유지합니다. 마지막으로 3부에서는 필요한 경우 원격 연결을 보다 안전하게 허용하는 방법을 보여줍니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • 루트가 아닌 sudo 사용자와 Ubuntu 16.04 초기 서버 설정 가이드에 따라 방화벽으로 구성된 Ubuntu 16.04 서버 1대

이것이 준비되면 따라갈 준비가 된 것입니다.

파트 1: 서버 설정

1단계 - MongoDB 저장소 추가

MongoDB는 Ubuntu 패키지 리포지토리에 이미 포함되어 있지만 공식 MongoDB 리포지토리는 최신 버전을 제공하며 소프트웨어를 설치하는 권장 방법입니다. 이 단계에서는 이 공식 저장소를 서버에 추가합니다.

Ubuntu는 GPG 키로 서명되었는지 확인하여 소프트웨어 패키지의 신뢰성을 보장하므로 먼저 공식 MongoDB 리포지토리의 키를 가져와야 합니다.

  1. sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

다음 출력은 키를 성공적으로 가져왔음을 확인합니다.

Executing: /tmp/tmp.IdwenTia0s/gpg.1.sh --keyserver
hkp://keyserver.ubuntu.com:80
--recv
0C49F3730359A14518585931BC711F9BA15703C6
gpg: requesting key A15703C6 from hkp server keyserver.ubuntu.com
gpg: key A15703C6: public key "MongoDB 3.4 Release Signing Key <packaging@mongodb.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

다음으로 apt가 패키지를 다운로드할 위치를 알 수 있도록 MongoDB 리포지토리 세부 정보를 추가합니다. MongoDB에 대한 목록 파일을 생성하려면 다음 명령을 실행하십시오.

  1. echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

마지막으로 패키지 목록을 업데이트합니다.

  1. sudo apt-get update

이제 MongoDB를 설치할 준비가 되었습니다.

2단계 - MongoDB 설치

데몬, 구성 및 초기화 스크립트, 셸, 관리 도구가 포함된 mongodb-org 메타 패키지를 서버에 설치합니다.

  1. sudo apt-get install mongodb-org

Enter 키를 누르거나 Y를 입력하여 메시지가 표시되면 계속 진행합니다. 설치가 완료되면 Mongo 데몬을 시작합니다.

  1. sudo systemctl start mongod

systemctl은 출력을 제공하지 않으므로 상태를 확인하여 서비스가 제대로 시작되었는지 확인합니다.

  1. sudo systemctl status mongod
● mongod.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-02-17 18:57:26 UTC; 17min ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 2811 (mongod)
    Tasks: 17
   Memory: 56.8M
      CPU: 7.294s
   CGroup: /system.slice/mongod.service
           └─2811 /usr/bin/mongod --quiet --config /etc/mongod.conf

종료하려면 q를 누르십시오. 이제 데몬을 수동으로 시작하고 실행 중인지 확인했으므로 부팅 시 자동으로 다시 시작되는지 확인합니다.

  1. sudo systemctl enable mongod

다음 출력은 명령이 성공했음을 확인합니다.

Output
Created symlink from /etc/systemd/system/multi-user.target.wants/mongod.service to /lib/systemd/system/mongod.service.

다음으로 데이터베이스 보안을 위한 필수 단계를 수행합니다.

2부: MongoDB 보안

초기 버전의 MongoDB는 기본적으로 데이터베이스와 상호 작용하는 데 인증이 필요하지 않았기 때문에 자동화된 익스플로잇에 취약했습니다. 모든 사용자는 데이터베이스를 생성 및 파괴할 수 있을 뿐만 아니라 기본적으로 내용을 읽고 쓸 수 있습니다. 이는 초기 버전이 기본적으로 모든 인터페이스에서 수신하도록 MongoDB 데몬을 구성했기 때문에 더욱 복잡해졌습니다. 즉, 자동화된 스크립트는 방화벽으로 보호되지 않는 MongoDB 인스턴스를 감지할 수 있었고 인증이 활성화되지 않은 경우 완전한 액세스 권한을 얻을 수 있었습니다. 몽고디비에.

데몬이 이제 127.0.0.1에 바인딩되어 Unix 소켓의 연결만 허용하기 때문에 3.x 릴리스 및 일부 패키지 관리자가 제공하는 이전 버전에서 상황이 완화되었습니다. 인터넷에 자동으로 열리지 않습니다.

그러나 인증은 여전히 기본적으로 비활성화되어 있으므로 로컬 시스템의 모든 사용자는 데이터베이스에 대한 완전한 액세스 권한을 갖습니다. 이를 보호하기 위해 관리 사용자를 생성하고 인증 및 테스트를 활성화합니다.

1단계 - 관리 사용자 추가

사용자를 추가하기 위해 Mongo 셸에 연결합니다.

  1. mongo

Mongo 셸을 사용할 때의 출력은 데이터베이스에 대한 액세스 제어가 활성화되지 않았으며 데이터 및 구성에 대한 읽기/쓰기 액세스가 제한되지 않는다고 경고합니다.

Output
MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] 2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine 2017-02-21T19:10:42.446+0000 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem 2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] 2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-02-21T19:10:42.534+0000 I CONTROL [initandlisten] >

권한 수준은 userAdminAnyDatabase 역할 할당에서 가져오므로 관리 사용자의 이름을 자유롭게 선택할 수 있습니다. 데이터베이스 admin은 자격 증명이 저장되는 위치를 지정합니다. MongoDB 보안 인증 섹션에서 인증에 대해 자세히 알아볼 수 있습니다.

선택한 사용자 이름을 설정하고 자신의 보안 암호를 선택하고 아래 명령에서 대체하십시오.

  1. use admin
  2. db.createUser(
  3. {
  4. user: "AdminSammy",
  5. pwd: "AdminSammy'sSecurePassword",
  6. roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  7. }
  8. )

db.createUser 명령을 실행할 때 쉘은 명령이 완료될 때까지 각 줄 앞에 세 개의 점을 추가합니다. 그런 다음 사용자가 추가되면 다음과 같은 피드백을 받아야 합니다.

Output
> use admin switched to db admin > db.createUser( ... { ... user: "AdminSammy", ... pwd: "AdminSammy'sSecurePassword", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... ) Successfully added user: { "user" : "AdminSammy", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }

'exit'를 입력하고 ENTER를 누르거나 CTRL+C를 사용하여 클라이언트를 종료합니다.

이 시점에서 사용자는 자격 증명을 입력할 수 있지만 인증을 활성화하고 MongoDB 데몬을 다시 시작할 때까지는 자격 증명을 입력할 필요가 없습니다.

2단계 - 인증 활성화

인증은 mongod.conf 파일에서 활성화됩니다. 활성화하고 mongod를 다시 시작하면 사용자는 여전히 인증 없이 Mongo에 연결할 수 있지만 상호 작용하려면 사용자 이름과 암호를 제공해야 합니다.

구성 파일을 열어 보겠습니다.

  1. sudo nano /etc/mongod.conf

#security 섹션에서 스탠자를 활성화하기 위해 security 앞의 해시를 제거합니다. 그런 다음 인증 설정을 추가합니다. 완료되면 라인은 아래 발췌문과 같아야 합니다.

 . . .
security:
  authorization: "enabled"
 . . . 

"security\ 행은 시작 부분에 공백이 없으며 "authorization\ 행은 두 개의 공백으로 들여쓰기해야 합니다.

파일을 저장하고 종료하면 데몬을 다시 시작합니다.

  1. sudo systemctl restart mongod

구성에 오류가 있으면 dameon이 시작되지 않습니다. systemctl은 출력을 제공하지 않으므로 status 옵션을 사용하여 다음을 확인합니다.

  1. sudo systemctl status mongod

출력에 Active: active (running)가 표시되고 아래 텍스트와 같이 끝나면 restart 명령이 성공한 것입니다.

Output
Jan 23 19:15:42 MongoHost systemd[1]: Started High-performance, schema-free document-oriented database.

데몬이 작동하는지 확인했으면 인증을 테스트해 보겠습니다.

3단계 - 인증되지 않은 사용자가 제한되었는지 확인

먼저 자격 증명 없이 연결하여 작업이 제한되어 있는지 확인합니다.

  1. mongo

이제 인증을 활성화했으므로 이전의 모든 경고가 해결되었습니다.

Output
MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2

우리는 test 데이터베이스에 연결되어 있습니다. show dbs 명령으로 액세스가 제한되는지 테스트합니다.

  1. show dbs
Output
2017-02-21T19:20:42.919+0000 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13, "codeName" : "Unauthorized" . . .

인증 없이는 사용자 또는 유사한 권한이 부여된 작업을 생성할 수 없습니다.

계속 진행하려면 셸을 종료해 보겠습니다.

  1. exit

다음으로 관리 사용자에게 액세스 권한이 있는지 확인합니다.

4단계 - 관리 사용자의 액세스 확인

사용자 이름을 제공하는 -u 옵션과 암호를 묻는 -p 옵션을 사용하여 관리자로 연결합니다. 또한 --authenticationDatabase 옵션을 사용하여 사용자의 인증 자격 증명을 저장한 데이터베이스를 제공해야 합니다.

  1. mongo -u AdminSammy -p --authenticationDatabase admin

암호를 묻는 메시지가 표시되므로 제공하십시오. 올바른 암호를 입력하면 show dbs 명령을 실행할 수 있는 셸로 이동합니다.

Output
MongoDB shell version v3.4.2 Enter password: connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2 >

액세스가 거부되는 대신 사용 가능한 데이터베이스를 확인해야 합니다.

  1. show dbs
Output
admin 0.000GB local 0.000GB

exit를 입력하거나 CTRL+C를 눌러 종료합니다.

사용자 및 역할에 대한 자세한 내용은 MongoDB 설명서를 참조하십시오.

3부: 원격 액세스 구성(선택 사항)

원격 연결을 허용하는 설치 작업을 시작하기 전에 이상적으로는 MongoDB가 외부 방화벽 뒤에 있거나 VPN(가상 사설망)으로 보호되거나 배스천 호스트를 통해 제한됩니다. 그러나 이를 위해 노력하면서 데이터베이스 서버에서 방화벽을 활성화하고 이를 필요로 하는 특정 호스트에 대한 액세스를 제한하는 다소 덜 복잡한 단계를 수행할 수 있습니다.

1단계 - UFW 활성화

Ubuntu 16.04 필수 구성 요소를 사용한 초기 서버 설정에서 UFW를 활성화하고 SSH 연결만 허용했습니다. 클라이언트 시스템의 포트를 열기 전에 UFW의 상태를 확인합시다.

  1. sudo ufw status

참고: 출력에 방화벽이 비활성이라고 표시되면 다음을 사용하여 활성화하십시오.

  1. sudo ufw enable

활성화되면 status 명령인 sudo ufw status를 다시 실행하면 규칙이 표시됩니다. 필요한 경우 SSH를 허용해야 합니다.

  1. sudo ufw allow OpenSSH

<$>

전제 조건을 변경하지 않는 한 출력에는 OpenSSH만 허용된다고 표시되어야 합니다.

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

다음으로 기본 MongoDB 포트인 27017에 대한 액세스를 허용하지만 특정 호스트에 대한 액세스를 제한합니다. 기본 포트를 변경한 경우 아래 명령에서 업데이트해야 합니다.

  1. sudo ufw allow from client_ip_address to any port 27017

액세스가 필요한 각 추가 클라이언트의 IP 주소를 사용하여 이 명령을 다시 실행하십시오. 규칙을 다시 확인하기 위해 ufw status를 다시 실행합니다.

  1. sudo ufw status
Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere 27017 ALLOW client_ip_address OpenSSH (v6) ALLOW Anywhere (v6)

<$>[참고]

이 방화벽 규칙이 있으면 공용 인터페이스에서 수신 대기하도록 MongoDB를 구성할 준비가 된 것입니다.

2단계 - 공용 bindIP 구성

원격 연결을 허용하기 위해 공개적으로 라우팅 가능한 호스트의 IP 주소를 mongod.conf 파일에 추가합니다.

  1. sudo nano /etc/mongod.conf

net 스탠자에서 MongoHost의 IP를 bindIp 줄에 추가합니다.

 . . .
net:
  port: 27017
  bindIp: 127.0.0.1,IP_of_MongoHost
 . . .

파일을 저장하고 종료한 다음 데몬을 다시 시작합니다.

  1. sudo systemctl restart mongod

이전에 했던 것처럼 다시 시작이 성공했는지 확인합니다.

  1. sudo systemctl status mongod

출력에는 활성: 활성(실행 중)이 포함되어야 하며 최종 테스트를 진행할 수 있습니다. Mongo는 이제 기본 포트에서 수신 대기합니다.

3단계 - 원격 연결 테스트

mongodb.conf 파일의 IP 주소와 함께 --host 플래그를 추가하여 Mongo가 공개 인터페이스에서 수신 대기하는지 테스트합니다.

  1. mongo -u AdminSammy -p --authenticationDatabase admin --host IP_address_of_MongoHost
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://107.170.233.82:27017/
MongoDB server version: 3.4.2

프롬프트에 도달하면 데몬이 공용 IP에서 수신 대기 중임을 확인합니다. 이 시점에서 원격 연결과 MongoDB 호스트 간의 모든 트랜잭션은 암호화되지 않으므로 방화벽을 테스트하기 전에 다음 단계는 이러한 트랜잭션을 보호하는 것입니다. 이에 대한 도움말은 전송 암호화에 대한 MongoDB의 보안 문서를 참조하십시오.

결론

이 자습서에서는 사용 가능한 최신 버전의 MongoDB를 설치하고 관리 사용자를 추가하고 인증을 활성화하기 위해 패키지 목록에 MongoDB 리포지토리를 추가했습니다.

또한 원격 연결을 허용하지만 액세스가 필요한 호스트의 연결만 허용하도록 서버의 방화벽을 구성하여 MongoDB 설치 알림을 방지하도록 MongoDB를 구성하는 방법도 보여주었습니다.

다음 단계:

  • 전송 중인 데이터를 암호화하려면 전송 암호화에 대한 MongoDB의 보안 문서를 참조하십시오.
  • 이 DigitalOcean 커뮤니티 기사에서 MongoDB 사용 및 관리에 대해 자세히 알아보십시오.