InfoGrab Docs

전송 암호화 구성

요약

Mattermost 설정의 구성 요소는 다음 다이어그램에 사용된 전송 암호화와 함께 표시됩니다. 애플리케이션 서버 간의 전송은 기본적으로 사용되지 않으며 추가 설정 단계가 필요합니다. Mattermost는 TLS를 사용하여 프록시와 애플리케이션 서버 간의 트래픽을 암호화할 수 있습니다.

Mattermost 설정의 구성 요소는 다음 다이어그램에 사용된 전송 암호화와 함께 표시됩니다. Mattermost 클러스터 노드 간 암호화를 제외한 모든 전송은 TLS 암호화를 사용합니다.

Note

애플리케이션 서버 간의 전송은 기본적으로 사용되지 않으며 추가 설정 단계가 필요합니다. 클러스터 노드 간 자동 암호화를 포함하도록 핵심 제품을 향상하는 작업이 진행 중이며 이후 릴리즈에서 제공될 예정입니다.

모든 전송이 TLS 암호화를 사용하는 Mattermost 설정의 구성 요소.

프록시와 Mattermost 간 전송 암호화 구성#

Mattermost는 TLS를 사용하여 프록시와 애플리케이션 서버 간의 트래픽을 암호화할 수 있습니다.

사전 요구 사항#

  • 운영 중인 Mattermost 서버 또는 클러스터
  • 애플리케이션 서버의 Mattermost 사용자 인증 정보

예시 환경#

이 시나리오에서는 하나의 Mattermost 애플리케이션 서버와 하나의 NGINX 서버가 있으며, 둘 다 Ubuntu 20.04를 실행하고 다음 IP를 가집니다:

  • transport-encryption-mattermost1: 10.10.250.146
  • transport-encryption-nginx: 10.10.250.107

NGINX 구성#

NGINX 서버에서 sudo 또는 root 사용자로 두 서버에 연결합니다. Mattermost 프록시 구성을 열고 다음 줄을 두 번 찾습니다:

proxy_pass http://backend;

프로토콜을 http에서 https로 변경합니다:

proxy_pass https://backend;

서비스 중단 시간을 최소화하기 위해 아직 NGINX 서버를 리로드하지 마세요.

Mattermost 구성#

Mattermost 서버에서 Mattermost의 config 디렉터리로 이동하고, 프록시 서버와 애플리케이션 서버 간의 트래픽을 암호화하는 데 사용할 자체 서명 인증서를 생성합니다.

참고: 회사 CA에서 인증서를 서명하는 방법도 사용할 수 있습니다.

cd /opt/mattermost/config
  openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
  chown root:mattermost *.pem
  chmod 640 *.pem


완료되면 ``config.json`` 파일을 열고 ``ServiceSettings`` 섹션에서 ``ConnectionSecurity``, ``TLSCertFile``, ``TLSKeyFile`` 값을 수정합니다.

변경 전

{
      "ServiceSettings": {
          "SiteURL": "https://transport-encryption.dev.example.com",
          "WebsocketURL": "",
          "LicenseFileLocation": "",
          "ListenAddress": ":8065",
          "ConnectionSecurity": "",
          "TLSCertFile": "",
          "TLSKeyFile": "",
          "...":"..."
      },
      "...":"..."
  }


**변경 후**
{
      "ServiceSettings": {
          "SiteURL": "https://transport-encryption.dev.example.com",
          "WebsocketURL": "",
          "LicenseFileLocation": "",
          "ListenAddress": ":8065",
          "ConnectionSecurity": "TLS",
          "TLSCertFile": "/opt/mattermost/config/cert.pem",
          "TLSKeyFile": "/opt/mattermost/config/key.pem",
          "...":"..."
      },
      "...":"..."
  }


Mattermost 서버를 재시작하고 정상 실행 중인지 확인합니다:
sudo systemctl restart mattermost
systemctl status mattermost
● mattermost.service - Mattermost
   Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
   Active: active (running) since Mon 2019-10-28 16:45:29 UTC; 1h 15min ago
   [...]

마지막으로 NGINX 서버에서 구성을 리로드하여 요청이 HTTPS로 전송되도록 합니다:

sudo systemctl reload nginx

데이터베이스 전송 암호화 구성#

Mattermost는 TLS를 사용하여 데이터베이스와 애플리케이션 간의 트래픽을 암호화할 수 있습니다. 이 가이드는 단일 별도 MySQL 서버에 대한 설정 단계를 설명합니다.

사전 요구 사항#

  • 운영 중인 Mattermost 서버 또는 클러스터
  • 운영 중인 MySQL 서버
  • Mattermost와 MySQL 서버 간 연결 확인
  • MySQL 서버의 Mattermost 사용자 인증 정보

예시 환경#

이 시나리오에서는 하나의 Mattermost 애플리케이션 서버와 하나의 MySQL 서버가 있으며, 둘 다 Ubuntu 20.04를 실행하고 다음 IP를 가집니다:

  • transport-encryption-mattermost1: 10.10.250.146
  • transport-encryption-mysql1: 10.10.250.148

MySQL 구성#

먼저 sudo 또는 root 사용자로 두 서버에 연결합니다.

다음 명령을 실행하여 서버가 SSL 연결을 허용하도록 준비합니다:

sudo mysql_ssl_rsa_setup --uid=mysql

이 명령은 MySQL 서버가 연결을 암호화하는 데 사용하는 자체 서명 인증서를 /var/lib/mysql/에 생성합니다. 회사 CA의 인증서를 사용하려면 MySQL 문서에서 구성 단계를 참조하세요.

참고: 선택적으로 모든 연결이 로컬 소켓 연결 또는 TLS를 통해 이루어지도록 강제할 수 있습니다. 이를 위해 /etc/mysql/mysql.conf.d/mysqld.cnf를 열고 파일 끝에 다음 줄을 추가합니다:

require_secure_transport = ON

이제 MySQL 서버에 대한 모든 연결은 보안 전송을 통해 이루어져야 합니다.

마지막으로 서버를 재시작하고 정상 실행 중인지 확인합니다:

systemctl restart mysql
systemctl status mysql
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-10-18 16:41:25 UTC; 2s ago
  Process: 8380 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
  Process: 8360 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 8382 (mysqld)
    Tasks: 27 (limit: 2361)
   CGroup: /system.slice/mysql.service
           └─8382 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Stopped MySQL Community Server.
Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Starting MySQL Community Server...
Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Started MySQL Community Server.

Mattermost 구성#

Mattermost 서버에서 config.json 파일을 열고 SqlSettings 섹션에서 DataSource 값을 찾습니다. 다음과 비슷한 형태일 것입니다:

"DataSource": "mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s",

줄 끝에서 다음 값을 지원하는 tls 플래그를 사용하여 TLS를 활성화할 수 있습니다:

  • true (TLS 필수 + 신뢰할 수 있는 인증서)
  • false
  • skip-verify (TLS 필수 + 자체 서명 허용)
  • preferred (TLS 시도, 실패 시 비암호화로 폴백)
자체 서명 인증서를 사용하므로 skip-verify를 사용해야 합니다. 구성 설정은 다음과 같아집니다:
"DataSource": "mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s&tls=skip-verify",

클러스터에서 Mattermost를 실행 중인 경우 클러스터의 각 노드에서 값을 업데이트하세요. 데이터베이스에서 구성을 사용 중인 경우 systemd 유닛 파일을 업데이트하고 구성 저장소에 TLS를 활성화하세요.

완료되면 Mattermost 서버를 재시작하고 시스템이 정상 작동하는지 확인합니다:

sudo systemctl restart mattermost
systemctl status mattermost
● mattermost.service - Mattermost
   Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
   Active: active (running) since Fri 2019-10-18 16:47:08 UTC; 3s ago
  Process: 3424 ExecStartPre=/opt/mattermost/bin/pre_start.sh (code=exited, status=0/SUCCESS)
 Main PID: 3443 (mattermost)
    Tasks: 20 (limit: 2361)
   CGroup: /system.slice/mattermost.service
           ├─3443 /opt/mattermost/bin/mattermost --config=mysql://mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s&tls=skip-verify
           └─3459 plugins/com.mattermost.nps/server/dist/plugin-linux-amd64

Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8637397,"caller":"scheduler/worker.go:36","msg":"Worker started","worker":"Plugins"}
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8639545,"caller":"jobs/jobs_watcher.go:38","msg":"Watcher Started"}
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"info","ts":1571417228.8641603,"caller":"jobs/schedulers.go:72","msg":"Starting schedulers."}
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8645394,"caller":"app/web_hub.go:436","msg":"Hub for index 0 is starting with goroutine 3923"}
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8648505,"caller":"app/web_hub.go:436","msg":"Hub for index 1 is starting with goroutine 3924"}
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8656101,"caller":"web/static.go:31","msg":"Using client directory at /opt/mattermost/client"}
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"info","ts":1571417228.8681324,"caller":"commands/server.go:105","msg":"Sending systemd READY notification."}
Oct 18 16:47:08 transport-encryption-mattermost1 systemd[1]: Started Mattermost.
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.9003174,"caller":"jobs/schedulers.go:166","msg":"Next run time for scheduler","scheduler_name":"MigrationsSched
Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.9025588,"caller":"jobs/schedulers.go:166","msg":"Next run time for scheduler","scheduler_name":"PluginsSchedule

클러스터 전송 암호화 구성#

Mattermost는 SSH 터널링을 사용하여 배포 클러스터 내에서 전송되는 메시지를 암호화할 수 있습니다. 이 가이드는 Ubuntu 20.04에서 이 솔루션을 배포하는 방법을 안내하지만, 모든 Linux 운영 체제에 맞게 조정할 수 있습니다.

이 문서는 3노드 클러스터 구성만 설명하지만 그 수에 제한이 있는 것은 아닙니다.

사전 요구 사항#

  • 배포의 각 노드 간에 SSH 포트 허용 목록 설정
  • 각 노드에서 활성화된 ufw/iptables
  • 구성을 위한 각 노드의 root/sudo 사용자 접근
  • 구성된 Mattermost 클러스터
  • 전용 서비스 사용자로 실행 중인 Mattermost
  • 각 클러스터 노드에서 Mattermost 서비스가 중지된 상태
Note

애플리케이션 수준에서의 지원은 현재 개발 중이며, 사용 가능해지면 이 문서는 더 이상 사용되지 않게 됩니다.

예시 환경#

이 시나리오에서는 환경에 다음 호스트명/IP 매핑을 가진 세 개의 애플리케이션 노드가 있습니다:

  • transport-encryption-mattermost1: 10.10.250.146
  • transport-encryption-mattermost2: 10.10.250.231
  • transport-encryption-mattermost3: 10.10.250.165

준비 사항#

  • sudo 또는 root 사용자로 각 Mattermost 서버에 연결합니다.
  • 내부 통신에 사용되는 각 클러스터 멤버의 IP를 메모합니다.
  • 각 클러스터 노드의 /etc/ssh/sshd_config에서 AllowTcpForwarding이 활성화되어 있는지 확인합니다.

SSH 인증#

각 노드에서 서비스 계정의 SSH 키 쌍을 생성합니다. 이 시나리오에서 서비스 계정은 mattermost입니다:

sudo -u mattermost ssh-keygen -t rsa
Generating public/private rsa key pair.
  Enter file in which to save the key (/home/mattermost/.ssh/id_rsa):
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in /home/mattermost/.ssh/id_rsa.
  Your public key has been saved in /home/mattermost/.ssh/id_rsa.pub.
  The key fingerprint is:
  SHA256:redacted mattermost@transport-encryption-mattermost1


회사 정책에 따라 다른 저장 위치를 사용해야 하는 경우 SSH 키 자체의 위치는 관계없습니다.

다음으로, 각 노드의 SSH 공개 키가 클러스터의 다른 노드의 authorized_keys 파일에 추가되어 있는지 확인합니다. 이를 위해 노드 2와 3의 /home/mattermost/.ssh/id_rsa.pub 내용을 복사하여 노드 1의 /home/mattermost/.ssh/authorized_keys에 추가합니다.

클러스터의 각 노드에 대해 이 단계를 반복합니다. 결과적으로 각 노드는 클러스터의 다른 노드에 SSH 연결을 설정할 수 있어야 합니다.

Note

이 서비스 계정은 Mattermost systemd 서비스에 이미 사용되는 서비스 계정과 분리될 수 있습니다. 이 서비스 계정은 포트 포워딩을 사용하여 SSH 터널을 생성할 수 있어야 하지만 추가 권한은 필요하지 않습니다.

ufw 구성#

다음 단계로, 다른 멤버 노드 각각의 SSH 접근을 허용합니다. 예를 들어:

  • mattermost1은 mattermost2와 mattermost3에서의 접근을 허용
  • mattermost2는 mattermost1과 mattermost3에서의 접근을 허용
  • mattermost3은 mattermost1과 mattermost2에서의 접근을 허용
이를 위해 방화벽에 예외를 추가합니다. mattermost1에 대한 명령은 다음과 같습니다:
sudo ufw allow from 10.10.250.231/32 to any port ssh
sudo ufw allow from 10.10.250.165/32 to any port ssh
sudo ufw status
Rule added
  Rule added
  Status: active

  To                         Action      From
  --                         ------      ----
  22/tcp                     ALLOW       10.10.250.10
  8065/tcp                   ALLOW       Anywhere
  22/tcp                     ALLOW       10.10.250.231
  22/tcp                     ALLOW       10.10.250.165


나머지 노드에서도 동일한 단계를 반복하되, IP를 다른 멤버 노드의 IP로 교체합니다. 각 멤버 노드에 대해 노드 자체를 제외한 모든 노드에 대해 수행합니다.

다음으로 /etc/ufw/after.rules를 열고 파일 끝에 다음 블록을 추가합니다:

*nat
  :POSTROUTING ACCEPT [0:0]
  :PREROUTING ACCEPT [0:0]

  -A OUTPUT -p tcp -d 10.10.250.231 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
  -A OUTPUT -p tcp -d 10.10.250.231 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
  -A OUTPUT -p tcp -d 10.10.250.165 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
  -A OUTPUT -p tcp -d 10.10.250.165 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074

  COMMIT


두 줄이 항상 단일 노드에 속하므로 4노드 배포의 경우:
-A OUTPUT -p tcp -d ip_node_2 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
-A OUTPUT -p tcp -d ip_node_2 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
-A OUTPUT -p tcp -d ip_node_3 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
-A OUTPUT -p tcp -d ip_node_3 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074
-A OUTPUT -p tcp -d ip_node_4 --dport 8075 -j DNAT --to-destination 127.0.0.1:38075
-A OUTPUT -p tcp -d ip_node_4 --dport 8074 -j DNAT --to-destination 127.0.0.1:38074

오른쪽의 포트는 고유해야 합니다. 따라서 6노드 클러스터가 있는 경우 8075와 8074 앞에 1부터 5를 사용합니다. 클러스터 크기가 더 크다면 추가 포트를 사용해야 합니다.

다음 명령을 사용하여 운영 체제에서 IP 포워딩이 활성화되어 있는지 확인합니다:

sysctl -w net.ipv4.ip_forward=1

그런 다음 ufw 규칙을 리로드하고 iptable 규칙이 성공적으로 생성되었는지 확인합니다:

iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             10.10.250.231        tcp dpt:8075 to:127.0.0.1:18075
DNAT       tcp  --  anywhere             10.10.250.231        tcp dpt:8074 to:127.0.0.1:18074
DNAT       tcp  --  anywhere             10.10.250.165        tcp dpt:8075 to:127.0.0.1:28075
DNAT       tcp  --  anywhere             10.10.250.165        tcp dpt:8074 to:127.0.0.1:28074

클러스터의 모든 노드에 대해 이 단계를 반복합니다. 이 섹션이 끝나면 다음이 구성되어야 합니다:

  • 클러스터 각 노드에서 다른 노드로의 방화벽에서 SSH 접근 허용
  • 노드당 포트 8074 및 8075에 대한 iptables 규칙 2개
  • IP 포워딩 활성화

SSH 구성#

다음 단계로, Mattermost 서비스 시작 시 SSH 터널이 생성되도록 합니다. 이를 위해 mattermost1/opt/mattermost/binpre_start.sh 파일을 만듭니다:

#!/bin/bash
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18075:10.10.250.231:8075 10.10.250.231 || true
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18074:10.10.250.231:8074 10.10.250.231 || true
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28075:10.10.250.165:8075 10.10.250.165 || true
ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28074:10.10.250.165:8074 10.10.250.165 || true
Note

  • 터널이 이미 활성화된 경우 SSH 연결 자체의 오류를 무시하고 있습니다. 그렇지 않으면 Mattermost 서버가 시작에 실패합니다.

  • 버전 업그레이드 시 이 스크립트를 반드시 백업하세요.
  • 그런 다음 셸 스크립트에 실행 비트를 설정합니다:
    chmod +x /opt/mattermost/bin/pre_start.sh

    Mattermost의 systemd 유닛 파일을 열고 Type=Notify를 찾습니다. 그 다음에 Mattermost 자체가 시작되기 전에 실행될 ExecStartPre 스크립트를 입력합니다:

    [Service]
    Type=notify
    ExecStartPre=/opt/mattermost/bin/pre_start.sh

    이후 systemd 데몬을 리로드합니다:

    systemctl daemon-reload

    각 멤버 노드에서 동일한 단계를 반복하고 환경에 맞게 노드 IP와 항목 수를 조정합니다.

    클러스터 시작#

    각 노드 구성이 완료되면, 각 클러스터에서 서비스를 재시작하고 다음 명령을 사용하여 실행 중인지 확인합니다:

    systemctl start mattermost
    systemctl status mattermost.service
    ● mattermost.service - Mattermost
       Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
       Active: active (running) since Fri 2019-10-04 19:44:20 UTC; 5min ago
      Process: 16734 ExecStartPre=/opt/mattermost/bin/pre_start.sh (code=exited, status=0/SUCCESS)

    다음으로 Mattermost 시스템 콘솔을 열고 고가용성 섹션에서 각 노드가 성공적으로 보고되고 있는지 확인합니다.

    전송 암호화 구성

    원문 보기
    요약

    Mattermost 설정의 구성 요소는 다음 다이어그램에 사용된 전송 암호화와 함께 표시됩니다. 애플리케이션 서버 간의 전송은 기본적으로 사용되지 않으며 추가 설정 단계가 필요합니다. Mattermost는 TLS를 사용하여 프록시와 애플리케이션 서버 간의 트래픽을 암호화할 수 있습니다.

    Mattermost 설정의 구성 요소는 다음 다이어그램에 사용된 전송 암호화와 함께 표시됩니다. Mattermost 클러스터 노드 간 암호화를 제외한 모든 전송은 TLS 암호화를 사용합니다.

    Note

    애플리케이션 서버 간의 전송은 기본적으로 사용되지 않으며 추가 설정 단계가 필요합니다. 클러스터 노드 간 자동 암호화를 포함하도록 핵심 제품을 향상하는 작업이 진행 중이며 이후 릴리즈에서 제공될 예정입니다.

    모든 전송이 TLS 암호화를 사용하는 Mattermost 설정의 구성 요소.

    프록시와 Mattermost 간 전송 암호화 구성#

    Mattermost는 TLS를 사용하여 프록시와 애플리케이션 서버 간의 트래픽을 암호화할 수 있습니다.

    사전 요구 사항#

    • 운영 중인 Mattermost 서버 또는 클러스터
    • 애플리케이션 서버의 Mattermost 사용자 인증 정보

    예시 환경#

    이 시나리오에서는 하나의 Mattermost 애플리케이션 서버와 하나의 NGINX 서버가 있으며, 둘 다 Ubuntu 20.04를 실행하고 다음 IP를 가집니다:

    • transport-encryption-mattermost1: 10.10.250.146
    • transport-encryption-nginx: 10.10.250.107

    NGINX 구성#

    NGINX 서버에서 sudo 또는 root 사용자로 두 서버에 연결합니다. Mattermost 프록시 구성을 열고 다음 줄을 두 번 찾습니다:

    proxy_pass http://backend;

    프로토콜을 http에서 https로 변경합니다:

    proxy_pass https://backend;

    서비스 중단 시간을 최소화하기 위해 아직 NGINX 서버를 리로드하지 마세요.

    Mattermost 구성#

    Mattermost 서버에서 Mattermost의 config 디렉터리로 이동하고, 프록시 서버와 애플리케이션 서버 간의 트래픽을 암호화하는 데 사용할 자체 서명 인증서를 생성합니다.

    참고: 회사 CA에서 인증서를 서명하는 방법도 사용할 수 있습니다.

    cd /opt/mattermost/config
      openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
      chown root:mattermost *.pem
      chmod 640 *.pem
    
    
    완료되면 ``config.json`` 파일을 열고 ``ServiceSettings`` 섹션에서 ``ConnectionSecurity``, ``TLSCertFile``, ``TLSKeyFile`` 값을 수정합니다.

    변경 전

    {
          "ServiceSettings": {
              "SiteURL": "https://transport-encryption.dev.example.com",
              "WebsocketURL": "",
              "LicenseFileLocation": "",
              "ListenAddress": ":8065",
              "ConnectionSecurity": "",
              "TLSCertFile": "",
              "TLSKeyFile": "",
              "...":"..."
          },
          "...":"..."
      }
    
    
    **변경 후**
    {
          "ServiceSettings": {
              "SiteURL": "https://transport-encryption.dev.example.com",
              "WebsocketURL": "",
              "LicenseFileLocation": "",
              "ListenAddress": ":8065",
              "ConnectionSecurity": "TLS",
              "TLSCertFile": "/opt/mattermost/config/cert.pem",
              "TLSKeyFile": "/opt/mattermost/config/key.pem",
              "...":"..."
          },
          "...":"..."
      }
    
    
    Mattermost 서버를 재시작하고 정상 실행 중인지 확인합니다:
    sudo systemctl restart mattermost
    systemctl status mattermost
    ● mattermost.service - Mattermost
       Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
       Active: active (running) since Mon 2019-10-28 16:45:29 UTC; 1h 15min ago
       [...]

    마지막으로 NGINX 서버에서 구성을 리로드하여 요청이 HTTPS로 전송되도록 합니다:

    sudo systemctl reload nginx

    데이터베이스 전송 암호화 구성#

    Mattermost는 TLS를 사용하여 데이터베이스와 애플리케이션 간의 트래픽을 암호화할 수 있습니다. 이 가이드는 단일 별도 MySQL 서버에 대한 설정 단계를 설명합니다.

    사전 요구 사항#

    • 운영 중인 Mattermost 서버 또는 클러스터
    • 운영 중인 MySQL 서버
    • Mattermost와 MySQL 서버 간 연결 확인
    • MySQL 서버의 Mattermost 사용자 인증 정보

    예시 환경#

    이 시나리오에서는 하나의 Mattermost 애플리케이션 서버와 하나의 MySQL 서버가 있으며, 둘 다 Ubuntu 20.04를 실행하고 다음 IP를 가집니다:

    • transport-encryption-mattermost1: 10.10.250.146
    • transport-encryption-mysql1: 10.10.250.148

    MySQL 구성#

    먼저 sudo 또는 root 사용자로 두 서버에 연결합니다.

    다음 명령을 실행하여 서버가 SSL 연결을 허용하도록 준비합니다:

    sudo mysql_ssl_rsa_setup --uid=mysql

    이 명령은 MySQL 서버가 연결을 암호화하는 데 사용하는 자체 서명 인증서를 /var/lib/mysql/에 생성합니다. 회사 CA의 인증서를 사용하려면 MySQL 문서에서 구성 단계를 참조하세요.

    참고: 선택적으로 모든 연결이 로컬 소켓 연결 또는 TLS를 통해 이루어지도록 강제할 수 있습니다. 이를 위해 /etc/mysql/mysql.conf.d/mysqld.cnf를 열고 파일 끝에 다음 줄을 추가합니다:

    require_secure_transport = ON

    이제 MySQL 서버에 대한 모든 연결은 보안 전송을 통해 이루어져야 합니다.

    마지막으로 서버를 재시작하고 정상 실행 중인지 확인합니다:

    systemctl restart mysql
    systemctl status mysql
    ● mysql.service - MySQL Community Server
       Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2019-10-18 16:41:25 UTC; 2s ago
      Process: 8380 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
      Process: 8360 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
     Main PID: 8382 (mysqld)
        Tasks: 27 (limit: 2361)
       CGroup: /system.slice/mysql.service
               └─8382 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
    
    Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Stopped MySQL Community Server.
    Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Starting MySQL Community Server...
    Oct 18 16:41:25 transport-encryption-mysql1 systemd[1]: Started MySQL Community Server.

    Mattermost 구성#

    Mattermost 서버에서 config.json 파일을 열고 SqlSettings 섹션에서 DataSource 값을 찾습니다. 다음과 비슷한 형태일 것입니다:

    "DataSource": "mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s",

    줄 끝에서 다음 값을 지원하는 tls 플래그를 사용하여 TLS를 활성화할 수 있습니다:

    • true (TLS 필수 + 신뢰할 수 있는 인증서)
    • false
    • skip-verify (TLS 필수 + 자체 서명 허용)
    • preferred (TLS 시도, 실패 시 비암호화로 폴백)
    자체 서명 인증서를 사용하므로 skip-verify를 사용해야 합니다. 구성 설정은 다음과 같아집니다:
    "DataSource": "mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s&tls=skip-verify",

    클러스터에서 Mattermost를 실행 중인 경우 클러스터의 각 노드에서 값을 업데이트하세요. 데이터베이스에서 구성을 사용 중인 경우 systemd 유닛 파일을 업데이트하고 구성 저장소에 TLS를 활성화하세요.

    완료되면 Mattermost 서버를 재시작하고 시스템이 정상 작동하는지 확인합니다:

    sudo systemctl restart mattermost
    systemctl status mattermost
    ● mattermost.service - Mattermost
       Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
       Active: active (running) since Fri 2019-10-18 16:47:08 UTC; 3s ago
      Process: 3424 ExecStartPre=/opt/mattermost/bin/pre_start.sh (code=exited, status=0/SUCCESS)
     Main PID: 3443 (mattermost)
        Tasks: 20 (limit: 2361)
       CGroup: /system.slice/mattermost.service
               ├─3443 /opt/mattermost/bin/mattermost --config=mysql://mmuser:sad09zusaopdhsad123@tcp(10.10.250.148:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s&tls=skip-verify
               └─3459 plugins/com.mattermost.nps/server/dist/plugin-linux-amd64
    
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8637397,"caller":"scheduler/worker.go:36","msg":"Worker started","worker":"Plugins"}
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8639545,"caller":"jobs/jobs_watcher.go:38","msg":"Watcher Started"}
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"info","ts":1571417228.8641603,"caller":"jobs/schedulers.go:72","msg":"Starting schedulers."}
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8645394,"caller":"app/web_hub.go:436","msg":"Hub for index 0 is starting with goroutine 3923"}
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8648505,"caller":"app/web_hub.go:436","msg":"Hub for index 1 is starting with goroutine 3924"}
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.8656101,"caller":"web/static.go:31","msg":"Using client directory at /opt/mattermost/client"}
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"info","ts":1571417228.8681324,"caller":"commands/server.go:105","msg":"Sending systemd READY notification."}
    Oct 18 16:47:08 transport-encryption-mattermost1 systemd[1]: Started Mattermost.
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.9003174,"caller":"jobs/schedulers.go:166","msg":"Next run time for scheduler","scheduler_name":"MigrationsSched
    Oct 18 16:47:08 transport-encryption-mattermost1 mattermost[3443]: {"level":"debug","ts":1571417228.9025588,"caller":"jobs/schedulers.go:166","msg":"Next run time for scheduler","scheduler_name":"PluginsSchedule

    클러스터 전송 암호화 구성#

    Mattermost는 SSH 터널링을 사용하여 배포 클러스터 내에서 전송되는 메시지를 암호화할 수 있습니다. 이 가이드는 Ubuntu 20.04에서 이 솔루션을 배포하는 방법을 안내하지만, 모든 Linux 운영 체제에 맞게 조정할 수 있습니다.

    이 문서는 3노드 클러스터 구성만 설명하지만 그 수에 제한이 있는 것은 아닙니다.

    사전 요구 사항#

    • 배포의 각 노드 간에 SSH 포트 허용 목록 설정
    • 각 노드에서 활성화된 ufw/iptables
    • 구성을 위한 각 노드의 root/sudo 사용자 접근
    • 구성된 Mattermost 클러스터
    • 전용 서비스 사용자로 실행 중인 Mattermost
    • 각 클러스터 노드에서 Mattermost 서비스가 중지된 상태
    Note

    애플리케이션 수준에서의 지원은 현재 개발 중이며, 사용 가능해지면 이 문서는 더 이상 사용되지 않게 됩니다.

    예시 환경#

    이 시나리오에서는 환경에 다음 호스트명/IP 매핑을 가진 세 개의 애플리케이션 노드가 있습니다:

    • transport-encryption-mattermost1: 10.10.250.146
    • transport-encryption-mattermost2: 10.10.250.231
    • transport-encryption-mattermost3: 10.10.250.165

    준비 사항#

    • sudo 또는 root 사용자로 각 Mattermost 서버에 연결합니다.
    • 내부 통신에 사용되는 각 클러스터 멤버의 IP를 메모합니다.
    • 각 클러스터 노드의 /etc/ssh/sshd_config에서 AllowTcpForwarding이 활성화되어 있는지 확인합니다.

    SSH 인증#

    각 노드에서 서비스 계정의 SSH 키 쌍을 생성합니다. 이 시나리오에서 서비스 계정은 mattermost입니다:

    sudo -u mattermost ssh-keygen -t rsa
    Generating public/private rsa key pair.
      Enter file in which to save the key (/home/mattermost/.ssh/id_rsa):
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in /home/mattermost/.ssh/id_rsa.
      Your public key has been saved in /home/mattermost/.ssh/id_rsa.pub.
      The key fingerprint is:
      SHA256:redacted mattermost@transport-encryption-mattermost1
    
    
    회사 정책에 따라 다른 저장 위치를 사용해야 하는 경우 SSH 키 자체의 위치는 관계없습니다.

    다음으로, 각 노드의 SSH 공개 키가 클러스터의 다른 노드의 authorized_keys 파일에 추가되어 있는지 확인합니다. 이를 위해 노드 2와 3의 /home/mattermost/.ssh/id_rsa.pub 내용을 복사하여 노드 1의 /home/mattermost/.ssh/authorized_keys에 추가합니다.

    클러스터의 각 노드에 대해 이 단계를 반복합니다. 결과적으로 각 노드는 클러스터의 다른 노드에 SSH 연결을 설정할 수 있어야 합니다.

    Note

    이 서비스 계정은 Mattermost systemd 서비스에 이미 사용되는 서비스 계정과 분리될 수 있습니다. 이 서비스 계정은 포트 포워딩을 사용하여 SSH 터널을 생성할 수 있어야 하지만 추가 권한은 필요하지 않습니다.

    ufw 구성#

    다음 단계로, 다른 멤버 노드 각각의 SSH 접근을 허용합니다. 예를 들어:

    • mattermost1은 mattermost2와 mattermost3에서의 접근을 허용
    • mattermost2는 mattermost1과 mattermost3에서의 접근을 허용
    • mattermost3은 mattermost1과 mattermost2에서의 접근을 허용
    이를 위해 방화벽에 예외를 추가합니다. mattermost1에 대한 명령은 다음과 같습니다:
    sudo ufw allow from 10.10.250.231/32 to any port ssh
    sudo ufw allow from 10.10.250.165/32 to any port ssh
    sudo ufw status
    Rule added
      Rule added
      Status: active
    
      To                         Action      From
      --                         ------      ----
      22/tcp                     ALLOW       10.10.250.10
      8065/tcp                   ALLOW       Anywhere
      22/tcp                     ALLOW       10.10.250.231
      22/tcp                     ALLOW       10.10.250.165
    
    
    나머지 노드에서도 동일한 단계를 반복하되, IP를 다른 멤버 노드의 IP로 교체합니다. 각 멤버 노드에 대해 노드 자체를 제외한 모든 노드에 대해 수행합니다.

    다음으로 /etc/ufw/after.rules를 열고 파일 끝에 다음 블록을 추가합니다:

    *nat
      :POSTROUTING ACCEPT [0:0]
      :PREROUTING ACCEPT [0:0]
    
      -A OUTPUT -p tcp -d 10.10.250.231 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
      -A OUTPUT -p tcp -d 10.10.250.231 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
      -A OUTPUT -p tcp -d 10.10.250.165 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
      -A OUTPUT -p tcp -d 10.10.250.165 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074
    
      COMMIT
    
    
    두 줄이 항상 단일 노드에 속하므로 4노드 배포의 경우:
    -A OUTPUT -p tcp -d ip_node_2 --dport 8075 -j DNAT --to-destination 127.0.0.1:18075
    -A OUTPUT -p tcp -d ip_node_2 --dport 8074 -j DNAT --to-destination 127.0.0.1:18074
    -A OUTPUT -p tcp -d ip_node_3 --dport 8075 -j DNAT --to-destination 127.0.0.1:28075
    -A OUTPUT -p tcp -d ip_node_3 --dport 8074 -j DNAT --to-destination 127.0.0.1:28074
    -A OUTPUT -p tcp -d ip_node_4 --dport 8075 -j DNAT --to-destination 127.0.0.1:38075
    -A OUTPUT -p tcp -d ip_node_4 --dport 8074 -j DNAT --to-destination 127.0.0.1:38074

    오른쪽의 포트는 고유해야 합니다. 따라서 6노드 클러스터가 있는 경우 8075와 8074 앞에 1부터 5를 사용합니다. 클러스터 크기가 더 크다면 추가 포트를 사용해야 합니다.

    다음 명령을 사용하여 운영 체제에서 IP 포워딩이 활성화되어 있는지 확인합니다:

    sysctl -w net.ipv4.ip_forward=1

    그런 다음 ufw 규칙을 리로드하고 iptable 규칙이 성공적으로 생성되었는지 확인합니다:

    iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination
    
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination
    DNAT       tcp  --  anywhere             10.10.250.231        tcp dpt:8075 to:127.0.0.1:18075
    DNAT       tcp  --  anywhere             10.10.250.231        tcp dpt:8074 to:127.0.0.1:18074
    DNAT       tcp  --  anywhere             10.10.250.165        tcp dpt:8075 to:127.0.0.1:28075
    DNAT       tcp  --  anywhere             10.10.250.165        tcp dpt:8074 to:127.0.0.1:28074

    클러스터의 모든 노드에 대해 이 단계를 반복합니다. 이 섹션이 끝나면 다음이 구성되어야 합니다:

    • 클러스터 각 노드에서 다른 노드로의 방화벽에서 SSH 접근 허용
    • 노드당 포트 8074 및 8075에 대한 iptables 규칙 2개
    • IP 포워딩 활성화

    SSH 구성#

    다음 단계로, Mattermost 서비스 시작 시 SSH 터널이 생성되도록 합니다. 이를 위해 mattermost1/opt/mattermost/binpre_start.sh 파일을 만듭니다:

    #!/bin/bash
    ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18075:10.10.250.231:8075 10.10.250.231 || true
    ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 18074:10.10.250.231:8074 10.10.250.231 || true
    ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28075:10.10.250.165:8075 10.10.250.165 || true
    ssh -N -f -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -L 28074:10.10.250.165:8074 10.10.250.165 || true
    Note

    • 터널이 이미 활성화된 경우 SSH 연결 자체의 오류를 무시하고 있습니다. 그렇지 않으면 Mattermost 서버가 시작에 실패합니다.

  • 버전 업그레이드 시 이 스크립트를 반드시 백업하세요.
  • 그런 다음 셸 스크립트에 실행 비트를 설정합니다:
    chmod +x /opt/mattermost/bin/pre_start.sh

    Mattermost의 systemd 유닛 파일을 열고 Type=Notify를 찾습니다. 그 다음에 Mattermost 자체가 시작되기 전에 실행될 ExecStartPre 스크립트를 입력합니다:

    [Service]
    Type=notify
    ExecStartPre=/opt/mattermost/bin/pre_start.sh

    이후 systemd 데몬을 리로드합니다:

    systemctl daemon-reload

    각 멤버 노드에서 동일한 단계를 반복하고 환경에 맞게 노드 IP와 항목 수를 조정합니다.

    클러스터 시작#

    각 노드 구성이 완료되면, 각 클러스터에서 서비스를 재시작하고 다음 명령을 사용하여 실행 중인지 확인합니다:

    systemctl start mattermost
    systemctl status mattermost.service
    ● mattermost.service - Mattermost
       Loaded: loaded (/lib/systemd/system/mattermost.service; static; vendor preset: enabled)
       Active: active (running) since Fri 2019-10-04 19:44:20 UTC; 5min ago
      Process: 16734 ExecStartPre=/opt/mattermost/bin/pre_start.sh (code=exited, status=0/SUCCESS)

    다음으로 Mattermost 시스템 콘솔을 열고 고가용성 섹션에서 각 노드가 성공적으로 보고되고 있는지 확인합니다.