Docker ์›น์•ฑ์šฉ SSL ์ธ์ฆ์„œ

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Docker์—์„œ ์‹คํ–‰๋˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ SSL ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์˜ ๋Ÿฌ์‹œ์•„์–ด ๋ถ€๋ถ„์—์„œ๋Š” ๊ทธ๋Ÿฌํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Docker ์›น์•ฑ์šฉ SSL ์ธ์ฆ์„œ

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ปท ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 ๋ฐ ์ˆœ์ˆ˜ Let'sEncrypt ํŒŒ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Docker์— ํ”„๋กœ๋•์…˜์„ ๋ฐฐํฌํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Docker ๊ตฌ์ถ•์„ ์‹œ์ž‘ํ•˜๋ฉด ์ค‘๋‹จํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋จผ์ € ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ํ‘œ์ค€ ์„ค์ •์„ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํฌํŠธ 443 ๋ฐ SSL์ด ์—†๋Š” ๊ฒฝ์šฐ:

docker-compose.yml

version: '2'
services:
    php:
        build: ./php-fpm
        volumes:
            - ./StomUp:/var/www/StomUp
            - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
        depends_on:
            - mysql
        container_name: "StomPHP"
    web:
        image: nginx:latest
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./StomUp:/var/www/StomUp
            - ./nginx/main.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            - php
    mysql:
        image: mysql:5.7
        command: mysqld --sql_mode=""
        environment:
            MYSQL_ROOT_PASSWORD: xxx
        ports:
            - "3333:3306"

nginx/main.conf

 server {
    listen 80;
    server_name *.stomup.ru stomup.ru;
   root /var/www/StomUp/public;
     client_max_body_size 5M;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
  }

    location ~ ^/index.php(/|$) {
      #fastcgi_pass unix:/var/run/php7.2-fpm.sock;
       fastcgi_pass php:9000;
       fastcgi_split_path_info ^(.+.php)(/.*)$;
      include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
       fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_buffer_size 128k;
       fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
       internal;
    }

    location ~ .php$ {
        return 404;
    }

     error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}

๋‹ค์Œ์œผ๋กœ ์‹ค์ œ๋กœ SSL์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ ์ปด์กด ๊ณต๋ถ€ํ•˜๋Š”๋ฐ 2์‹œ๊ฐ„ ์ •๋„ ๊ฑธ๋ ธ์–ด์š”. ๊ฑฐ๊ธฐ์— ์ œ๊ณต๋˜๋Š” ๋ชจ๋“  ์˜ต์…˜์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๋‹จ๊ณ„์—์„œ๋Š” ์šฐ๋ฆฌ(๊ธฐ์—…)๊ฐ€ ์‹ ์†ํ•˜๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๋‚˜์‚ฌ๋ฅผ ์กฐ์—ฌ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. SSL Let'sEnctypt ะบ Nginx์— ์ปจํ…Œ์ด๋„ˆ ๊ทธ ์ด์ƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์šฐ์„  ์„œ๋ฒ„์— ์„ค์น˜ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. certbot
sudo apt-get install certbot

๋‹ค์Œ์œผ๋กœ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์™€์ผ๋“œ์นด๋“œ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns


์‹คํ–‰ ํ›„ certbot์€ DNS ์„ค์ •์— ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” 2๊ฐœ์˜ TXT ๋ ˆ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

_acme-challenge.stomup.ru TXT {ั‚ะพั‚ะšะปัŽั‡ะšะพั‚ะพั€ั‹ะนะ’ะฐะผะ’ั‹ะดะฐะปCertBot}


๊ทธ๋ฆฌ๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด์„ธ์š”.

๊ทธ ํ›„, certbot์€ DNS์— ์ด๋Ÿฌํ•œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ธ์ฆ์„œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ certbot ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. 5~10๋ถ„ ํ›„์— ๋ช…๋ น์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด ๋ณด์„ธ์š”..

์ž, ์—ฌ๊ธฐ ์šฐ๋ฆฌ๋Š” 90์ผ ๋™์•ˆ Let'sEncrypt ์ธ์ฆ์„œ์˜ ์ž๋ž‘์Šค๋Ÿฌ์šด ์†Œ์œ ์ž์ด์ง€๋งŒ ์ด์ œ ์ด๋ฅผ Docker์— ์—…๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ docker-compose.yml์˜ nginx ์„น์…˜์—์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

SSL์„ ์‚ฌ์šฉํ•œ docker-compose.yml ์˜ˆ

version: '2'
services:
    php:
        build: ./php-fpm
        volumes:
            - ./StomUp:/var/www/StomUp
            - /etc/letsencrypt/live/stomup.ru/:/etc/letsencrypt/live/stomup.ru/
            - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
        depends_on:
            - mysql
        container_name: "StomPHP"
    web:
        image: nginx:latest
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./StomUp:/var/www/StomUp
            - /etc/letsencrypt/:/etc/letsencrypt/
            - ./nginx/main.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            - php
    mysql:
        image: mysql:5.7
        command: mysqld --sql_mode=""
        environment:
            MYSQL_ROOT_PASSWORD: xxx
        ports:
            - "3333:3306"

์—ฐ๊ฒฐ๋˜์—ˆ๋‚˜์š”? ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Nginx์— ํ•จ๊ป˜ ์ผํ•˜๋‹ค 443 ํ•ญ๊ตฌ์™€ SSL ์ผ๋ฐ˜์ ์œผ๋กœ:

SSL์„ ์‚ฌ์šฉํ•œ main.conf ๊ตฌ์„ฑ ์˜ˆ

#
server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;

	server_name *.stomup.ru stomup.ru;
	set $base /var/www/StomUp;
	root $base/public;

	# SSL
	ssl_certificate /etc/letsencrypt/live/stomup.ru/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/stomup.ru/privkey.pem;
	ssl_trusted_certificate /etc/letsencrypt/live/stomup.ru/chain.pem;

      client_max_body_size 5M;

      location / {
          # try to serve file directly, fallback to index.php
          try_files $uri /index.php$is_args$args;
      }

      location ~ ^/index.php(/|$) {
          #fastcgi_pass unix:/var/run/php7.2-fpm.sock;
          fastcgi_pass php:9000;
          fastcgi_split_path_info ^(.+.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
          fastcgi_param DOCUMENT_ROOT $realpath_root;
          fastcgi_buffer_size 128k;
          fastcgi_buffers 4 256k;
          fastcgi_busy_buffers_size 256k;
          internal;
      }

      location ~ .php$ {
          return 404;
      }

      error_log /var/log/nginx/project_error.log;
      access_log /var/log/nginx/project_access.log;
}


# HTTP redirect
server {
	listen 80;
	listen [::]:80;

	server_name *.stomup.ru stomup.ru;

	location / {
		return 301 https://stomup.ru$request_uri;
	}
}

์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์กฐ์ž‘ ํ›„์—๋Š” Docker-compose๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ docker-compose up -d๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  SSL์˜ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฅ™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ Let'sEnctypt ์ธ์ฆ์„œ๊ฐ€ 90์ผ ๋™์•ˆ ๋ฐœ๊ธ‰๋˜๋ฉฐ ๋‹ค์Œ ๋ช…๋ น์„ ํ†ตํ•ด ์ธ์ฆ์„œ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. sudo certbot renew, ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. docker-compose restart

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ด ์‹œํ€€์Šค๋ฅผ crontab์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ์ด๊ฒƒ์ด SSL์„ Docker ์›น์•ฑ์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

PS ํ…์ŠคํŠธ์— ์ œ์‹œ๋œ ๋ชจ๋“  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ตœ์ข…์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ํ”„๋กœ์ ํŠธ๋Š” ํ˜„์žฌ ์‹ฌ์ธต ๊ฐœ๋ฐœ ๋‹จ๊ณ„์— ์žˆ์œผ๋ฏ€๋กœ ๊ตฌ์„ฑ์„ ๋น„ํŒํ•˜์ง€ ๋งˆ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์€ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€