14. Ubuntu 14.04 보안 연결 설정

Ubuntu 14.04 에서 아이펀 디플로이 와 고객 서버 간 보안 연결 설정법을 설명합니다.

14.1. 디플로이 연동 API 서버 보안 연결 설정

아이펀 디플로이가 디플로이 연동 API 서버(이하 API 서버 로 표기합니다)와 안전하게 통신하려면 아래 두 가지 작업이 필요합니다.

  • HTTPS 프로토콜을 사용
  • HTTP basic auth 방식을 통해 ID와 암호를 설정

만약 API 서버가 이미 위 조건을 만족한다면 추가 작업은 필요치 않습니다.

평문 HTTP 프로토콜로 구현되어 있고, 인증을 요구하지 않는다면 아래 가이드를 따라 Nginx 를 이용해 보안 연결을 구축해야 합니다.

현재 구현체의 보안 연결 여부가 불확실하다면 다음 명령어를 통해 확인해 볼 수 있습니다.

$ wget -nv --spider --no-check-certificate \
       --http-user=<ID> \
       --http-password=<password> \
       https://<API 서버 DNS 이름 또는 IP>:<API 서버 포트/cs-api/v1

명령 결과가 아래와 같이 성공한다면, 이미 정상적으로 구현되어 있습니다. 이 절은 무시하고 넘어가실 수 있습니다.

2017-03-01 00:00:01 URL: https://<API 서버 DNS 이름>:<API 서버 포트>/cs-api/v1 200 OK

반면 아래와 같은 실패 메시지가 나타나면, SSL 보안 설정이 제대로 되지 않은 경우입니다.

OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Unable to establish SSL connection.

이런 경우 아래 명령어를 실행해서 API 서버를 평문 HTTP로 구성하였는지 확인합니다.

$ wget --spider -nv <API 서버 URL>:<API 서버 포트>/cs-api/v1

아래와 유사한 메시지를 출력하면서 성공한다면, 이하 가이드를 따라서 보안 설정을 구성할 수 있습니다. 실패한 경우에는 본 가이드를 통해 보안 구성할 수 없으며, API 서버 개발자에게 문의가 필요합니다. API 서버가 정상임에도 문제가 발생한다면 Deploy support 로 문의 메일을 보내주세요.

2017-03-30 08:39:12 URL: http://<API 서버 DNS 이름 또는 IP 주소>:<API 서버 포트>/cs-api/v1 200 OK

14.1.1. 작업 선제 조건

아래 내용을 확인해 두어야 합니다.

보안 채널 DNS 이름 또는 IP 주소, 포트 번호
디플로이 생성 및 설정 시 입력할 정보와 일치해야 합니다.
API 서버 DNS 이름 또는 IP 주소, 포트 번호
디플로이 연동 API를 평문 HTTP로 구현한 서버 정보를 확인해 두어야 합니다.
ID, password
인증 확인 용도로 사용할 ID와 password를 정해야 합니다. 디플로이 생성 또는 설정 시 지정한 것과 일치해야 합니다. password는 보안을 위해서 알파벳 대소문자, 숫자, 특수기호를 적어도 하나씩 포함한 8자 이상으로 구성해야 합니다.

Nginx 를 설치합니다.

$ sudo apt-get update
$ sudo apt-get install nginx

14.1.2. Self-Signed SSL/TLS 인증서 생성

SSL/TLS 를 사용하기 위해서는 인증서를 생성해야 합니다.

$ sudo openssl req -x509 -nodes -days 1096 -newkey rsa:4096 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

이후 질의에 대해서 적당히 기입합니다. 가급적 Common Name 은 API 서버의 FQDN(위에서 확인해둔 API 서버 DNS 이름) 로 설정합니다.

Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example, Inc.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:your_api_server.com
Email Address []:your_api_server_admin_email@your_company.com

14.1.3. 인증용 패스워드 파일 생성

Nginx 에서 ID, password를 사용한 인증을 사용하려면, 패스워드 파일 생성이 필요합니다.

$ sudo sh -c "echo -n '<ID>:' >> /etc/nginx/.htpasswd"
$ sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"

password를 물어오면 미리 정해둔 password를 입력하고 확인까지 합니다.

Password: <password 입력, 화면에는 보이지 않습니다>
Verifying - Password: <password 다시 입력, 화면에는 보이지 않습니다>

제대로 생성되었는지 확인합니다.

$ cat /etc/nginx/.htpasswd

다음과 유사한 내용이 나타나면 정상입니다.

deploy_user:$apr1$eTSAsRwA$sZ2Hk.UpVXs1ytZbmlquN.

14.1.4. Nginx 설정

Nginx 를 이용해서 HTTPS 프로토콜 및 basic auth 를 설정하고, API 서버와 연동합니다.

기본 설정 파일을 삭제합니다.

rm -f /etc/nginx/sites-enabled/default

/etc/nginx/sites-available/api 파일을 아래처럼 생성합니다.

server {
    listen <보안 채널 포트> ssl;

    server_name <보안 채널 DNS 이름>;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    location / {
        auth_basic "restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://<API 서버 DNS 이름 또는 IP>:<API 서버 포트>;
    }
}

Nginx 서버를 재시작 합니다.

$ sudo service nginx restart

14.2. 게임 로그 MongoDB 보안 연결 설정

14.2.1. Mongo DB 설치

아이펀 디플로이 에서는 MongoDB 3.4 버전을 권장합니다. MongoDB 벤더에서 Ubuntu 14.04 용 패키지 및 저장소를 직접 지원하므로 손쉽게 설치해서 사용할 수 있습니다.

Important

아래 내용은 아직 MongoDB 를 설치하지 않은 경우를 가정하였습니다.
이미 MongoDB 를 운영 중인 경우는 버전이 3.4.x 인지 확인하고, 설치 절차는 생략하세요.
$ mongod --version
db version v3.4.2
...

MongoDB 3.4 패키지 저장소를 추가합니다.

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
$ echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
$ sudo apt-get update

MongoDB 패키지를 설치합니다.

$ sudo apt-get install -y mongodb-org

Warning

Ubuntu 에서 기본으로 제공하는 이전 버전의 MongoDB 패키지와 충돌합니다. 만약 mongodb, mongodb-server, mongodb-clients 등이 설치되어 있다면 먼저 삭제해야 합니다.

$ apt-get remove mongodb mongodb-server mongodb-clients

14.2.2. MongoDB 인증 활성화

기본 설치 시 MongoDB 인증 기능은 꺼져 있으므로, 보안 채널 구성을 위해 활성화합니다.

MongoDB 에 접속해 관리자 유저를 생성합니다. 아래는 ID: admin, password: example_pass 로 생성한 예입니다. 관리자 유저를 생성한 후 MongoDB 접속 종료합니다.

$ mongo
...
> use admin
switched to db admin
> db.createUser(
  {
    user: "admin",
    pwd: "example_pass",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  });
> exit
bye
$

Warning

관리자 유저의 ID 및 password 는 MongoDB 관리자만 알아야 합니다. 아이펀 디플로이 에 제공하는 MongoDB ID, password 와는 다릅니다.

/etc/mongod.conf 파일을 수정하여 인증 기능을 활성화합니다. 아래 내용을 추가하거나, 내용대로 수정합니다.

security:
   authorization: enabled

MongoDB 를 재시작합니다.

$ sudo restart mongod

14.2.3. 로그 DB 용 유저 생성 및 권한 부여

MongoDB 관리자 계정으로 MongoDB 에 접속합니다. 아래에 예에서는 위와 동일한 관리자 ID: admin, password: example_pass 로 접속합니다.

$ mongo -u "admin" -p "globaltf" --authenticationDatabase "admin"
MongoDB shell version v3.4.2
...
>

로그가 쌓일 DB 에 아이펀 디플로이 가 사용할 유저를 생성하고, ‘read’ 권한을 부여합니다. 아래 예에서는 game_log 라는 DB 에 ID: ifun_deploy_user, password: ifun_deploy_pass 인 유저를 생성하고, ‘read’ 권한을 부여합니다.

> use game_log
switched to db game_log
> db.createUser(
... {
...    user: 'ifun_deploy_user',
...    pwd: 'ifun_deploy_pass',
...    roles: [{role: 'read', db: 'game_log'}]
... });
Successfully added user: {
  "user" : "ifun_deploy_user",
  "roles" : [
    {
      "role" : "read",
      "db" : "game_log"
    }
  ]
}
> exit
bye
$

Warning

보안상 로그 검색용 계정과 관리자 계정은 서로 다른 ID, password 로 분리 생성하는 편이 좋습니다. 이번 절차에서 생성한 ID, password, DB 는 디플로이먼트 생성 및 수정 시 입력하는 정보와 일치해야 합니다.

14.2.4. Self-Signed SSL/TLS 인증서 생성

SSL/TLS 를 사용하기 위해서 인증서를 생성합니다.

$ sudo openssl req -newkey rsa:4096 -new -x509 -days 1096 -nodes -out /etc/mongodb.crt -keyout /etc/mongodb.key

이후 질의에 대해서 적당히 기재합니다. 될 수 있으면 Common Name 은 MongoDB 서버의 FQDN(MongoDB DNS 이름)으로 설정합니다.

Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example, Inc.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:your_mongodb.com
Email Address []:your_mongodb_admin_email@your_company.com

생성한 두 파일을 합쳐서 MongoDB 가 사용하는 형식으로 변환합니다.

$ sudo sh -c "cat /etc/mongodb.key /etc/mongodb.crt > /etc/mongodb.pem"

14.2.5. MongoDB SSL/TLS 설정 활성화

SSL/TLS 을 사용하도록 MongoDB 설정 파일 /etc/mongod.conf 파일을 수정합니다. 아래 내용을 추가하거나, 아래 내용대로 수정합니다.

net:
   ssl:
       mode: requireSSL
       PEMKeyFile: /etc/mongodb.pem

MongoDB 를 재시작합니다.

$ sudo restart mongod

SSL/TLS 와 ID, password 를 이용한 보안 채널 설정을 완료하였습니다.

14.2.6. 참조