데이터베이스

MariaDB

설치

  1. 서버 이름 확인

    hostname
    hostname -f
    
  2. 시스템 업데이트

    sudo yum update
    
  3. 마리아 디비 설치

    sudo yum install mariadb-server
    
  4. 부팅시 마리아디비 실행

    sudo systemctl enable mariadb
    
  5. 마리아디비 시작

    sudo systemctl start mariadb
    

마리아디비 공고히 하기

마리아디비를 안전하게 관리하기 위해서는 루트 암호를 변경해야 하고 익명 사용자 접속 차단, 로컬호스트를 제외한 루트 접속 차단, 테스트 디비 제거 등의 처리를 해야 한다. 다음 실행으로 설정 가능하다.

sudo mysql_secure_installation

다음과 같은 메시지가 나온다. 루트 암호를 설정하는 부분만 제외하고 계속 엔터(기본설정값)만 누르면 된다.

$ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

마리아디비 사용하기

루트 로그인

  1. 루트로 로그인하기 위해서는 다음과 같이 한다.

    $  mysql -u root -p
    
  2. mysql_secure_installation 설정할 때 입력했던 루트 암호를 입력하면 다음과 같은 프롬프트가 뜬다.

    $ MariaDB [(none)]>
    
  3. 명령어 도움말을 원하면 프롬프트에서 \h를 입력하면 다음과 같이 나온다.

    $ MariaDB [(none)]> \h
    
     General information about MariaDB can be found at
     http://mariadb.org
    
     List of all MySQL commands:
     Note that all text commands must be first on line and end with ';'
     ?         (\?) Synonym for `help'.
     clear     (\c) Clear the current input statement.
     connect   (\r) Reconnect to the server. Optional arguments are db and host.
     delimiter (\d) Set statement delimiter.
     edit      (\e) Edit command with $EDITOR.
     ego       (\G) Send command to mysql server, display result vertically.
     exit      (\q) Exit mysql. Same as quit.
     go        (\g) Send command to mysql server.
     help      (\h) Display this help.
     nopager   (\n) Disable pager, print to stdout.
     notee     (\t) Don't write into outfile.
     pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
     print     (\p) Print current command.
     prompt    (\R) Change your mysql prompt.
     quit      (\q) Quit mysql.
     rehash    (\#) Rebuild completion hash.
     source    (\.) Execute an SQL script file. Takes a file name as an argument.
     status    (\s) Get status information from the server.
     system    (\!) Execute a system shell command.
     tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
     use       (\u) Use another database. Takes database name as argument.
     charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
     warnings  (\W) Show warnings after every statement.
     nowarning (\w) Don't show warnings after every statement.
    
     For server side help, type 'help contents'
    

새로운 디비 사용자 및 데이터베이스 만들기

아래에서 디비 이름이 testdb이고 새로운 디비 사용자 계정을 testuser라고 하자.

  1. 다음과 같이 새로운 디비 testdb를 만들자.

    > create database testdb;
    

    그러면 다음과 같이 표시된다.

    MariaDB [(none)]> create database testdb;
    Query OK, 1 row affected (0.00 sec)
    
  2. 새로운 사용자 testuser를 만들면서 암호를 password라고 지정하자.

    > create user 'testuser'@localhost identified by 'password';
    
  3. testuser에게 testdb 사용권한을 설정하자.

    > grant all on testdb.* to 'testuser';
    

    이것은 testuser에게 디비 testdb의 모든 권한을 준다는 의미이다. 어떤 권한이 주어졌는지는 다음과 같이 알아본다.

    > select * from information_schema.schema_privileges;
    
  4. 마리아디비를 종료하기 위해서는 \q 또는 exit를 입력한다.

    > exit
    

테이블 만들기

  1. testuser로 로그인 한다.

    mysql -u testuser -p
    
  2. 새로운 테이블 customers를 만든다.

    use testdb;
    create table customers (customer_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name TEXT, last_name TEXT);
    
  3. 만들어진 테이블을 확인한다.

    show tables;
    
  4. 테이블 스키마를 확인한다.

    describe customers;
    

마리아디비 루트 암호 재설정

루트 암호를 잊어버렸을 경우 재설정을 할 수 있다.

  1. 마리아디비를 멈추고 암호를 묻지 않고 재시작을 하도록 선택 인자를 건넨다.

    sudo systemctl stop mariadb
    sudo mysqld_safe --skip-grant-tables &
    
  2. 마리아디비에 접속을 한다. 암호를 물어보지 않는 걸 알 수 있다.

    mysql -u root
    
  3. 다음과 같이 암호를 password로 설정을 한다. 실제로는 강력한 암호로 대체해야 한다.

    use mysql;
    UPDATE USER SET PASSWORD=PASSWORD('password') WHERE USER='root';
    flush privileges;
    exit
    
  4. mysqld_safe를 끝내기 위해서는 mysqladmin를 사용한다.

    mysqladmin -u root -p shutdown
    
  5. mariadb를 다시 실행한다.

    sudo systemctl start mariadb
    

Mongo DB

설치하기

  1. yum이 설치할 수 있는 장소를 설정한다.

    $ cd /etc/yum.repos.d
    $ sudo vi mongodb-org.repo
    

    mongodb-org.repo 파일 안에 다음 내용을 입력한다.

    [mongodb-org-3.6]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
    
  2. yum 저장소가 제대로 설정되었는지 확인한다. 출력 결과에 mongodb-org-3.6이 포함되어 있는 것을 확인한다.

    $ yum repolist
    
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: ftp.kaist.ac.kr
     * epel: mirror.dmmlabs.jp
     * extras: ftp.iij.ad.jp
     * ius: ftp.upcnet.ro
     * updates: www.ftp.ne.jp
    repo id           repo name                                               status
    base/7/x86_64     CentOS-7 - Base                                          9,911
    epel/x86_64       Extra Packages for Enterprise Linux 7 - x86_64          12,581
    extras/7/x86_64   CentOS-7 - Extras                                          305
    ius/x86_64        IUS Community Packages for Enterprise Linux 7 - x86_64     487
    mcepl-vim8/x86_64 Copr repo for vim8 owned by mcepl                           18
    mongodb-org-3.6/7 MongoDB Repository                                          30
    updates/7/x86_64  CentOS-7 - Updates                                         654
    repolist: 23,986
    
  3. 다음과 같이 설치한다.

    $ sudo yum install mongodb-org
    

    다운로드가 끝나고 설치하기 전에 몽고디비 패키지 설치를 허가할 것인가와 GPG 키를 설치할 것인지를 묻는 질문 Is this ok [y/N]:가 두 번 나오는데 모두 y를 누르면 된다.

  4. 만일 yum 업데이트할 때 자동으로 mongodb가 업데이트되는 것을 방지하려고 하면 다음과 같이 /etc/yum.conf 파일 안에 다음을 추가한다.

    exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools
    
  5. 몽고디비 시작시 디비 접근 권한에 대한 보안 설정을 한다. /etc/mongod.conf 파일 안에 다음을 입력한다.

    security:
      authorization: enabled
    
  6. 몽고디비를 시작한다.

    $ sudo systemctl start mongod
    
  7. 부팅시 자동으로 시작하게 한다.

    $ sudo systemctl enable mongod
    

관리자 계정 만들기

몽고 디비를 설치하고 가장 먼저 해야할 일은 관리자 계정을 만드는 것이다. 관리자 계정이란 몽고 디비 사용자를 생성하고 관리할 수 있는 계정을 의미한다.

  1. 몽고 쉘을 이용한다. 다음은 /etc/mongod.conf 파일에 security 설정을 하지 않았을 때 나오는 메시지이다. 위에서 설정을 했다면 경고 메시지는 나오지 않는다.

    $ mongo
    MongoDB shell version v3.6.5
    connecting to: mongodb://127.0.0.1:27017
    MongoDB server version: 3.6.5
    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:
    2018-06-09T11:40:00.755+0900 I CONTROL  [initandlisten]
    2018-06-09T11:40:00.755+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
    2018-06-09T11:40:00.755+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
    2018-06-09T11:40:00.755+0900 I CONTROL  [initandlisten]
    2018-06-09T11:40:00.755+0900 I CONTROL  [initandlisten]
    2018-06-09T11:40:00.755+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
    2018-06-09T11:40:00.755+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
    2018-06-09T11:40:00.756+0900 I CONTROL  [initandlisten]
    2018-06-09T11:40:00.756+0900 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
    2018-06-09T11:40:00.756+0900 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
    2018-06-09T11:40:00.756+0900 I CONTROL  [initandlisten]
    >
    
  2. 기본으로 test 디비를 사용하기 때문에 디비를 admin으로 바꾼다.

    > use admin
    
  3. 관리자 계정 이름은 mongo-admin으로 암호는 password를 넣는다. 물론 실제로는 강력한 암호로 대체해야 한다.

    > db.createUser(
        {
          user: "mongo-admin",
          pwd: "password",
          roles:[{role: "userAdminAnyDatabase", db: "admin"}]
        }
      )
    

    결과는 암호를 제외하고 다음과 같이 나온다. 암호와 관리자 계정 이름은 잘 기억해야 한다.

    Successfully added user: {
        "user" : "mongo-admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
    }
    
  4. 몽고 쉘을 나온다.

    > exit
    
  5. 제대로 설정되었는지 확인해본다.

    $ mongo -u mongo-admin -p --authenticationDatabase admin
    

    -u, -p, 와 --authenticationDatabase들은 권한 인증을 위해 필요한 옵션들이다. 만일 주어지지 않는다면 쉘 사용은 가능하나 디비와 관련된 기능들을 사용할 수 없다.

    mongo-admin 계정은 사용자 관리를 할 수 있는 계정으로 디비를 사용할 수 있는 계정은 아니다. 관리자 계정(mongo-admin)은 새로운 사용자와 사용자에 대한 디비 역할들을 설정할 수 있다. 각 디비마다 디비를 사용할 수 있는 사용자들을 설정하고 사용자의 역할을 설정한다.

  6. 몽고 쉘을 끝낸다.

    > exit
    

새로운 사용자 및 디비 만들기

  1. mongo-admin으로 접속한다.

    $ mongo -u mongo-admin -p --authenticationDatabase admin
    
  2. 새로운 디비 testdb를 만든다.

    > use testdb
    
  3. 만들어진 디비 testdb에 새로운 사용자 testuser와 암호는 password를 만들고 동시에 역할도 설정한다. 또한 아래에서 만들 exampleDB에 대한 역할도 설정을 했다.

    > db.createUser(
        {
          user: "testuser",
          pwd: "password",
          roles:[{role: "read", db: "testdb"}, {role:"readWrite", db: "exampleDB"}]
        }
      )
    
  4. 몽고 쉘을 끝낸다.

    > exit
    

다음과 같이 디비 관리자를 만든다.

  1. mongo 쉘로 접속한다.

    > mongo
    
  2. db.auth("사용자관리자", "사용자관리자암호")를 이용해서 admin 디비를 접속한다.

    > use admin
    > db.auth("mongo-admin", "password")
    
  3. 모든 디비, 사용자, 읽고 쓰기 권한을 갖는 디비 관리자를 만든다.

    > db.createUser(
        {
          user: "dbadmin",
          pwd: "password",
          roles:["userAdminAnyDatabase",
                 "dbAdminAnyDatabase",
                 "readWriteAnyDatabase"
                ]
        }
      )
    

데이터와 컬렉션 다루기

  1. testuser 계정으로 testdb를 연다.

    $ mongo -u testuser -p --authenticationDatabase testdb
    
  2. 새로운 디비 exampleDB를 생성한다.

    > use exampleDB
    

    exampleDB는 앞에서 읽기, 쓰기 역할이 설정되어 있어야 한다.

  3. 새로운 컬렉션 exampleCollection을 생성한다.

    > db.createCollection('exampleCollection', {capped: false})
    
  4. 디비에 삽입할 데이터를 만든다.

    > var a = {name: "Kilsung Hong", attributes: {age: 30, address: "Anam Sungbuk Seoul, Korea", phone: 1234567890}};
    > var b = {name: "Kildong Kim", attributes: {age: 35, address: "Chochiwon Sejong, Korea", phone: 1234567891}};
    

    변수 a, b를 만들지 않고 직접 객체 상태로 입력해도 되지만 자바스크립트 형식으로 되는 것을 보여주기 위함이다.

  5. 컬렉션에 자료를 삽입한다.

    > db.exampleCollection.insert(a)
    > db.exampleCollection.insert(b)
    
  6. 컬렉션 리스트는 다음과 같이 확인한다.

    > show collections
    
  7. 컬렉션에 있는 내용을 보려면 find() 메소드를 이용한다.

    > db.exampleCollection.find()
    

    다음과 같이 필드 이름과 검색 단어를 입력해서 찾을 수 있다.

    > db.exampleCollection.find({"name": "Kildong Kim"})
    

    또는 정규표현식을 이용해서도 검색할 수 있다.

    > db.exampleCollection.find({"name": /ng/})
    

몽고디비 사용하기

몽고 디비 자세한 사용법은 웹페이지를 참조한다.

  1. 도움말

    > help
    
  2. 현재 사용하고 있는 디비를 알고 싶으면 db라고 입력한다.

    > db
    

    기본 디비는 test 이다.

  3. 다른 디비들을 알고 싶으면 show dbs라고 입력한다.

    > show dbs
    

디비 사용자 열거

현재 사용되고 있는 디비의 사용자들을 열거한다.

> db.getUsers()
> show users

전체 사용자들에 대해서 열거하려면 admin 디비에 system.users 컬렉션을 사용하여 다음과 같이 한다.

> use admin
> db.system.users.find().pretty()

물론 다음과 같이 admin으로 인증을 한 후에 사용해야 한다.

> use admin
> db.auth("mongo-admin", "암호입력")

디비에 사용자 역할 추가

먼저 사용자를 추가할 디비를 선택하고 db.createUser 메소드를 이용해서 사용자와 역할을 추가한다.

> use work
> db.createUser({user: "testuser", pwd: "password", roles:[{role:"readWrite", db: "work"}]})
> db.getUsers()

패스워드 변경하기

  1. 사용자가 등록된 디비로 전환한다.

    > use admin
    
  2. 다음과 같이 변경한다.

    > db.changeUserPassword(username, password)
    
  3. 변경된 패스워드로 확인한다.

    > db.auth(username, password)
    

putty를 이용한 SSH 터널링

데이터베이스는 보안을 위해서 로컬 컴퓨터에서만 사용하는 것이 좋다. 따라서 원격으로 데이터베이스를 접근하기 위해서는 퓨티와 같은 프로그램을 이용해 ssh로만 접속해서 사용하는 것이 안전하다.

우선 퓨티에서 몽고 디비 서버로 터널링을 해놓고 그 터널을 이용하여 서버에 접속한다. 터널링이란 로컬 컴퓨터의 특정 포트와 서버의 SSH 포트를 대응시켜 서버의 프로세스를 로컬에서 사용하는 것처럼 하는 것을 의미한다.

putty 포트 포워딩

  1. 기존에 가상상자 접속에 사용했던 퓨티 세션을 로드한 후 세션 이름을 MongoTunnel이라 변경하여 저장한다.
  2. Connection > SSH > Tunnels를 선택한다.
  3. Source port: 27017; Destination: localhost:27017 이라고 입력한 후 Add 버튼을 누른다. Local 버튼과 Auto 버튼이 선택되어 있어야 한다.
  4. Session 항목으로 가서 저장을 누른다.

Robo 3T(Robomongo) 설치/연결

몽고 디비 서버를 접속할 수 있는 클라이언트 프로그램인 로보몽고(Robomongo) 프로그램을 다운받아 설치한다. Robo 3T를 다운받아 설치하면 된다. Robo 3T는 이전에 Robomongo로 불리웠다.

다음 설정과 연결은 앞에서 Putty를 이용해 터널링을 설정한 세션을 이용하는 것이다.

  1. Putty에서 설정한 몽고 디비 터널링 세션을 연결한다.
  2. MongoDB Connections > Create를 누른다.
  3. Connection Setting > Connection에서 Type: Direct Connection; Name: 적당한 이름; Address: localhost; port: 27017을 입력한다.
  4. Authentication 탭에서 Perform Authentication을 선택하고 Database: admin; User Name: dbadmin; Password: password를 입력한다.
  5. Test 버튼을 눌러 테스트를 해본다.
  6. 테스트가 성공하면 저장을 누른다.
  7. Connect를 눌러 몽고 디비 서버로 접속을 한다.

이 연결은 퓨티 터널링이 연결된 상태에서만 가능하다.