Red Hat Training

A Red Hat training course is available for RHEL 8

다양한 유형의 서버 배포

Red Hat Enterprise Linux 8

웹 서버 및 역방향 프록시, 네트워크 파일 서비스, 데이터베이스 서버, 메일 전송 에이전트 및 프린터 설정 및 구성

Red Hat Customer Content Services

초록

Red Hat Enterprise Linux 8에서 Apache HTTP 웹 서버 또는 NGINX 웹 서버를 구성하고 실행합니다. Samba 또는 NFS와 같은 네트워크 파일 서비스를 구성하고 사용합니다. MariaDB, MySQL 또는 PostgreSQL 데이터베이스 서버를 설치하고, 구성하고, 데이터를 백업 및 마이그레이션합니다. 10.0.0.1 메일 전송 에이전트를 배포 및 구성합니다. CUPS 서버를 사용하여 인쇄를 구성합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서 및 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

Red Hat 문서에 관한 피드백 제공

문서 개선을 위한 의견에 감사드립니다. 어떻게 개선할 수 있는지 알려주십시오.

Jira를 통해 피드백 제출 (등록 필요)

  1. Jira 웹 사이트에 로그인합니다.
  2. 상단 탐색 모음에서 생성 을 클릭합니다.
  3. 요약 필드에 설명 제목을 입력합니다.
  4. 설명 필드에 개선을 위한 제안을 입력합니다. 문서의 관련 부분에 대한 링크를 포함합니다.
  5. 대화 상자 하단에서 생성 을 클릭합니다.

1장. Apache HTTP 웹 서버 설정

1.1. Apache HTTP 웹 서버 개요

웹 서버는 웹을 통해 클라이언트에 콘텐츠를 제공하는 네트워크 서비스입니다. 이는 일반적으로 웹 페이지를 의미하지만 다른 모든 문서도 될 수 있습니다. 웹 서버는 하이퍼텍스트 전송 프로토콜 (HTTP)을 사용하므로 HTTP 서버라고도 합니다.

Apache HTTP ServerhttpdApache Software Foundation에서 개발한 오픈 소스 웹 서버입니다.

이전 Red Hat Enterprise Linux 릴리스에서 업그레이드하는 경우 그에 따라 httpd 서비스 구성을 업데이트해야 합니다. 이 섹션에서는 새로 추가된 일부 기능을 살펴보고 이전 구성 파일의 업데이트에 대해 설명합니다.

1.2. Apache HTTP Server에서 주요 변경 사항

Apache HTTP Server 가 RHEL 7의 2.4.6 버전에서 RHEL 8의 2.4.37 버전으로 업데이트되었습니다. 이 업데이트된 버전에는 몇 가지 새로운 기능이 포함되어 있지만 외부 모듈 구성 및 ABI(Application Binary Interface) 수준에서는 RHEL 7 버전과의 역호환성을 유지합니다.

새로운 기능은 다음과 같습니다.

  • HTTP/2 지원은 이제 httpd 모듈의 일부인 mod_http2 패키지를 통해 제공됩니다.
  • systemd 소켓 활성화가 지원됩니다. 자세한 내용은 httpd.socket(8) 도움말 페이지를 참조하십시오.
  • 여러 새 모듈이 추가되었습니다.

    • mod_proxy_hcheck - 프록시 상태 확인 모듈
    • mod_proxy_uwsgi - WSGI(Web Server Gateway Interface) 프록시
    • mod_proxy_fdpass - 클라이언트의 소켓을 다른 프로세스에 전달하는 기능을 제공
    • mod_cache_socache - HTTP 캐시 (예: memcache 백엔드를 사용)
    • mod_md - ACME 프로토콜의 SSL/TLS 인증서 서비스
  • 이제 기본적으로 다음 모듈이 로드됩니다.

    • mod_request
    • mod_macro
    • mod_watchdog
  • 디렉터리에 대한 올바른 권한을 포함하여 Apache HTTP Server의 기본 디렉터리 레이아웃이 포함된 새 하위 패키지 httpd-filesystem이 추가되었습니다.
  • 인스턴스화된 서비스 지원 httpd@.service가 도입되었습니다. 자세한 내용은 httpd.service 도움말 페이지를 참조하십시오.
  • httpd-init.service는 자체 서명된 mod_ssl 키 쌍을 생성하기 위해 %post script를 대체합니다.
  • ACME(Automatic Certificate Management Environment) 프로토콜을 사용하는 자동화된 TLS 인증서 프로비저닝 및 업데이트가 이제 mod_md 패키지와 함께 지원됩니다(Let’s Encrypt와 같은 인증 기관을 통해 사용).
  • 이제 Apache HTTP Server에서는 PKCS#11 모듈에서 직접 하드웨어 보안 토큰의 TLS 인증서 및 개인 키를 로드하는 기능을 지원합니다. 결과적으로 이제 mod_ssl 구성에서 PKCS#11 URL을 사용하여 TLS 개인키를 식별할 수 있으며, 선택적으로 SSLCertificateKeyFileSSLCertificateFile 지시문으로 TLS 인증서를 식별할 수 있습니다.
  • /etc/httpd/conf/httpd.conf 파일에 있는 새 ListenFree 지시문이 지원됩니다.

    Listen 지시문과 마찬가지로 ListenFree는 서버가 수신 대기하는 IP 주소, 포트 또는 IP 주소 및 포트 조합에 대한 정보를 제공합니다. 그러나 ListenFree를 사용하면 IP_FREEBIND 소켓 옵션이 기본적으로 활성화됩니다. 따라서 httpd는 비로컬 IP 주소 또는 아직 존재하지 않는 IP 주소에 바인딩할 수 있습니다. 이렇게 하면 httpd가 기본 네트워크 인터페이스나 지정된 동적 IP 주소가 httpd에 바인딩하려고 할 때 소켓에서 수신 대기할 수 있습니다.

    ListenFree 지시문은 현재 RHEL 8에서만 사용할 수 있습니다.

    ListenFree에 대한 자세한 내용은 다음 표를 참조하십시오.

    표 1.1. ListenFree 지시문의 구문, 상태 및 모듈

    구문상태모듈

    ListenFree [IP-address:]portnumber [protocol]

    MPM

    event, worker, prefork, mpm_winnt, mpm_netware, mpmt_os2

기타 주요 변경 사항은 다음과 같습니다.

  • 다음 모듈이 제거되었습니다.

  • RHEL 8의 Apache HTTP Server에서 사용하는 DBM 인증 데이터베이스의 기본 유형이 SDBM에서 db5로 변경되었습니다.
  • Apache HTTP Servermod_wsgi 모듈이 Python 3으로 업데이트되었습니다. WSGI 애플리케이션은 이제 Python 3에서만 지원되며 Python 2에서 마이그레이션해야 합니다.
  • Apache HTTP Server 와 함께 기본적으로 구성된 멀티프로세싱 모듈(MPM)은 멀티 프로세스 분기 모델( prefork라고도 함)에서 고성능 멀티 스레드 모델 event로 변경되었습니다.

    스레드로부터 안전하지 않은 타사 모듈은 교체하거나 제거해야 합니다. 설정된 MPM을 변경하려면 /etc/httpd/conf.modules.d/00-mpm.conf 파일을 편집합니다. 자세한 내용은 httpd.service(8) 도움말 페이지를 참조하십시오.

  • suEXEC에서 사용자에게 허용되는 최소 UID 및 GID는 각각 1000 및 500입니다(이전에는 100 및 100).
  • /etc/sysconfig/httpd 파일은 httpd 서비스의 환경 변수를 설정하기 위해 지원되는 인터페이스가 아닙니다. systemd 서비스에 httpd.service(8) 도움말 페이지가 추가되었습니다.
  • 이제 httpd 서비스를 중지하면 기본적으로 "중지"가 사용됩니다.
  • mod_auth_kerb 모듈이 mod_auth_gssapi 모듈로 교체되었습니다.

1.3. 설정 업데이트

Red Hat Enterprise Linux 7에 사용된 Apache HTTP Server 버전에서 구성 파일을 업데이트하려면 다음 옵션 중 하나를 선택하십시오.

  • /etc/sysconfig/httpd를 사용하여 환경 변수를 설정하는 경우 대신 systemd 드롭인 파일을 만듭니다.
  • 타사 모듈을 사용하는 경우 스레드 MPM과 호환되는지 확인하십시오.
  • suexec를 사용하는 경우 사용자 및 그룹 ID가 새 최소값을 충족하는지 확인합니다.

다음 명령을 사용하여 구성에 오류가 있는지 확인할 수 있습니다.

# apachectl configtest
Syntax OK

1.4. Apache 구성 파일

기본적으로 httpd 는 시작 후 구성 파일을 읽습니다. 아래 표에 있는 구성 파일 위치 목록을 확인할 수 있습니다.

표 1.2. httpd 서비스 구성 파일

경로설명

/etc/httpd/conf/httpd.conf

기본 구성 파일입니다.

/etc/httpd/conf.d/

기본 구성 파일에 포함된 구성 파일의 보조 디렉토리입니다.

/etc/httpd/conf.modules.d/

Red Hat Enterprise Linux에 패키징된 설치된 동적 모듈을 로드하는 구성 파일의 보조 디렉토리입니다. 기본 구성에서 이러한 구성 파일이 먼저 처리됩니다.

기본 구성은 대부분의 상황에 적합하지만 다른 구성 옵션도 사용할 수 있습니다. 변경 사항을 적용하려면 먼저 웹 서버를 다시 시작합니다.

구성에 가능한 오류가 있는지 확인하려면 쉘 프롬프트에서 다음을 입력합니다.

# apachectl configtest
Syntax OK

실수로부터 더 쉽게 복구하려면 편집하기 전에 원본 파일의 복사본을 만드십시오.

1.5. httpd 서비스 관리

이 섹션에서는 httpd 서비스를 시작, 중지 및 다시 시작하는 방법을 설명합니다.

사전 요구 사항

  • Apache HTTP Server가 설치되어 있어야 합니다.

절차

  • httpd 서비스를 시작하려면 다음을 입력합니다.

    # systemctl start httpd
  • httpd 서비스를 중지하려면 다음을 입력합니다.

    # systemctl stop httpd
  • httpd 서비스를 다시 시작하려면 다음을 입력합니다.

    # systemctl restart httpd

1.6. 단일 인스턴스 Apache HTTP Server 설정

정적 HTML 콘텐츠를 제공하도록 단일 인스턴스 Apache HTTP Server를 설정할 수 있습니다.

웹 서버가 서버와 연결된 모든 도메인에 동일한 콘텐츠를 제공해야 하는 경우 절차를 따르십시오. 도메인마다 다른 콘텐츠를 제공하려면 이름 기반 가상 호스트를 설정합니다. 자세한 내용은 Apache 이름 기반 가상 호스트 구성을 참조하십시오.

절차

  1. httpd 패키지를 설치합니다.

    # yum install httpd
  2. firewalld 를 사용하는 경우 로컬 방화벽에서 TCP 포트 80 을 엽니다.

    # firewall-cmd --permanent --add-port=80/tcp
    # firewall-cmd --reload
  3. httpd 서비스를 활성화하고 시작합니다.

    # systemctl enable --now httpd
  4. 선택 사항: HTML 파일을 /var/www/html/ 디렉터리에 추가합니다.

    참고

    콘텐츠를 /var/www/html/에 추가할 때 기본적으로 httpd가 실행되는 사용자가 파일 및 디렉터리를 읽을 수 있어야 합니다. 콘텐츠 소유자는 root 사용자 및 root 사용자 그룹 또는 다른 사용자 또는 관리자가 선택한 그룹일 수 있습니다. 콘텐츠 소유자가 root 사용자 및 root 사용자 그룹인 경우 다른 사용자가 파일을 읽을 수 있어야 합니다. 모든 파일 및 디렉터리에 대한 SELinux 컨텍스트는 기본적으로 /var/www 디렉터리 내의 모든 콘텐츠에 적용되는 httpd_sys_content_t이어야 합니다.

검증 단계

  • 웹 브라우저와 함께 http://server_IP_or_host_name/에 연결합니다.

    /var/www/html/ 디렉터리가 비어 있거나 index.html 또는 index.htm 파일이 포함되어 있지 않은 경우 Apache에서 Red Hat Enterprise Linux Test Page를 표시합니다. /var/www/html/에 다른 이름의 HTML 파일이 포함된 경우 http://server_IP_or_host_name/example.html과 같은 URL을 해당 파일에 입력하여 로드할 수 있습니다.

추가 리소스

1.7. Apache 이름 기반 가상 호스트 구성

이름 기반 가상 호스트를 사용하면 Apache가 서버의 IP 주소로 해석되는 다양한 도메인에 다양한 콘텐츠를 제공할 수 있습니다.

별도의 문서 루트 디렉터리를 사용하여 example.comexample.net 도메인 모두에 가상 호스트를 설정할 수 있습니다. 두 가상 호스트는 모두 정적 HTML 콘텐츠를 제공합니다.

사전 요구 사항

  • 클라이언트 및 웹 서버는 example.comexample.net 도메인을 웹 서버의 IP 주소로 확인합니다.

    이러한 항목을 DNS 서버에 수동으로 추가해야 합니다.

절차

  1. httpd 패키지를 설치합니다.

    # yum install httpd
  2. /etc/httpd/conf/httpd.conf 파일을 편집합니다.

    1. example.com 도메인에 다음 가상 호스트 구성을 추가합니다.

      <VirtualHost *:80>
          DocumentRoot "/var/www/example.com/"
          ServerName example.com
          CustomLog /var/log/httpd/example.com_access.log combined
          ErrorLog /var/log/httpd/example.com_error.log
      </VirtualHost>

      이러한 설정은 다음을 구성합니다.

      • <VirtualHost *:80> 지시문의 모든 설정은 이 가상 호스트에 따라 다릅니다.
      • DocumentRoot는 가상 호스트의 웹 콘텐츠 경로를 설정합니다.
      • ServerName은 이 가상 호스트가 콘텐츠를 제공하는 도메인을 설정합니다.

        여러 도메인을 설정하려면 ServerAlias 매개 변수를 구성에 추가하고 이 매개 변수에서 공백으로 구분된 추가 도메인을 지정합니다.

      • CustomLog는 가상 호스트의 액세스 로그 경로를 설정합니다.
      • ErrorLog는 가상 호스트의 오류 로그 경로를 설정합니다.

        참고

        Apache는 ServerNameServerAlias 매개 변수에 설정된 도메인과 일치하지 않는 요청에도 구성에 있는 첫 번째 가상 호스트를 사용합니다. 여기에는 서버의 IP 주소로 전송된 요청도 포함됩니다.

  3. example.net 도메인에 대해 유사한 가상 호스트 구성을 추가합니다.

    <VirtualHost *:80>
        DocumentRoot "/var/www/example.net/"
        ServerName example.net
        CustomLog /var/log/httpd/example.net_access.log combined
        ErrorLog /var/log/httpd/example.net_error.log
    </VirtualHost>
  4. 두 가상 호스트 모두에 대한 문서 루트를 생성합니다.

    # mkdir /var/www/example.com/
    # mkdir /var/www/example.net/
  5. /var/www/ 내에 없는 DocumentRoot 매개변수에서 경로를 설정한 경우 두 문서 루트에서 httpd_sys_content_t 컨텍스트를 설정합니다.

    # semanage fcontext -a -t httpd_sys_content_t "/srv/example.com(/.*)?"
    # restorecon -Rv /srv/example.com/
    # semanage fcontext -a -t httpd_sys_content_t "/srv/example.net(/.\*)?"
    # restorecon -Rv /srv/example.net/

    이러한 명령은 /srv/example.com//srv/example.net/ 디렉터리에 httpd_sys_content_t 컨텍스트를 설정합니다.

    restorecon 명령을 실행하려면 policycoreutils-python-utils 패키지를 설치해야 합니다.

  6. firewalld 를 사용하는 경우 로컬 방화벽에서 포트 80 을 엽니다.

    # firewall-cmd --permanent --add-port=80/tcp
    # firewall-cmd --reload
  7. httpd 서비스를 활성화하고 시작합니다.

    # systemctl enable --now httpd

검증 단계

  1. 각 가상 호스트의 문서 루트에 다른 예제 파일을 생성합니다.

    # echo "vHost example.com" > /var/www/example.com/index.html
    # echo "vHost example.net" > /var/www/example.net/index.html
  2. 브라우저를 사용하고 http://example.com에 연결합니다. 웹 서버는 example.com 가상 호스트의 예제 파일을 보여줍니다.
  3. 브라우저를 사용하고 http://example.net에 연결합니다. 웹 서버는 example.net 가상 호스트의 예제 파일을 보여줍니다.

1.8. Apache HTTP 웹 서버에 대한 Kerberos 인증 구성

Apache HTTP 웹 서버에서 Kerberos 인증을 수행하기 위해 RHEL 8에서는 mod_auth_gssapi Apache 모듈을 사용합니다. GSSAPI(Generic Security Services API)는 Kerberos와 같은 보안 라이브러리 사용을 요청하는 애플리케이션의 인터페이스입니다. gssproxy 서비스를 사용하면 httpd 서버에 대해 권한 분리를 구현하여 보안 관점에서 이 프로세스를 최적화할 수 있습니다.

참고

mod_auth_gssapi 모듈은 제거된 mod_auth_kerb 모듈을 대체합니다.

사전 요구 사항

  • httpdgssproxy 패키지가 설치됩니다.
  • Apache 웹 서버가 설정되고 httpd 서비스가 실행 중입니다.

1.8.1. IdM 환경에서 GSS-Proxy 설정

다음 절차에서는 Apache HTTP 웹 서버에서 Kerberos 인증을 수행하기 위해 GSS-Proxy를 설정하는 방법을 설명합니다.

절차

  1. 서비스 주체를 생성하여 HTTP/<SERVER_NAME>@realm 주체의 keytab 파일에 대한 액세스를 활성화합니다.

    # ipa service-add HTTP/<SERVER_NAME>
  2. /etc/gssproxy/http.keytab 파일에 저장된 keytab 탭을 검색합니다.

    # ipa-getkeytab -s $(awk '/^server =/ {print $3}' /etc/ipa/default.conf) -k /etc/gssproxy/http.keytab -p HTTP/$(hostname -f)

    이 단계에서는 권한을 400으로 설정하면 root 사용자만 keytab 파일에 액세스할 수 있습니다. apache 사용자는 그렇지 않습니다.

  3. 다음 콘텐츠를 사용하여 /etc/gssproxy/80-httpd.conf 파일을 만듭니다.

    [service/HTTP]
      mechs = krb5
      cred_store = keytab:/etc/gssproxy/http.keytab
      cred_store = ccache:/var/lib/gssproxy/clients/krb5cc_%U
      euid = apache
  4. gssproxy 서비스를 재시작하고 활성화합니다.

    # systemctl restart gssproxy.service
    # systemctl enable gssproxy.service

추가 리소스

  • gssproxy(8) man pages
  • gssproxy-mech(8) man pages
  • gssproxy.conf(5) man pages

1.8.2. Apache HTTP 웹 서버에서 공유하는 디렉터리에 대한 Kerberos 인증 구성

다음 절차에서는 /var/www/html/private/ 디렉터리에 대한 Kerberos 인증을 구성하는 방법을 설명합니다.

사전 요구 사항

  • gssproxy 서비스가 구성되어 실행 중입니다.

절차

  1. /var/www/html/private/ 디렉터리를 보호하도록 mod_auth_gssapi 모듈을 구성합니다.

    <Location /var/www/html/private>
      AuthType GSSAPI
      AuthName "GSSAPI Login"
      Require valid-user
    </Location>
  2. 시스템 단위 구성 드롭인 파일을 생성합니다.

    # systemctl edit httpd.service
  3. 시스템 드롭인 파일에 다음 매개변수를 추가합니다.

    [Service]
    Environment=GSS_USE_PROXY=1
  4. systemd 구성을 다시 로드합니다.

    # systemctl daemon-reload
  5. httpd 서비스를 다시 시작합니다.

    # systemctl restart httpd.service

검증 단계

  1. Kerberos 티켓을 받습니다.

    # kinit
  2. 브라우저에서 보호된 디렉터리의 URL을 엽니다.

1.9. Apache HTTP Server에서 TLS 암호화 구성

기본적으로 Apache는 암호화되지 않은 HTTP 연결을 사용하여 클라이언트에 콘텐츠를 제공합니다. 이 섹션에서는 TLS 암호화를 활성화하고 Apache HTTP Server에서 자주 사용하는 암호화 관련 설정을 구성하는 방법에 대해 설명합니다.

사전 요구 사항

  • Apache HTTP Server가 설치되어 실행 중입니다.

1.9.1. Apache HTTP Server에 TLS 암호화 추가

example.com 도메인의 Apache HTTP Server에서 TLS 암호화를 활성화할 수 있습니다.

사전 요구 사항

  • Apache HTTP Server가 설치되어 실행 중입니다.
  • 개인 키는 /etc/pki/tls/private/example.com.key 파일에 저장됩니다.

    개인 키 및 CSR(인증서 서명 요청) 생성 및 CA(인증 기관)에서 인증서를 요청하는 방법에 대한 자세한 내용은 CA 문서를 참조하십시오. 또는 CA에서 ACME 프로토콜을 지원하는 경우 mod_md 모듈을 사용하여 TLS 인증서 검색 및 프로비저닝을 자동화할 수 있습니다.

  • TLS 인증서는 /etc/pki/tls/certs/example.com.crt 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계를 조정합니다.
  • CA 인증서는 /etc/pki/tls/certs/ca.crt 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계를 조정합니다.
  • 클라이언트 및 웹 서버는 서버의 호스트 이름을 웹 서버의 IP 주소로 확인합니다.

절차

  1. mod_ssl 패키지를 설치합니다.

    # yum install mod_ssl
  2. /etc/httpd/conf.d/ssl.conf 파일을 편집하고 다음 설정을 <VirtualHost _default_:443> 지시문에 추가합니다.

    1. 서버 이름을 설정합니다.

      ServerName example.com
    중요

    서버 이름은 인증서의 Common Name 필드에 설정된 항목과 일치해야 합니다.

    1. 선택 사항: 인증서에 SAN(Subject Alt Names) 필드에 추가 호스트 이름이 포함된 경우 이러한 호스트 이름에도 TLS 암호화를 제공하도록 mod_ssl을 구성할 수 있습니다. 이를 구성하려면 해당 이름으로 ServerAliases 매개변수를 추가합니다.

      ServerAlias www.example.com server.example.com
    2. 개인 키, 서버 인증서 및 CA 인증서에 대한 경로를 설정합니다.

      SSLCertificateKeyFile "/etc/pki/tls/private/example.com.key"
      SSLCertificateFile "/etc/pki/tls/certs/example.com.crt"
      SSLCACertificateFile "/etc/pki/tls/certs/ca.crt"
  3. 보안상의 이유로 root 사용자만 개인 키 파일에 액세스할 수 있도록 구성합니다.

    # chown root:root /etc/pki/tls/private/example.com.key
    # chmod 600 /etc/pki/tls/private/example.com.key
    주의

    권한이 없는 사용자가 개인 키에 액세스한 경우 인증서를 취소하고 새 개인 키를 만들고 새 인증서를 요청합니다. 그렇지 않으면 TLS 연결이 더 이상 안전하지 않습니다.

  4. firewalld 를 사용하는 경우 로컬 방화벽에서 포트 443 을 엽니다.

    # firewall-cmd --permanent --add-port=443/tcp
    # firewall-cmd --reload
  5. httpd 서비스를 다시 시작합니다.

    # systemctl restart httpd
    참고

    개인 키 파일을 암호로 보호한 경우 httpd 서비스가 시작될 때마다 이 암호를 입력해야 합니다.

검증 단계

  • 브라우저를 사용하고 https://example.com에 연결합니다.

1.9.2. Apache HTTP Server에서 지원되는 TLS 프로토콜 버전 설정

기본적으로 RHEL의 Apache HTTP Server는 최신 브라우저와 호환되는 안전한 기본값을 정의하는 시스템 전체 암호화 정책을 사용합니다. 예를 들어 DEFAULT 정책은 apache에서 TLSv1.2TLSv1.3 프로토콜 버전만 사용하도록 정의합니다.

Apache HTTP Server에서 지원하는 TLS 프로토콜 버전을 수동으로 구성할 수 있습니다. 환경에서 특정 TLS 프로토콜 버전만 활성화해야 하는 경우 절차를 따르십시오. 예를 들면 다음과 같습니다.

  • 환경에 해당 클라이언트가 클라이언트가 취약한 TLS1 (TLSv1.0) 또는 TLS1.1 프로토콜을 사용할 수도 있어야 하는 경우
  • Apache가 TLSv1.2 또는 TLSv1.3 프로토콜만 지원하도록 구성하려는 경우

사전 요구 사항

절차

  1. /etc/httpd/conf/httpd.conf 파일을 편집하고 다음 설정을 TLS 프로토콜 버전을 설정하려는 <VirtualHost> 지시문에 추가합니다. 예를 들어 TLSv1.3 프로토콜만 활성화하려면 다음을 수행합니다.

    SSLProtocol -All TLSv1.3
  2. httpd 서비스를 다시 시작합니다.

    # systemctl restart httpd

검증 단계

  1. 다음 명령을 사용하여 서버가 TLSv1.3을 지원하는지 확인합니다:

    # openssl s_client -connect example.com:443 -tls1_3
  2. 다음 명령을 사용하여 서버가 TLSv1.2를 지원하지 않는지 확인합니다.

    # openssl s_client -connect example.com:443 -tls1_2

    서버가 프로토콜을 지원하지 않으면 명령에서 오류를 반환합니다.

    140111600609088:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:ssl/record/rec_layer_s3.c:1543:SSL alert number 70
  3. 선택 사항: 다른 TLS 프로토콜 버전에 대해 명령을 반복합니다.

추가 리소스

1.9.3. Apache HTTP Server에서 지원되는 암호 설정

기본적으로 Apache HTTP 서버는 최근 브라우저와 호환되는 안전한 기본값을 정의하는 시스템 전체 암호화 정책을 사용합니다. 시스템 전체에서 허용하는 암호 목록은 /etc/crypto-policies/back-ends/openssl.config 파일을 참조하십시오.

Apache HTTP Server에서 지원하는 암호를 수동으로 구성할 수 있습니다. 환경에 특정 암호가 필요한 경우 절차를 따르십시오.

사전 요구 사항

절차

  1. /etc/httpd/conf/httpd.conf 파일을 편집하고 SSLCipherSuite 매개변수를 TLS 암호를 설정하려는 <VirtualHost> 지시문에 추가합니다.

    SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256"

    이 예제에서는 EECDH+AESGCM,EDH+AESGCM,AES256+EECDHAES256+EDH 암호만 활성화하며 SHA1SHA256 메시지 인증 코드(MAC)를 사용하는 모든 암호를 비활성화합니다.

  2. httpd 서비스를 다시 시작합니다.

    # systemctl restart httpd

검증 단계

  1. Apache HTTP Server에서 지원하는 암호 목록을 표시하려면 다음을 수행합니다.

    1. nmap 패키지를 설치합니다.

      # yum install nmap
    2. nmap 유틸리티를 사용하여 지원되는 암호를 표시합니다.

      # nmap --script ssl-enum-ciphers -p 443 example.com
      ...
      PORT    STATE SERVICE
      443/tcp open  https
      | ssl-enum-ciphers:
      |   TLSv1.2:
      |     ciphers:
      |       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
      |       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
      |       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
      ...

추가 리소스

1.10. TLS 클라이언트 인증서 인증 구성

관리자는 클라이언트 인증서 인증을 통해 인증서를 사용하여 인증한 사용자만 웹 서버의 리소스에 액세스할 수 있도록 허용할 수 있습니다. /var/www/html/Example/ 디렉터리에 대한 클라이언트 인증서 인증을 구성할 수 있습니다.

Apache HTTP Server에서 TLS 1.3 프로토콜을 사용하는 경우 특정 클라이언트에 추가 구성이 필요합니다. 예를 들어 Firefox에서 about:config 메뉴의 security.tls.enable_post_handshake_auth 매개 변수를 true로 설정합니다. 자세한 내용은 Red Hat Enterprise Linux 8의 전송 계층 보안 버전 1.3을 참조하십시오.

사전 요구 사항

절차

  1. /etc/httpd/conf/httpd.conf 파일을 편집하고 다음 설정을 클라이언트 인증을 구성하려는 <VirtualHost> 지시문에 추가합니다.

    <Directory "/var/www/html/Example/">
      SSLVerifyClient require
    </Directory>

    SSLverifyClient require를 설정해야 클라이언트가 /var/www/html/Example/ 디렉터리의 콘텐츠에 액세스하기 전에 서버가 클라이언트 인증서의 유효성을 검사해야 합니다.

  2. httpd 서비스를 다시 시작합니다.

    # systemctl restart httpd

검증 단계

  1. curl 유틸리티를 사용하여 클라이언트 인증 없이 https://example.com/Example/ URL에 액세스합니다.

    $ curl https://example.com/Example/
    curl: (56) OpenSSL SSL_read: error:1409445C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required, errno 0

    이 오류는 웹 서버에 클라이언트 인증서 인증이 필요함을 나타냅니다.

  2. 클라이언트 개인 키 및 인증서와 CA 인증서를 curl에 전달하여 클라이언트 인증으로 동일한 URL에 액세스합니다.

    $ curl --cacert ca.crt --key client.key --cert client.crt https://example.com/Example/

    요청이 성공하면 curl/var/www/html/Example/ 디렉터리에 저장된 index.html 파일을 표시합니다.

추가 리소스

1.11. ModSecurity를 사용하여 웹 서버에서 웹 애플리케이션 보안

ModSecurity는 웹 애플리케이션의 보안 위험을 줄일 수 있는 Apache, Nginx 및 IIS와 같은 다양한 웹 서버에서 지원하는 오픈 소스 웹 애플리케이션 방화벽(WAF)입니다. ModSecurity는 서버 구성을 위한 사용자 지정 가능한 규칙 세트를 제공합니다.

mod_security-crs 패키지에는 교차 웹 사이트 스크립팅, 잘못된 사용자 에이전트, SQL 삽입, 트로이 목마, 세션 하이재킹 및 기타 악용에 대한 규칙이 포함된 코어 규칙 세트 (CRS)가 포함되어 있습니다.

1.11.1. Apache에 대한 ModSecurity 웹 기반 애플리케이션 방화벽 배포

ModSecurity를 배포하여 웹 서버에서 웹 기반 애플리케이션을 실행하는 것과 관련된 위험을 줄이려면 Apache HTTP 서버에 대한 mod_securitymod_security_crs 패키지를 설치하십시오. mod_security_crs 패키지는 ModSecurity 웹 기반 애플리케이션 방화벽(WAF) 모듈에 대한 코어 규칙 세트(CRS)를 제공합니다.

절차

  1. mod_security,mod_security_crs, httpd 패키지를 설치합니다.

    # yum install -y mod_security mod_security_crs httpd
  2. httpd 서버를 시작합니다.

    # systemctl restart httpd

검증

  1. Apache HTTP 서버에서 ModSecurity 웹 기반 애플리케이션 방화벽이 활성화되어 있는지 확인합니다.

    # httpd -M | grep security
     security2_module (shared)
  2. /etc/httpd/modsecurity.d/activated_rules/ 디렉터리에 mod_security_crs 에서 제공하는 규칙이 포함되어 있는지 확인합니다.

    # ls /etc/httpd/modsecurity.d/activated_rules/
    ...
    REQUEST-921-PROTOCOL-ATTACK.conf
    REQUEST-930-APPLICATION-ATTACK-LFI.conf
    ...

1.11.2. ModSecurity에 사용자 정의 규칙 추가

ModSecurity 코어 규칙 세트(CRS)에 포함된 규칙이 시나리오에 맞지 않고 추가 가능한 공격을 방지하려면 ModSecurity 웹 기반 애플리케이션 방화벽에서 사용하는 규칙 세트에 사용자 지정 규칙을 추가할 수 있습니다. 다음 예제에서는 간단한 규칙을 추가하는 방법을 보여줍니다. 더 복잡한 규칙을 생성하려면 ModSecurity anchor 웹 사이트의 참조 설명서를 참조하십시오.

사전 요구 사항

  • Apache에 대한 ModSecurity가 설치 및 활성화되어 있습니다.

절차

  1. 선택한 텍스트 편집기에서 /etc/httpd/conf.d/mod_security.conf 파일을 엽니다. 예를 들면 다음과 같습니다.

    # vi /etc/httpd/conf.d/mod_security.conf
  2. SecRuleEngine On 으로 시작하는 행 뒤에 다음 예제 규칙을 추가합니다.

    SecRule ARGS:data "@contains evil" "deny,status:403,msg:'param data contains evil data',id:1"

    이전 규칙은 data 매개변수에 사악한 문자열이 포함된 경우 사용자에게 리소스 사용을 금지합니다.

  3. 변경 사항을 저장하고 편집기를 종료합니다.
  4. httpd 서버를 다시 시작합니다.

    # systemctl restart httpd

검증

  1. 테스트.html 페이지를 만듭니다.

    # echo "mod_security test" > /var/www/html/test.html
  2. httpd 서버를 다시 시작합니다.

    # systemctl restart httpd
  3. HTTP 요청의 GET 변수에 악성 데이터가 없는 test.html 을 요청합니다.

    $ curl http://localhost/test.html?data=good
    
    mod_security test
  4. HTTP 요청의 GET 변수에 악성 데이터가 있는 test.html 을 요청합니다.

    $ curl localhost/test.html?data=xxxevilxxx
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>403 Forbidden</title>
    </head><body>
    <h1>Forbidden</h1>
    <p>You do not have permission to access this resource.</p>
    </body></html>
  5. /var/log/httpd/error_log 파일을 확인하고 잘못된 데이터 메시지가 포함된 param 데이터로 액세스를 거부하는 방법에 대한 로그 항목을 찾습니다.

    [Wed May 25 08:01:31.036297 2022] [:error] [pid 5839:tid 139874434791168] [client ::1:45658] [client ::1] ModSecurity: Access denied with code 403 (phase 2). String match "evil" at ARGS:data. [file "/etc/httpd/conf.d/mod_security.conf"] [line "4"] [id "1"] [msg "param data contains evil data"] [hostname "localhost"] [uri "/test.html"] [unique_id "Yo4amwIdsBG3yZqSzh2GuwAAAIY"]

추가 리소스

1.12. Apache HTTP Server 수동 설치

Apache HTTP Server 설명서를 설치할 수 있습니다. 이 설명서는 다음과 같은 자세한 문서를 제공합니다. 예를 들면 다음과 같습니다.

  • 구성 매개변수 및 지시문
  • 성능 튜닝
  • 인증 설정
  • 모듈
  • 컨텐츠 캐싱
  • 보안 팁
  • TLS 암호화 구성

설명서를 설치한 후 웹 브라우저를 사용하여 표시할 수 있습니다.

사전 요구 사항

  • Apache HTTP Server가 설치되어 실행 중입니다.

절차

  1. httpd-manual 패키지를 설치합니다.

    # yum install httpd-manual
  2. 선택 사항: 기본적으로 Apache HTTP 서버에 연결하는 모든 클라이언트는 설명서를 표시할 수 있습니다. 192.0.2.0/24 서브넷과 같은 특정 IP 범위에 대한 액세스를 제한하려면 /etc/httpd/conf.d/manual.conf 파일을 편집하고 Require ip 192.0.2.0/24 설정을 <Directory "/usr/share/httpd/manual"> 지시문에 추가합니다.

    <Directory "/usr/share/httpd/manual">
    ...
        Require ip 192.0.2.0/24
    ...
    </Directory>
  3. httpd 서비스를 다시 시작합니다.

    # systemctl restart httpd

검증 단계

  1. Apache HTTP Server 설명서를 표시하려면 웹 브라우저로 http://host_name_or_IP_address/manual/에 연결합니다.

1.13. Apache 모듈 작업

httpd 서비스는 모듈식 애플리케이션이며 여러 동적 공유 오브젝트 (DSOs)로 확장할 수 있습니다. 동적 공유 오브젝트 는 필요에 따라 런타임 시 동적으로 로드하거나 언로드할 수 있는 모듈입니다. 이러한 모듈은 /usr/lib64/httpd/modules/ 디렉터리에서 찾을 수 있습니다.

1.13.1. DSO 모듈 로드

관리자는 서버가 로드해야 하는 모듈을 구성하여 서버에 포함할 기능을 선택할 수 있습니다. 특정 DSO 모듈을 로드하려면 LoadModule 지시문을 사용합니다. 별도의 패키지에서 제공하는 모듈에는 /etc/httpd/conf.modules.d/ 디렉터리에 고유한 구성 파일이 있는 경우가 많습니다.

사전 요구 사항

  • httpd 패키지가 설치되어 있습니다.

절차

  1. /etc/httpd/conf.modules.d/ 디렉터리의 구성 파일에서 모듈 이름을 검색합니다.

    # grep mod_ssl.so /etc/httpd/conf.modules.d/*
  2. 모듈 이름을 찾은 구성 파일을 편집하고 모듈의 LoadModule 지시문의 주석을 제거합니다.

    LoadModule ssl_module modules/mod_ssl.so
  3. 예를 들어 RHEL 패키지가 모듈을 제공하지 않기 때문에 모듈을 찾을 수 없는 경우 다음 지시문을 사용하여 /etc/httpd/conf.modules.d/30-example.conf 와 같은 구성 파일을 만듭니다.

    LoadModule ssl_module modules/<custom_module>.so
  4. httpd 서비스를 다시 시작합니다.

    # systemctl restart httpd

1.13.2. 사용자 정의 Apache 모듈 컴파일

모듈을 컴파일하는 데 필요한 파일, 헤더 파일 및 APache eXtenSion (apxs) 유틸리티가 포함된 httpd-devel 패키지의 도움말을 사용하여 자체 모듈을 생성하고 빌드할 수 있습니다.

사전 요구 사항

  • httpd-devel 패키지가 설치되어 있어야 합니다.

절차

  • 다음 명령을 사용하여 사용자 정의 모듈을 빌드합니다.

    # apxs -i -a -c module_name.c

1.14. Apache 웹 서버 구성에서 사용하기 위해 NSS 데이터베이스에서 개인 키 및 인증서 내보내기

RHEL 8에서는 더 이상 Apache 웹 서버에 mod_nss 모듈을 제공하지 않으며, Red Hat은 mod_ssl 모듈을 사용하는 것이 좋습니다. 예를 들어 웹 서버를 RHEL 7에서 RHEL 8로 마이그레이션했기 때문에 개인 키와 인증서를 NSS(Network Security Services) 데이터베이스에 저장하는 경우 다음 절차에 따라 PEM(개인 정보 보호 보안 메일) 형식으로 키와 인증서를 추출합니다. 그런 다음 Apache HTTP 서버에서 TLS 암호화 구성에 설명된 대로 mod_ssl 구성의 파일을 사용할 수 있습니다.

이 절차에서는 NSS 데이터베이스가 /etc/httpd/alias/에 저장되고 내보낸 개인 키와 인증서를 /etc/pki/tls/ 디렉터리에 저장하는 것으로 가정합니다.

사전 요구 사항

  • 개인 키, 인증서 및 CA(인증 기관) 인증서는 NSS 데이터베이스에 저장됩니다.

절차

  1. NSS 데이터베이스의 인증서를 나열합니다.

    # certutil -d /etc/httpd/alias/ -L
    Certificate Nickname           Trust Attributes
                                   SSL,S/MIME,JAR/XPI
    
    Example CA                     C,,
    Example Server Certificate     u,u,u

    다음 단계에서 인증서의 닉네임이 필요합니다.

  2. 개인 키를 추출하려면 일시적으로 PKCS #12 파일로 키를 내보내야 합니다.

    1. 개인 키와 연결된 인증서의 닉네임을 사용하여 PKCS #12 파일로 키를 내보냅니다.

      # pk12util -o /etc/pki/tls/private/export.p12 -d /etc/httpd/alias/ -n "Example Server Certificate"
      Enter password for PKCS12 file: password
      Re-enter password: password
      pk12util: PKCS12 EXPORT SUCCESSFUL

      PKCS #12 파일에 암호를 설정해야 합니다. 다음 단계에서 이 암호가 필요합니다.

    2. PKCS #12 파일에서 개인 키를 내보냅니다.

      # openssl pkcs12 -in /etc/pki/tls/private/export.p12 -out /etc/pki/tls/private/server.key -nocerts -nodes
      Enter Import Password: password
      MAC verified OK
    3. 임시 PKCS #12 파일을 삭제합니다.

      # rm /etc/pki/tls/private/export.p12
  3. root 사용자만 이 파일에 액세스할 수 있도록 /etc/pki/tls/private/server.key에 대한 권한을 설정합니다.

    # chown root:root /etc/pki/tls/private/server.key
    # chmod 0600 /etc/pki/tls/private/server.key
  4. NSS 데이터베이스에서 서버 인증서의 닉네임을 사용하여 CA 인증서를 내보냅니다.

    # certutil -d /etc/httpd/alias/ -L -n "Example Server Certificate" -a -o /etc/pki/tls/certs/server.crt
  5. root 사용자만 이 파일에 액세스할 수 있도록 /etc/pki/tls/certs/server.crt에 대한 권한을 설정합니다.

    # chown root:root /etc/pki/tls/certs/server.crt
    # chmod 0600 /etc/pki/tls/certs/server.crt
  6. NSS 데이터베이스에서 CA 인증서의 닉네임을 사용하여 CA 인증서를 내보냅니다.

    # certutil -d /etc/httpd/alias/ -L -n "Example CA" -a -o /etc/pki/tls/certs/ca.crt
  7. Apache HTTP 서버에서 TLS 암호화 구성을 따라 Apache 웹 서버를 구성하고 다음을 수행합니다.

    • SSLCertificateKeyFile 매개변수를 /etc/pki/tls/private/server.key로 설정합니다.
    • SSLCertificateFile 매개변수를 /etc/pki/tls/certs/server.crt로 설정합니다.
    • SSLCACertificateFile 매개변수를 /etc/pki/tls/certs/ca.crt로 설정합니다.

추가 리소스

  • certutil(1) 매뉴얼 페이지
  • pk12util(1) man page
  • pkcs12(1ssl) 매뉴얼 페이지

1.15. 추가 리소스

2장. NGINX 설정 및 구성

NGINX는 다음과 같이 사용할 수 있는 고성능 모듈식 서버입니다.

  • 웹 서버
  • 역방향 프록시
  • 로드 밸런서

이 섹션에서는 이러한 시나리오에서 NGINX를 수행하는 방법을 설명합니다.

2.1. NGINX 설치 및 준비

Red Hat은 애플리케이션 스트림을 사용하여 다양한 버전의 NGINX를 제공합니다. 다음을 수행할 수 있습니다.

  • 스트림 선택 및 NGINX를 설치
  • 방화벽에서 필요한 포트를 열기
  • nginx 서비스 활성화 및 시작

기본 구성을 사용하여 NGINX는 포트 80의 웹 서버로 실행되며 /usr/share/nginx/html/ 디렉터리에서 콘텐츠를 제공합니다.

사전 요구 사항

  • RHEL 8이 설치되어 있습니다.
  • 호스트가 Red Hat 고객 포털에 가입되어 있습니다.
  • firewalld 서비스가 활성화 및 시작됩니다.

절차

  1. 사용 가능한 NGINX 모듈 스트림을 표시합니다.

    # yum module list nginx
    Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
    Name        Stream        Profiles        Summary
    nginx       1.14 [d]      common [d]      nginx webserver
    nginx       1.16          common [d]      nginx webserver
    ...
    
    Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
  2. 기본값과 다른 스트림을 설치하려면 스트림을 선택합니다.

    # yum module enable nginx:stream_version
  3. nginx 패키지를 설치합니다.

    # yum install nginx
  4. NGINX가 방화벽에 서비스를 제공해야 하는 포트를 엽니다. 예를 들어 firewalld에서 HTTP(포트 80) 및 HTTPS(포트 443)의 기본 포트를 열려면 다음을 입력합니다.

    # firewall-cmd --permanent --add-port={80/tcp,443/tcp}
    # firewall-cmd --reload
  5. 시스템이 부팅될 때 nginx 서비스가 자동으로 시작되도록 활성화합니다.

    # systemctl enable nginx
  6. 선택적으로 nginx 서비스를 시작합니다.

    # systemctl start nginx

    기본 구성을 사용하지 않으려면 서비스를 시작하기 전에 이 단계를 건너뛰고 그에 따라 NGINX를 구성합니다.

검증 단계

  1. yum 유틸리티를 사용하여 nginx 패키지가 설치되었는지 확인합니다.

    # yum list installed nginx
    Installed Packages
    nginx.x86_64    1:1.14.1-9.module+el8.0.0+4108+af250afe    @rhel-8-for-x86_64-appstream-rpms
  2. NGINX가 서비스를 제공해야 하는 포트가 firewalld에 열려 있는지 확인합니다.

    # firewall-cmd --list-ports
    80/tcp 443/tcp
  3. nginx 서비스가 활성화되었는지 확인합니다.

    # systemctl is-enabled nginx
    enabled

추가 리소스

2.2. 다른 도메인에 다른 콘텐츠를 제공하는 웹 서버로 NGINX 구성

기본적으로 NGINX는 서버의 IP 주소와 연결된 모든 도메인 이름에 대해 클라이언트에 동일한 콘텐츠를 제공하는 웹 서버 역할을 합니다. 다음 절차에서는 NGINX를 구성하는 방법을 설명합니다.

  • /var/www/example.com/ 디렉터리의 콘텐츠를 사용하여 example.com도메인에 요청을 처리하는 방법
  • /var/www/example.net/ 디렉터리의 콘텐츠를 사용하여 example.net 도메인에 요청을 제공하는 방법
  • 다른 모든 요청(예: 서버의 IP 주소 또는 서버의 IP 주소와 연관된 다른 도메인)에 /usr/share/nginx/html/ 대한 디렉터리의 콘텐츠를 제공하는 방법

사전 요구 사항

  • NGINX가 설치되어 있어야 합니다.
  • 클라이언트 및 웹 서버는 example.comexample.net 도메인을 웹 서버의 IP 주소로 확인합니다.

    이러한 항목을 DNS 서버에 수동으로 추가해야 합니다.

절차

  1. /etc/nginx/nginx.conf 파일을 편집합니다.

    1. 기본적으로 /etc/nginx/nginx.conf 파일에는 catch-all 구성이 이미 포함되어 있습니다. 구성에서 이 부분을 삭제한 경우 /etc/nginx/nginx.conf 파일의 http 블록에 다음 server 블록을 다시 추가합니다.

      server {
          listen       80 default_server;
          listen       [::]:80 default_server;
          server_name  _;
          root         /usr/share/nginx/html;
      }

      이러한 설정은 다음을 구성합니다.

      • listen 지시문은 서비스에서 수신 대기하는 IP 주소와 포트를 정의합니다. 이 경우 NGINX는 모든 IPv4 및 IPv6 주소의 포트 80에서 수신 대기합니다. default_server 매개 변수는 NGINX가 이 server 블록을 IP 주소 및 포트와 일치하는 요청의 기본값으로 사용함을 나타냅니다.
      • server_name 매개 변수는 이 server 블록을 담당하는 호스트 이름을 정의합니다. server_name_로 설정하여 이 server 블록의 모든 호스트 이름을 수락하도록 NGINX를 구성합니다.
      • root 지시문은 이 server 블록의 웹 콘텐츠 경로를 설정합니다.
    2. example.com 도메인에 대한 유사한 server 블록을 http 블록에 추가합니다.

      server {
          server_name  example.com;
          root         /var/www/example.com/;
          access_log   /var/log/nginx/example.com/access.log;
          error_log    /var/log/nginx/example.com/error.log;
      }
      • access_log 지시문은 이 도메인에 대한 별도의 액세스 로그 파일을 정의합니다.
      • error_log 지시문은 이 도메인에 대한 별도의 오류 로그 파일을 정의합니다.
    3. example.net 도메인에 대한 유사한 server 블록을 http 블록에 추가합니다.

      server {
          server_name  example.net;
          root         /var/www/example.net/;
          access_log   /var/log/nginx/example.net/access.log;
          error_log    /var/log/nginx/example.net/error.log;
      }
  2. 두 도메인의 root 디렉터리를 생성합니다.

    # mkdir -p /var/www/example.com/
    # mkdir -p /var/www/example.net/
  3. 두 root 디렉터리에 httpd_sys_content_t 컨텍스트를 설정합니다.

    # semanage fcontext -a -t httpd_sys_content_t "/var/www/example.com(/.*)?"
    # restorecon -Rv /var/www/example.com/
    # semanage fcontext -a -t httpd_sys_content_t "/var/www/example.net(/.\*)?"
    # restorecon -Rv /var/www/example.net/

    이러한 명령은 /var/www/example.com//var/www/example.net/ 디렉터리에 httpd_sys_content_t 컨텍스트를 설정합니다.

    restorecon 명령을 실행하려면 policycoreutils-python-utils 패키지를 설치해야 합니다.

  4. 두 도메인의 로그 디렉터리를 생성합니다.

    # mkdir /var/log/nginx/example.com/
    # mkdir /var/log/nginx/example.net/
  5. nginx 서비스를 다시 시작합니다.

    # systemctl restart nginx

검증 단계

  1. 각 가상 호스트의 문서 루트에 다른 예제 파일을 생성합니다.

    # echo "Content for example.com" > /var/www/example.com/index.html
    # echo "Content for example.net" > /var/www/example.net/index.html
    # echo "Catch All content" > /usr/share/nginx/html/index.html
  2. 브라우저를 사용하고 http://example.com에 연결합니다. 웹 서버는 /var/www/example.com/index.html 파일의 예제 콘텐츠를 표시합니다.
  3. 브라우저를 사용하고 http://example.net에 연결합니다. 웹 서버는 /var/www/example.net/index.html 파일의 예제 콘텐츠를 표시합니다.
  4. 브라우저를 사용하고 http://IP_address_of_the_server 에 연결합니다. 웹 서버는 /usr/share/nginx/html/index.html 파일의 예제 콘텐츠를 표시합니다.

2.3. NGINX 웹 서버에 TLS 암호화 추가

example.com 도메인의 NGINX 웹 서버에서 TLS 암호화를 활성화할 수 있습니다.

사전 요구 사항

  • NGINX가 설치되어 있어야 합니다.
  • 개인 키는 /etc/pki/tls/private/example.com.key 파일에 저장됩니다.

    개인 키 및 CSR(인증서 서명 요청) 생성 및 CA(인증 기관)에서 인증서를 요청하는 방법에 대한 자세한 내용은 CA 문서를 참조하십시오.

  • TLS 인증서는 /etc/pki/tls/certs/example.com.crt 파일에 저장됩니다. 다른 경로를 사용하는 경우 절차의 해당 단계를 조정합니다.
  • CA 인증서가 서버의 TLS 인증서 파일에 추가되었습니다.
  • 클라이언트 및 웹 서버는 서버의 호스트 이름을 웹 서버의 IP 주소로 확인합니다.
  • 포트 443은 로컬 방화벽에서 열려 있습니다.

절차

  1. /etc/nginx/nginx.conf 파일을 편집하고 다음 server 블록을 구성의 http 블록에 추가합니다.

    server {
        listen              443 ssl;
        server_name         example.com;
        root                /usr/share/nginx/html;
        ssl_certificate     /etc/pki/tls/certs/example.com.crt;
        ssl_certificate_key /etc/pki/tls/private/example.com.key;
    }
  2. 보안상의 이유로 root 사용자만 개인 키 파일에 액세스할 수 있도록 구성합니다.

    # chown root:root /etc/pki/tls/private/example.com.key
    # chmod 600 /etc/pki/tls/private/example.com.key
    주의

    권한이 없는 사용자가 개인 키에 액세스한 경우 인증서를 취소하고 새 개인 키를 만들고 새 인증서를 요청합니다. 그렇지 않으면 TLS 연결이 더 이상 안전하지 않습니다.

  3. nginx 서비스를 다시 시작합니다.

    # systemctl restart nginx

검증 단계

  • 브라우저를 사용하고 https://example.com에 연결

2.4. NGINX를 HTTP 트래픽의 역방향 프록시로 구성

HTTP 트래픽의 역방향 프록시로 작동하도록 NGINX 웹 서버를 구성할 수 있습니다. 예를 들어 이 기능을 사용하여 요청을 원격 서버의 특정 하위 디렉터리에 전달할 수 있습니다. 클라이언트 화면에서 클라이언트는 액세스하는 호스트에서 콘텐츠를 로드합니다. 그러나 NGINX는 원격 서버에서 실제 콘텐츠를 로드하여 클라이언트로 전달합니다.

이 절차에서는 웹 서버의 /example 디렉터리로 트래픽을 URL https://example.com으로 전달하는 방법을 설명합니다.

사전 요구 사항

  • NGINX는 NGINX 설치 및 준비에 설명된 대로 설치됩니다.
  • 선택 사항: TLS 암호화는 역방향 프록시에서 활성화됩니다.

절차

  1. /etc/nginx/nginx.conf 파일을 편집하고 역방향 프록시를 제공해야 하는 server 블록에 다음 설정을 추가합니다.

    location /example {
        proxy_pass https://example.com;
    }

    location 블록은 NGINX가 /example 디렉터리의 모든 요청을 https://example.com으로 전달하도록 정의합니다.

  2. SELinux가 NGINX가 트래픽을 전달할 수 있도록 httpd_can_network_connect SELinux 부울 매개변수를 1로 설정합니다.

    # setsebool -P httpd_can_network_connect 1
  3. nginx 서비스를 다시 시작합니다.

    # systemctl restart nginx

검증 단계

  • 브라우저를 사용하여 http://host_name/example에 연결하면 https://example.com 내용이 표시됩니다.

2.5. NGINX를 HTTP 로드 밸런서로 구성

NGINX 역방향 프록시 기능을 사용하여 트래픽을 로드 밸런싱할 수 있습니다. 이 절차에서는 NGINX를 활성 연결 수가 가장 적은 다른 서버에 요청을 보내는 HTTP 로드 밸런서 장치로 구성하는 방법을 설명합니다. 두 서버를 모두 사용할 수 없는 경우 절차에서는 폴백 이유로 세 번째 호스트도 정의합니다.

사전 요구 사항

절차

  1. /etc/nginx/nginx.conf 파일을 편집하고 다음 설정을 추가합니다.

    http {
        upstream backend {
            least_conn;
            server server1.example.com;
            server server2.example.com;
            server server3.example.com backup;
        }
    
        server {
            location / {
                proxy_pass http://backend;
            }
        }
    }

    backend라는 호스트 그룹의 least_conn 지시문은 활성 연결 수가 가장 적은 호스트에 따라 NGINX가 server1.example.com 또는 server2.example.com에 요청을 보냅니다. NGINX에서는 다른 두 호스트를 사용할 수 없는 경우에만 server3.example.com을 백업으로 사용합니다.

    proxy_pass 지시문을 http://backend 로 설정하면 NGINX는 역방향 프록시 역할을 하며 backend 호스트 그룹을 사용하여 이 그룹의 설정에 따라 요청을 분산합니다.

    least_conn 로드 밸런싱 방법 대신 다음을 지정할 수 있습니다.

    • 라운드 로빈을 사용하고 서버 간에 요청을 균등하게 배포하는 방법은 없습니다.
    • ip_hash는 IPv4 주소의 처음 세 옥텟 또는 클라이언트의 전체 IPv6 주소에서 계산된 해시를 기반으로 한 클라이언트 주소에서 동일한 서버로 요청을 전송합니다.
    • 문자열, 변수 또는 둘 다 조합일 수 있는 사용자 정의 키를 기반으로 서버를 결정하는 hash 입니다. consistent 매개 변수는 사용자 정의 해시 키 값을 기반으로 NGINX가 모든 서버에 요청을 배포하도록 구성합니다.
    • random은 무작위로 선택된 서버로 요청을 보냅니다.
  2. nginx 서비스를 다시 시작합니다.

    # systemctl restart nginx

2.6. 추가 리소스

3장. Samba를 서버로 사용

Samba는 Red Hat Enterprise Linux에서 SMB(Server Message Block) 프로토콜을 구현합니다. SMB 프로토콜은 파일 공유 및 공유 프린터와 같은 서버의 리소스에 액세스하는 데 사용됩니다. 또한 Samba는 Microsoft Windows에서 사용하는 DCE RPC(Distributed Computing Environment Remote Procedure Call) 프로토콜을 구현합니다.

다음과 같이 Samba를 실행할 수 있습니다.

  • Active Directory(AD) 또는 NT4 도메인 구성원
  • 독립 실행형 서버
  • NT4 PDC(기본 도메인 컨트롤러) 또는 백업 도메인 컨트롤러(BDC)

    참고

    Red Hat은 NT4 도메인을 지원하는 Windows 버전이 있는 기존 설치에서만 PDC 및 BDC 모드를 지원합니다. Windows 7 및 Windows Server 2008 R2 이외의 Microsoft 운영 체제에서 NT4 도메인을 지원하지 않기 때문에 새 Samba NT4 도메인을 설정하지 않는 것이 좋습니다.

    Red Hat은 Samba를 AD DC(Domain Controller)로 실행하는 것을 지원하지 않습니다.

설치 모드와는 독립적으로 디렉터리와 프린터를 선택적으로 공유할 수 있습니다. 그러면 Samba가 파일 및 인쇄 서버로 작동할 수 있습니다.

3.1. 다양한 Samba 서비스 및 모드 이해

samba 패키지는 여러 서비스를 제공합니다. 환경 및 구성하려는 시나리오에 따라 이러한 서비스 중 하나 이상이 필요하며 다양한 모드에서 Samba를 구성합니다.

3.1.1. Samba 서비스

Samba는 다음 서비스를 제공합니다.

smbd

이 서비스는 SMB 프로토콜을 사용하여 파일 공유 및 인쇄 서비스를 제공합니다. 또한 서비스는 리소스 잠금을 담당하고 사용자 연결을 인증합니다. 도메인 멤버를 인증하기 위해 smbd 에는 winbindd 가 필요합니다. smb systemd 서비스는 smbd 데몬을 시작하고 중지합니다.

smbd 서비스를 사용하려면 samba 패키지를 설치합니다.

nmbd

이 서비스는 NetBIOS over IPv4 프로토콜을 사용하여 호스트 이름 및 IP 확인을 제공합니다. 이름 확인 외에도 nmbd 서비스를 사용하면 SMB 네트워크를 검색하여 도메인, 작업 그룹, 호스트, 파일 공유 및 프린터를 찾을 수 있습니다. 이를 위해 서비스는 이 정보를 브로드캐스트 클라이언트에 직접 보고하거나 로컬 또는 마스터 브라우저로 전달합니다. nmb systemd 서비스는 nmbd 데몬을 시작하고 중지합니다.

최신 SMB 네트워크는 DNS를 사용하여 클라이언트 및 IP 주소를 확인합니다. Kerberos의 경우 작동 중인 DNS 설정이 필요합니다.

nmbd 서비스를 사용하려면 samba 패키지를 설치합니다.

winbindd

이 서비스는 로컬 시스템에서 AD 또는 NT4 도메인 사용자 및 그룹을 사용할 수 있도록 NSS(Name Service Switch)에 대한 인터페이스를 제공합니다. 예를 들어, 도메인 사용자는 Samba 서버 또는 다른 로컬 서비스에 호스팅된 서비스에 대해 인증할 수 있습니다. winbind systemd 서비스는 winbindd 데몬을 시작하고 중지합니다.

Samba를 도메인 멤버로 설정하는 경우, smbd 서비스보다 먼저 winbindd를 시작해야 합니다. 그렇지 않으면 도메인 사용자 및 그룹을 로컬 시스템에서 사용할 수 없습니다.

winbindd 서비스를 사용하려면 samba-winbind 패키지를 설치합니다.

중요

Red Hat은 도메인 사용자 및 그룹을 로컬 시스템에 제공하기 위해 winbindd 서비스가 있는 서버로만 Samba 실행을 지원합니다. ACL(Windows Access Control List) 지원 및 NTLM(NT LAN Manager) 대체와 같은 특정 제한 사항으로 인해 SSSD는 지원되지 않습니다.

3.1.2. Samba 보안 서비스

/etc/samba/smb.conf 파일의 [global] 섹션에 있는 security 매개 변수는 Samba가 서비스에 연결하는 사용자를 인증하는 방법을 관리합니다. Samba를 설치하는 모드에 따라 매개 변수를 다른 값으로 설정해야 합니다.

AD 도메인 구성원에서 security = ads를 설정

이 모드에서 Samba는 Kerberos를 사용하여 AD 사용자를 인증합니다.

Samba를 도메인 멤버로 설정하는 방법에 대한 자세한 내용은 Setting up Samba as an AD domain member server 를 참조하십시오.

독립 실행형 서버에서 security = user 설정

이 모드에서 Samba는 로컬 데이터베이스를 사용하여 연결 사용자를 인증합니다.

Samba를 독립 실행형 서버로 설정하는 방법에 대한 자세한 내용은 Samba를 독립 실행형 서버로 설정을 참조하십시오.

NT4 PDC 또는 BDC에서 security = user를 설정
이 모드에서 Samba는 로컬 또는 LDAP 데이터베이스로 사용자를 인증합니다.
NT4 도메인 멤버에서 security = domain설정

이 모드에서 Samba는 사용자를 NT4 PDC 또는 BDC에 연결하는 것을 인증합니다. AD 도메인 구성원에서는 이 모드를 사용할 수 없습니다.

Samba를 도메인 멤버로 설정하는 방법에 대한 자세한 내용은 Setting up Samba as an AD domain member server 를 참조하십시오.

추가 리소스

  • smb.conf(5) 도움말 페이지의 security 매개변수

3.1.3. Samba 서비스 및 Samba 클라이언트 유틸리티가 구성을 로드 및 다시 로드하는 시나리오

다음은 Samba 서비스 및 유틸리티가 설정을 로드하고 다시 로드하는 경우를 설명합니다.

  • Samba 서비스는 설정을 다시 로드합니다.

    • 자동으로 3분마다
    • 예를 들어, manual 요청에서 smbcontrol all reload-config 명령을 실행하는 경우입니다.
  • Samba 클라이언트 유틸리티는 처음 시작할 때만 구성을 읽습니다.

security 등의 특정 매개 변수를 사용하려면 smb 서비스를 다시 시작해야 하며 다시 로드하는 것만으로는 충분하지 않습니다.

추가 리소스

  • smb.conf(5) 도움말 페이지의 구성 변경 내용 적용 방법
  • smbd(8), nmbd(8)winbindd(8) 도움말 페이지

3.1.4. 안전한 방식으로 Samba 구성 편집

Samba 서비스는 3분마다 구성을 자동으로 다시 로드합니다. testparm 유틸리티를 사용하여 구성을 확인하기 전에 서비스가 변경 사항을 다시 로드하지 못하도록 안전한 방식으로 Samba 구성을 편집할 수 있습니다.

사전 요구 사항

  • Samba가 설치되어 있어야 합니다.

절차

  1. /etc/samba/smb.conf 파일의 사본을 생성합니다.

    # cp /etc/samba/smb.conf /etc/samba/samba.conf.copy
  2. 복사한 파일을 편집하고 필요한 사항을 변경합니다.
  3. /etc/samba/samba.conf.copy 파일에서 구성을 확인합니다.

    # testparm -s /etc/samba/samba.conf.copy

    testparm이 오류를 보고하면 오류를 수정하고 명령을 다시 실행합니다.

  4. /etc/samba/smb.conf 파일을 새 구성으로 재정의합니다.

    # mv /etc/samba/samba.conf.copy /etc/samba/smb.conf
  5. Samba 서비스가 구성을 자동으로 다시 로드하거나 구성을 수동으로 다시 로드할 때까지 기다립니다.

    # smbcontrol all reload-config

3.2. testparm 유틸리티를 사용하여 smb.conf 파일 확인

testparm 유틸리티는 /etc/samba/smb.conf 파일의 Samba 구성이 올바른지 확인합니다. 유틸리티는 잘못된 매개 변수와 값을 감지하지만 ID 매핑과 같은 잘못된 설정도 탐지합니다. testparm이 문제를 보고하지 않으면 Samba 서비스가 /etc/samba/smb.conf 파일을 로드합니다. testparm은 구성된 서비스가 사용 가능한지 또는 예상대로 작동하는지 확인할 수 없습니다.

중요

Red Hat은 이 파일을 수정한 후 testparm을 사용하여 /etc/samba/smb.conf 파일을 확인하는 것이 좋습니다.

사전 요구 사항

  • Samba가 설치되어 있어야 합니다.
  • /etc/samba/smb.conf 파일을 종료합니다.

절차

  1. testparm 유틸리티를 root 사용자로 실행합니다.

    # testparm
    Load smb config files from /etc/samba/smb.conf
    rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
    Unknown parameter encountered: "log levell"
    Processing section "[example_share]"
    Loaded services file OK.
    ERROR: The idmap range for the domain * (tdb) overlaps with the range of DOMAIN (ad)!
    
    Server role: ROLE_DOMAIN_MEMBER
    
    Press enter to see a dump of your service definitions
    
    # Global parameters
    [global]
    	...
    
    [example_share]
    	...

    이전 예제 출력에서는 존재하지 않는 매개 변수와 잘못된 ID 매핑 구성을 보고합니다.

  2. testparm이 구성에 잘못된 매개 변수, 값 또는 기타 오류를 보고하면 문제를 수정하고 유틸리티를 다시 실행합니다.

3.3. 독립 실행형 서버로 Samba 설정

Samba를 도메인의 멤버가 아닌 서버로 설정할 수 있습니다. 이 설치 모드에서 Samba는 중앙 DC가 아니라 로컬 데이터베이스로 사용자를 인증합니다. 또한 게스트 액세스를 활성화하여 사용자가 인증 없이 하나 이상의 서비스에 연결할 수 있습니다.

3.3.1. 독립 실행형 서버에 대한 서버 구성 설정

Samba 독립 실행형 서버에 대한 서버 구성을 설정할 수 있습니다.

절차

  1. samba 패키지를 설치합니다.

    # yum install samba
  2. /etc/samba/smb.conf 파일을 편집하고 다음 매개변수를 설정합니다.

    [global]
    	workgroup = Example-WG
    	netbios name = Server
    	security = user
    
    	log file = /var/log/samba/%m.log
    	log level = 1

    이 구성은 Example-WG 작업 그룹 내에서 Server 라는 독립 실행형 서버를 정의합니다. 또한 이 구성을 사용하면 최소 수준(1)에서 로깅할 수 있으며 로그 파일은 /var/log/samba/ 디렉터리에 저장됩니다. Samba는 log file 매개 변수의 %m 매크로를 클라이언트 연결의 NetBIOS 이름으로 확장합니다. 이를 통해 각 클라이언트에 대한 개별 로그 파일이 활성화됩니다.

  3. 선택적으로 파일 또는 프린터 공유를 구성합니다. 다음 내용을 참조하십시오.

  4. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  5. 인증이 필요한 공유를 설정하면 사용자 계정을 생성합니다.

    자세한 내용은 로컬 사용자 계정 생성 및 활성화를 참조하십시오.

  6. 필요한 포트를 열고 firewall-cmd 유틸리티를 사용하여 방화벽 구성을 다시 로드합니다.

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  7. smb 서비스를 활성화하고 시작합니다.

    # systemctl enable --now smb

추가 리소스

  • smb.conf(5) man page

3.3.2. 로컬 사용자 계정 생성 및 활성화

사용자가 공유에 연결할 때 인증할 수 있도록 하려면 운영 체제와 Samba 데이터베이스에서 Samba 호스트에 계정을 만들어야 합니다. Samba는 파일 시스템 개체 및 Samba 계정에서 연결 사용자를 인증하기 위해 운영 체제 계정이 ACL(액세스 제어 목록)의 유효성을 검사해야 합니다.

passdb backend = tdbsam 기본 설정을 사용하는 경우 Samba는 사용자 계정을 /var/lib/samba/private/passdb.tdb 데이터베이스에 저장합니다.

example 이라는 로컬 Samba 사용자를 만들 수 있습니다.

사전 요구 사항

  • Samba는 독립 실행형 서버로 설치 및 구성됩니다.

절차

  1. 운영 체제 계정을 생성합니다.

    # useradd -M -s /sbin/nologin example

    이 명령은 홈 디렉터리를 생성하지 않고 example 계정을 추가합니다. 계정이 Samba로 인증하는 데만 사용되는 경우 계정이 로컬에 로그인하지 못하도록 /sbin/nologin 명령을 쉘로 할당합니다.

  2. 활성화하려면 암호를 운영 체제 계정으로 설정합니다.

    # passwd example
    Enter new UNIX password: password
    Retype new UNIX password: password
    passwd: password updated successfully

    Samba는 운영 체제 계정에 설정된 암호를 사용하여 인증하지 않습니다. 그러나 계정을 활성화하려면 암호를 설정해야 합니다. 계정이 비활성화되어 있으면 Samba는 이 사용자가 연결하면 액세스를 거부합니다.

  3. 사용자를 Samba 데이터베이스에 추가하고 암호를 계정으로 설정합니다.

    # smbpasswd -a example
    New SMB password: password
    Retype new SMB password: password
    Added user example.

    이 계정을 사용하여 Samba 공유에 연결할 때 인증하려면 이 암호를 사용합니다.

  4. Samba 계정을 활성화합니다.

    # smbpasswd -e example
    Enabled user example.

3.4. Samba ID 매핑 이해 및 구성

Windows 도메인은 고유한 SID(보안 식별자)를 통해 사용자와 그룹을 구분합니다. 그러나 Linux에는 사용자 및 그룹마다 고유한 UID와 GID가 필요합니다. 도메인 구성원으로 Samba를 실행하는 경우 winbindd 서비스는 도메인 사용자 및 그룹에 대한 정보를 운영 체제에 제공합니다.

winbindd 서비스를 활성화하여 Linux에 사용자와 그룹에 고유한 ID를 제공하려면 /etc/samba/smb.conf 파일에 ID 매핑을 구성해야 합니다.

  • 로컬 데이터베이스(기본 도메인)
  • Samba 서버가 멤버인 AD 또는 NT4 도메인
  • 사용자가 이 Samba 서버의 리소스에 액세스할 수 있어야 하는 각 신뢰할 수 있는 도메인

Samba는 특정 구성에 대해 다양한 ID 매핑 백엔드를 제공합니다. 가장 자주 사용되는 백엔드는 다음과 같습니다.

백엔드사용 사례

tdb

* 기본 도메인만 해당

ad

AD 도메인만 해당

rid

AD 및 NT4 도메인

autorid

AD, NT4 및 * 기본 도메인

3.4.1. Samba ID 범위 계획

Linux UID 및 GID를 AD에 저장하는지 여부 또는 이를 생성하도록 Samba를 구성하는지 여부에 관계없이 각 도메인 설정에는 다른 도메인과 겹치지 않아야 하는 고유한 ID 범위가 필요합니다.

주의

중복 ID 범위를 설정하면 Samba가 올바르게 작동하지 않습니다.

예 3.1. 고유 ID 범위

다음은 기본값(*), AD-DOM, 및 TRUST-DOM 도메인에 대한 인수 이외의 ID 매핑 범위를 보여줍니다.

[global]
...
idmap config * : backend = tdb
idmap config * : range = 10000-999999

idmap config AD-DOM:backend = rid
idmap config AD-DOM:range = 2000000-2999999

idmap config TRUST-DOM:backend = rid
idmap config TRUST-DOM:range = 4000000-4999999
중요

도메인당 하나의 범위만 할당할 수 있습니다. 따라서 도메인 범위 사이에 충분한 공간을 남겨 두십시오. 이렇게 하면 나중에 도메인이 확장되는 경우 범위를 확장할 수 있습니다.

나중에 도메인에 다른 범위를 할당하면 이러한 사용자와 그룹이 이전에 만든 파일과 디렉터리의 소유권이 손실됩니다.

3.4.2. * 기본 도메인

도메인 환경에서는 다음 각각에 대해 하나의 ID 매핑 구성을 추가합니다.

  • Samba 서버가 멤버인 도메인
  • Samba 서버에 액세스할 수 있는 신뢰할 수 있는 각 도메인

그러나 다른 모든 개체에 대해 Samba는 기본 도메인의 ID를 할당합니다. 여기에는 다음이 포함됩니다.

  • 로컬 Samba 사용자 및 그룹
  • BUILTIN\Administrators와 같은 Samba 기본 제공 계정 및 그룹
중요

Samba가 올바르게 작동하도록 하려면 설명된 대로 기본 도메인을 구성해야 합니다.

할당된 ID를 영구적으로 저장하려면 기본 도메인 백엔드에 쓸 수 있어야 합니다.

기본 도메인의 경우 다음 백엔드 중 하나를 사용할 수 있습니다.

tdb

tdb 백엔드를 사용하도록 기본 도메인을 구성하는 경우 나중에 생성될 오브젝트를 포함할 ID 범위를 설정하고 정의된 도메인 ID 매핑 구성의 일부가 아닌 ID 범위를 설정합니다.

예를 들어 /etc/samba/smb.conf 파일의 [global] 섹션에서 다음을 설정합니다.

idmap config * : backend = tdb
idmap config * : range = 10000-999999

자세한 내용은 TDB ID 매핑 백엔드 사용을 참조하십시오.

autorid

autorid 백엔드를 사용하도록 기본 도메인을 구성하는 경우 도메인에 대한 ID 매핑 구성을 추가하는 것은 선택 사항입니다.

예를 들어 /etc/samba/smb.conf 파일의 [global] 섹션에서 다음을 설정합니다.

idmap config * : backend = autorid
idmap config * : range = 10000-999999

자세한 내용은 Autorid ID 매핑 백엔드 사용을 참조하십시오.

3.4.3. tdb ID 매핑 백엔드 사용

winbindd 서비스는 기본적으로 쓰기 가능한 tdb ID 매핑 백엔드를 사용하여 SID(보안 식별자), UID 및 GID 매핑 테이블을 저장합니다. 여기에는 로컬 사용자, 그룹 및 기본 제공 주체가 포함됩니다.

이 백엔드는 * 기본 도메인에만 사용합니다. 예를 들면 다음과 같습니다.

idmap config * : backend = tdb
idmap config * : range = 10000-999999

추가 리소스

3.4.4. ad ID 매핑 백엔드 사용

ad ID 매핑 백엔드를 사용하도록 Samba AD 멤버를 구성할 수 있습니다.

ad ID 매핑 백엔드는 읽기 전용 API를 구현하여 AD에서 계정 및 그룹 정보를 읽습니다. 이는 다음과 같은 이점을 제공합니다.

  • 모든 사용자 및 그룹 설정은 AD에 중앙에 저장됩니다.
  • 이 백엔드를 사용하는 모든 Samba 서버에서 사용자 및 그룹 ID가 일관되게 유지됩니다.
  • ID는 손상될 수 있는 로컬 데이터베이스에 저장되지 않으므로 파일 소유권을 분실할 수 없습니다.
참고

ad ID 매핑 백엔드는 단방향 트러스트가 있는 Active Directory 도메인을 지원하지 않습니다. 단방향 트러스트를 사용하여 Active Directory에 도메인 멤버를 구성하는 경우 tdb, rid, autorid와 같은 ID 매핑 백엔드 중 하나를 대신 사용합니다.

애드혹 백엔드는 AD에서 다음 속성을 읽습니다.

AD 속성 이름오브젝트 유형매핑 대상

sAMAccountName

사용자 및 그룹

사용자 또는 그룹 이름 (오브젝트에 따라)

uidNumber

사용자

사용자 ID(UID)

gidNumber

Group

그룹 ID(GID)

loginShell [a]

사용자

사용자 쉘의 경로

unixHomeDirectory [a]

사용자

사용자의 홈 디렉터리 경로

primaryGroupID [b]

사용자

기본 그룹 ID

[a] Samba는 idmap config DOMAIN:unix_nss_info = yes를 설정하는 경우에만 이 속성을 읽습니다.
[b] Samba는 idmap config DOMAIN:unix_primary_group = yes를 설정하는 경우에만 이 속성을 읽습니다.

사전 요구 사항

  • 사용자와 그룹 모두 AD에 고유한 ID를 설정해야 하며 ID는 /etc/samba/smb.conf 파일에 구성된 범위 내에 있어야 합니다. 범위를 벗어나는 ID가 있는 개체는 Samba 서버에서 사용할 수 없습니다.
  • 사용자와 그룹은 AD에서 모든 필수 속성을 설정해야 합니다. 필수 속성이 없으면 Samba 서버에서 사용자 또는 그룹을 사용할 수 없습니다. 필수 속성은 구성에 따라 다릅니다. . 전제 조건
  • Samba가 설치되어 있어야 합니다.
  • ID 매핑을 제외한 Samba 구성이 /etc/samba/smb.conf 파일에 있습니다.

절차

  1. /etc/samba/smb.conf 파일에서 [global] 섹션을 편집합니다.

    1. 없는 경우 기본 도메인 (*)의 ID 매핑 구성을 추가합니다. 예를 들면 다음과 같습니다.

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999
    2. AD 도메인의 ad ID 매핑 백엔드를 활성화합니다.

      idmap config DOMAIN : backend = ad
    3. AD 도메인의 사용자와 그룹에 할당된 ID 범위를 설정합니다. 예를 들면 다음과 같습니다.

      idmap config DOMAIN : range = 2000000-2999999
      중요

      범위는 이 서버의 다른 도메인 구성과 겹치지 않아야 합니다. 또한 범위는 나중에 할당되는 모든 ID를 포함할 만큼 충분히 커야 합니다. 자세한 내용은 Planning Samba ID 범위를 참조하십시오.

    4. AD에서 속성을 읽을 때 Samba가 RFC 2307 스키마를 사용하도록 설정합니다.

      idmap config DOMAIN : schema_mode = rfc2307
    5. Samba가 해당 AD 속성에서 로그인 쉘 및 사용자 홈 디렉터리 경로를 읽을 수 있도록 하려면 다음을 설정합니다.

      idmap config DOMAIN : unix_nss_info = yes

      또는 모든 사용자에게 적용되는 균일한 도메인 전체 홈 디렉터리 경로 및 로그인 쉘을 설정할 수 있습니다. 예를 들면 다음과 같습니다.

      template shell = /bin/bash
      template homedir = /home/%U
    6. 기본적으로 Samba는 사용자 오브젝트의 primaryGroupID 속성을 Linux의 사용자 기본 그룹으로 사용합니다. 또는 대신 gidNumber 특성에 설정된 값을 사용하도록 Samba를 구성할 수 있습니다.

      idmap config DOMAIN : unix_primary_group = yes
  2. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  3. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

추가 리소스

  • * 기본 도메인
  • smb.conf(5)idmap_ad(8) man 페이지
  • smb.conf(5) 도움말 페이지의 VARIABLE SUBSTITUTIONS 섹션

3.4.5. 제거 ID 매핑 백엔드 사용

rid ID 매핑 백엔드를 사용하도록 Samba 도메인 멤버를 구성할 수 있습니다.

Samba는 Windows SID의 상대 식별자(RID)를 사용하여 Red Hat Enterprise Linux에서 ID를 생성할 수 있습니다.

참고

RID는 SID의 마지막 부분입니다. 예를 들어 사용자의 SID가 S-1-5-21-5421822485-11512151-421485315-30014 이면 30014 가 해당하는 RID입니다.

rid ID 매핑 백엔드는 AD 및 NT4 도메인의 알고리즘 매핑 체계를 기반으로 계정과 그룹 정보를 계산하는 읽기 전용 API를 구현합니다. 백엔드를 구성할 때 idmap config DOMAIN : range 매개변수에서 가장 낮고 가장 높은 RID를 설정해야 합니다. Samba는 이 매개 변수에 설정된 것보다 낮은 RID를 가진 사용자 또는 그룹을 매핑하지 않습니다.

중요

읽기 전용 백엔드인 ridBUILTIN 그룹과 같은 새 ID를 할당할 수 없습니다. 따라서 * 기본 도메인에 이 백엔드를 사용하지 마십시오.

rid 백엔드 사용의 이점

  • 구성된 범위 내에 RID가 있는 모든 도메인 사용자 및 그룹은 도메인 멤버에서 자동으로 사용할 수 있습니다.
  • ID, 홈 디렉터리 및 로그인 쉘을 수동으로 할당할 필요가 없습니다.

rid 백엔드 사용의 단점

  • 모든 도메인 사용자는 동일한 로그인 쉘 및 홈 디렉터리가 할당됩니다. 그러나 변수를 사용할 수 있습니다.
  • 사용자 및 그룹 ID는 모두 동일한 ID 범위 설정으로 rid 백엔드를 사용하는 경우 Samba 도메인 멤버에서만 동일합니다.
  • 도메인 구성원에서 개별 사용자 또는 그룹을 사용할 수 없는 경우 제외할 수 없습니다. 구성된 범위를 벗어난 사용자 및 그룹만 제외됩니다.
  • winbindd 서비스에서 ID를 계산하는 데 사용하는 공식에 따라 다른 도메인의 오브젝트에 동일한 RID가 있는 경우 다중 도메인 환경에서 중복 ID가 발생할 수 있습니다.

사전 요구 사항

  • Samba가 설치되어 있어야 합니다.
  • ID 매핑을 제외한 Samba 구성이 /etc/samba/smb.conf 파일에 있습니다.

절차

  1. /etc/samba/smb.conf 파일에서 [global] 섹션을 편집합니다.

    1. 없는 경우 기본 도메인 (*)의 ID 매핑 구성을 추가합니다. 예를 들면 다음과 같습니다.

      idmap config * : backend = tdb
      idmap config * : range = 10000-999999
    2. 도메인에 대해 rid ID 매핑 백엔드를 활성화합니다.

      idmap config DOMAIN : backend = rid
    3. 향후 할당될 모든 RID를 포함할 만큼 큰 범위를 설정합니다. 예를 들면 다음과 같습니다.

      idmap config DOMAIN : range = 2000000-2999999

      Samba는 이 도메인의 RID가 범위에 속하지 않는 사용자와 그룹을 무시합니다.

      중요

      범위는 이 서버의 다른 도메인 구성과 겹치지 않아야 합니다. 또한 범위는 나중에 할당되는 모든 ID를 포함할 만큼 충분히 커야 합니다. 자세한 내용은 Planning Samba ID 범위를 참조하십시오.

    4. 매핑된 모든 사용자에게 할당될 쉘 및 홈 디렉터리 경로를 설정합니다. 예를 들면 다음과 같습니다.

      template shell = /bin/bash
      template homedir = /home/%U
  2. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  3. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

추가 리소스

  • * 기본 도메인
  • smb.conf(5) 도움말 페이지의 VARIABLE SUBSTITUTIONS 섹션
  • RID에서 로컬 ID 계산은 idmap_rid(8) 매뉴얼 페이지를 참조하십시오.

3.4.6. 자동 덮어쓰기 ID 매핑 백엔드 사용

autorid ID 매핑 백엔드를 사용하도록 Samba 도메인 멤버를 구성할 수 있습니다.

autorid 백엔드는 rid ID 매핑 백엔드와 유사하게 작동하지만 다른 도메인에 대한 ID를 자동으로 할당할 수 있습니다. 이를 통해 다음과 같은 상황에서 autorid 백엔드를 사용할 수 있습니다.

  • * 기본 도메인 전용
  • * 기본 도메인 및 추가 도메인의 경우 각 추가 도메인에 대한 ID 매핑 구성을 생성할 필요가 없습니다.
  • 특정 도메인 전용
참고

기본 도메인에 autorid를 사용하는 경우 도메인에 대한 ID 매핑 구성을 추가하는 것은 선택 사항입니다.

이 섹션의 일부는 Samba Wiki에 게시된 idmap config autorid 문서에서 채택되었습니다. 라이센스: CC BY 4.0. 작성자 및 기여자: Wiki 페이지의 기록 탭을 참조하십시오.

autorid 백엔드 사용의 이점

  • 계산된 UID 및 GID가 구성된 범위 내에 있는 모든 도메인 사용자와 그룹은 도메인 멤버에서 자동으로 사용할 수 있습니다.
  • ID, 홈 디렉터리 및 로그인 쉘을 수동으로 할당할 필요가 없습니다.
  • 다중 도메인 환경의 여러 오브젝트에 동일한 RID가 있는 경우에도 중복 ID가 없습니다.

단점

  • 사용자 및 그룹 ID는 Samba 도메인 구성원에서 동일하지 않습니다.
  • 모든 도메인 사용자는 동일한 로그인 쉘 및 홈 디렉터리가 할당됩니다. 그러나 변수를 사용할 수 있습니다.
  • 도메인 구성원에서 개별 사용자 또는 그룹을 사용할 수 없는 경우 제외할 수 없습니다. 계산된 UID 또는 GID가 구성된 범위를 벗어나는 사용자와 그룹만 제외됩니다.

사전 요구 사항

  • Samba가 설치되어 있어야 합니다.
  • ID 매핑을 제외한 Samba 구성이 /etc/samba/smb.conf 파일에 있습니다.

절차

  1. /etc/samba/smb.conf 파일에서 [global] 섹션을 편집합니다.

    1. * 기본 도메인의 autorid ID 매핑 백엔드를 활성화합니다.

      idmap config * : backend = autorid
    2. 모든 기존 및 향후 객체에 ID를 할당할 수 있을 만큼 큰 범위를 설정합니다. 예를 들면 다음과 같습니다.

      idmap config * : range = 10000-999999

      Samba는 이 도메인에서 계산된 ID가 범위에 속하지 않는 사용자와 그룹을 무시합니다.

      주의

      범위를 설정하고 Samba가 사용을 시작한 후 범위의 상한값만 늘릴 수 있습니다. 범위에 대한 다른 모든 변경으로 인해 새 ID 할당이 발생할 수 있으므로 파일 소유권이 손실될 수 있습니다.

    3. 선택적으로 범위 크기를 설정합니다. 예를 들면 다음과 같습니다.

      idmap config * : rangesize = 200000

      Samba는 idmap 구성 * : range 매개변수에 설정된 범위의 모든 ID를 가져올 때까지 각 도메인의 개체에 대해 이 개수의 연속 ID를 할당합니다.

      참고

      범위 크기를 설정하는 경우 그에 따라 범위를 조정해야 합니다. 범위는 rangesize의 여러 개여야 합니다.

    4. 매핑된 모든 사용자에게 할당될 쉘 및 홈 디렉터리 경로를 설정합니다. 예를 들면 다음과 같습니다.

      template shell = /bin/bash
      template homedir = /home/%U
    5. 필요한 경우 도메인에 대한 ID 매핑 구성을 추가합니다. 개별 도메인에 대한 구성이 없는 경우 Samba는 이전에 구성된 * 기본 도메인에서 자동 만료 백엔드 설정을 사용하여 ID를 계산합니다.

      중요

      범위는 이 서버의 다른 도메인 구성과 겹치지 않아야 합니다. 또한 범위는 나중에 할당되는 모든 ID를 포함할 만큼 충분히 커야 합니다. 자세한 내용은 Planning Samba ID 범위를 참조하십시오.

  2. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  3. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

추가 리소스

  • idmap_autorid(8) 도움말 페이지의 MAPPING FORMULAS 섹션
  • idmap_autorid(8) 도움말 페이지의 rangesize 매개 변수 설명
  • smb.conf(5) 도움말 페이지의 VARIABLE SUBSTITUTIONS 섹션

3.5. AD 도메인 멤버 서버로 Samba 설정

AD 또는 NT4 도메인을 실행하는 경우 Samba를 사용하여 Red Hat Enterprise Linux 서버를 도메인에 멤버로 추가하여 다음을 얻습니다.

  • 다른 도메인 구성원의 도메인 리소스에 액세스
  • sshd와 같은 로컬 서비스에 도메인 사용자를 인증합니다
  • 서버에서 파일 및 인쇄 서버 역할을 할 디렉터리와 프린터 공유

3.5.1. AD 도메인에 RHEL 시스템 연결

Samba Winbind는 RHEL(Red Hat Enterprise Linux) 시스템을 AD(Active Directory)와 연결하기 위한 SSSD(System Security Services Daemon)의 대안입니다. realmd 를 사용하여 Samba Winbind를 구성하여 RHEL 시스템을 AD 도메인에 연결할 수 있습니다.

절차

  1. AD에 Kerberos 인증을 위한 더 이상 사용되지 않는 RC4 암호화 유형이 필요한 경우 RHEL에서 이러한 암호에 대한 지원을 활성화합니다.

    # update-crypto-policies --set DEFAULT:AD-SUPPORT
  2. 다음 패키지를 설치합니다.

    # yum install realmd oddjob-mkhomedir oddjob samba-winbind-clients \
           samba-winbind samba-common-tools samba-winbind-krb5-locator
  3. 도메인 구성원에서 디렉터리 또는 프린터를 공유하려면 samba 패키지를 설치합니다.

    # yum install samba
  4. 기존 /etc/samba/smb.conf Samba 구성 파일을 백업합니다.

    # mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
  5. 도메인에 가입합니다. 예를 들어 ad.example.com이라는 도메인에 가입하려면 다음을 수행합니다.

    # realm join --membership-software=samba --client-software=winbind ad.example.com

    이전 명령을 사용하면 realm 유틸리티가 자동으로 수행됩니다.

    • ad.example.com 도메인 멤버십에 대한 /etc/samba/smb.conf 파일을 만듭니다.
    • 사용자 및 그룹 조회에 대한 winbind 모듈을 /etc/nsswitch.conf 파일에 추가합니다.
    • /etc/pam.d/ 디렉토리에서 PAM(Pluggable Authentication Module) 구성 파일을 업데이트합니다.
    • winbind 서비스를 시작하고 시스템이 부팅될 때 서비스가 시작됩니다.
  6. 선택적으로 /etc/samba/smb.conf 파일에서 대체 ID 매핑 백엔드 또는 사용자 지정된 ID 매핑 설정을 설정합니다. 자세한 내용은 Samba ID 매핑 이해 및 구성을 참조하십시오.
  7. winbind 서비스가 실행 중인지 확인합니다.

    # systemctl status winbind
    ...
       Active: active (running) since Tue 2018-11-06 19:10:40 CET; 15s ago
    중요

    Samba를 활성화하여 도메인 사용자 및 그룹 정보를 쿼리하려면 smb 를 시작하기 전에 winbind 서비스를 실행해야 합니다.

  8. 디렉터리 및 프린터를 공유하는 samba 패키지를 설치한 경우 smb 서비스를 활성화하고 시작합니다.

    # systemctl enable --now smb
  9. 선택적으로 Active Directory에 로컬 로그인을 인증하는 경우 winbind_krb5_localauth 플러그인을 활성화합니다. MIT Kerberos용 로컬 인증 플러그인 사용을 참조하십시오.

검증 단계

  1. AD 도메인의 AD 관리자 계정과 같은 AD 사용자의 세부 정보를 표시합니다.

    # getent passwd "AD\administrator"
    AD\administrator:*:10000:10000::/home/administrator@AD:/bin/bash
  2. AD 도메인에서 도메인 사용자 그룹의 멤버를 쿼리합니다.

    # getent group "AD\Domain Users"
        AD\domain users:x:10000:user1,user2
  3. 선택적으로 파일 및 디렉터리에 대한 권한을 설정할 때 도메인 사용자와 그룹을 사용할 수 있는지 확인합니다. 예를 들어 /srv/samba/example.txt 파일의 소유자를 AD\administrator로 설정하고 그룹을 AD\Domain Users로 설정하려면 다음을 수행합니다.

    # chown "AD\administrator":"AD\Domain Users" /srv/samba/example.txt
  4. Kerberos 인증이 예상대로 작동하는지 확인합니다.

    1. AD 도메인 멤버에서 administrator@AD.EXAMPLE.COM 주체에 대한 티켓을 받습니다.

      # kinit administrator@AD.EXAMPLE.COM
    2. 캐시된 Kerberos 티켓을 표시합니다.

      # klist
      Ticket cache: KCM:0
      Default principal: administrator@AD.EXAMPLE.COM
      
      Valid starting       Expires              Service principal
      01.11.2018 10:00:00  01.11.2018 20:00:00  krbtgt/AD.EXAMPLE.COM@AD.EXAMPLE.COM
              renew until 08.11.2018 05:00:00
  5. 사용 가능한 도메인을 표시합니다.

    # wbinfo --all-domains
    BUILTIN
    SAMBA-SERVER
    AD

추가 리소스

3.5.2. MIT Kerberos용 로컬 인증 플러그인 사용

winbind 서비스는 Active Directory 사용자를 도메인 구성원에게 제공합니다. 관리자는 특정 상황에서 도메인 사용자가 도메인 구성원에서 실행 중인 SSH 서버와 같은 로컬 서비스에 인증할 수 있도록 설정하려고 합니다. Kerberos를 사용하여 도메인 사용자를 인증하는 경우 winbind_krb5_localauth 플러그인을 활성화하여 winbind 서비스를 통해 Kerberos 주체를 Active Directory 계정에 올바르게 매핑합니다.

예를 들어 Active Directory 사용자의 sAMAccountName 속성이 EXAMPLE로 설정되고 사용자가 사용자 이름을 소문자로 로그를 시도하는 경우 Kerberos는 대문자로 사용자 이름을 반환합니다. 결과적으로 항목이 일치하지 않고 인증이 실패합니다.

winbind_krb5_localauth 플러그인을 사용하면 계정 이름이 올바르게 매핑됩니다. 이는 GSSAPI 인증에만 적용되며 초기 티켓 부여 티켓(TGT)을 받는 데만 적용되지 않습니다.

사전 요구 사항

  • Samba는 Active Directory의 멤버로 구성되어 있습니다.
  • Red Hat Enterprise Linux는 Active Directory에 대한 로그인 시도를 인증합니다.
  • winbind 서비스가 실행 중입니다.

절차

/etc/krb5.conf 파일을 편집하고 다음 섹션을 추가합니다.

[plugins]
localauth = {
     module = winbind:/usr/lib64/samba/krb5/winbind_krb5_localauth.so
     enable_only = winbind
}

추가 리소스

  • winbind_krb5_localauth(8) man page.

3.6. IdM 도메인 멤버에서 Samba 설정

Red Hat IdM(Identity Management) 도메인에 연결된 호스트에서 Samba를 설정할 수 있습니다. 신뢰할 수 있는 Active Directory(AD) 도메인에서 IdM 및 또한 사용 가능한 경우 Samba에서 제공하는 공유 및 프린터 서비스에 액세스할 수 있습니다.

중요

IdM 도메인 멤버에서 Samba를 사용하는 것은 지원되지 않는 기술 프리뷰 기능이며 특정 제한 사항이 포함되어 있습니다. 예를 들어, IdM 신뢰 컨트롤러는 Active Directory 글로벌 카탈로그 서비스를 지원하지 않으며 DMCE/원격 프로시저 호출(DCE/RPC) 프로토콜을 사용하여 IdM 그룹 해결을 지원하지 않습니다. 결과적으로 AD 사용자는 다른 IdM 클라이언트에 로그인할 때 IdM 클라이언트에서 호스팅되는 Samba 공유 및 프린터에만 액세스할 수 있습니다. Windows 시스템에 로그인한 AD 사용자는 IdM 도메인 멤버에서 호스팅되는 Samba 공유에 액세스할 수 없습니다.

IdM 도메인 구성원에 Samba를 배포하는 고객은 Red Hat에 피드백을 제공하는 것이 좋습니다.

AD 도메인의 사용자가 Samba에서 제공하는 공유 및 프린터 서비스에 액세스해야 하는 경우 AES 암호화 유형이 AD인지 확인합니다. 자세한 내용은 GPO를 사용하여 Active Directory에서 AES 암호화 유형 활성화를 참조하십시오.

사전 요구 사항

  • 호스트는 IdM 도메인에 클라이언트로 결합됩니다.
  • IdM 서버와 클라이언트는 모두 RHEL 8.1 이상에서 실행해야 합니다.

3.6.1. 도메인 구성원에 Samba 설치를 위한 IdM 도메인 준비

IdM 클라이언트에 Samba를 설정하려면 IdM 서버에서 ipa-adtrust-install 유틸리티를 사용하여 IdM 도메인을 준비해야 합니다.

참고

ipa-adtrust-install 명령을 자동으로 실행하는 시스템은 AD 신뢰 컨트롤러가 됩니다. 그러나 IdM 서버에서 ipa-adtrust-install 을 한 번만 실행해야 합니다.

사전 요구 사항

  • IdM 서버가 설치되어 있어야 합니다.
  • 패키지를 설치하고 IdM 서비스를 다시 시작하려면 루트 권한이 필요합니다.

절차

  1. 필수 패키지를 설치합니다.

    [root@ipaserver ~]# yum install ipa-server-trust-ad samba-client
  2. IdM 관리자로 인증합니다.

    [root@ipaserver ~]# kinit admin
  3. ipa-adtrust-install 유틸리티를 실행합니다.

    [root@ipaserver ~]# ipa-adtrust-install

    IdM이 통합된 DNS 서버와 함께 설치된 경우 DNS 서비스 레코드가 자동으로 생성됩니다.

    통합된 DNS 서버 없이 IdM을 설치한 경우, ipa-adtrust-install 은 DNS에 수동으로 추가해야 하는 서비스 레코드 목록을 인쇄합니다.

  4. 스크립트에서 /etc/samba/smb.conf가 이미 존재하고 다시 작성됨을 묻는 메시지를 표시합니다.

    WARNING: The smb.conf already exists. Running ipa-adtrust-install will break your existing Samba configuration.
    
    Do you wish to continue? [no]: yes
  5. 스크립트에서 이전 Linux 클라이언트가 신뢰할 수 있는 사용자로 작업할 수 있는 호환성 플러그인인 slapi-nis 플러그인을 구성하도록 프롬프트를 표시합니다.

    Do you want to enable support for trusted domains in Schema Compatibility plugin?
    This will allow clients older than SSSD 1.9 and non-Linux clients to work with trusted users.
    
    Enable trusted domains support in slapi-nis? [no]: yes
  6. 메시지가 표시되면 IdM 도메인의 NetBIOS 이름을 입력하거나 Enter 를 눌러 제안된 이름을 수락합니다.

    Trust is configured but no NetBIOS domain name found, setting it now.
    Enter the NetBIOS name for the IPA domain.
    Only up to 15 uppercase ASCII letters, digits and dashes are allowed.
    Example: EXAMPLE.
    
    NetBIOS domain name [IDM]:
  7. SID 생성 작업을 실행하여 기존 사용자의 SID를 생성하라는 메시지가 표시됩니다.

    Do you want to run the ipa-sidgen task? [no]: yes

    이는 리소스 집약적인 작업이므로 사용자가 많은 경우 한 번에 이 작업을 실행할 수 있습니다.

  8. (선택 사항) 기본적으로 Dynamic RPC 포트 범위는 Windows Server 2008 이상에서는 49152-65535 로 정의됩니다. 환경에 대해 다른 Dynamic RPC 포트 범위를 정의해야 하는 경우 다른 포트를 사용하도록 Samba를 구성하고 방화벽 설정에서 해당 포트를 엽니다. 다음 예제에서는 포트 범위를 55000-65000으로 설정합니다.

    [root@ipaserver ~]# net conf setparm global 'rpc server dynamic port range' 55000-65000
    [root@ipaserver ~]# firewall-cmd --add-port=55000-65000/tcp
    [root@ipaserver ~]# firewall-cmd --runtime-to-permanent
  9. ipa 서비스를 다시 시작하십시오.

    [root@ipaserver ~]# ipactl restart
  10. smbclient 유틸리티를 사용하여 Samba가 IdM 측에서 Kerberos 인증에 응답하는지 확인합니다.

    [root@ipaserver ~]# smbclient -L server.idm.example.com -U user_name --use-kerberos=required
    lp_load_ex: changing to config backend registry
        Sharename       Type      Comment
        ---------       ----      -------
        IPC$            IPC       IPC Service (Samba 4.15.2)
    ...

3.6.2. IdM 클라이언트에 Samba 서버 설치 및 구성

IdM 도메인에 등록된 클라이언트에 Samba를 설치하고 구성할 수 있습니다.

사전 요구 사항

절차

  1. ipa-client-samba 패키지를 설치합니다.

    [root@idm_client]# yum install ipa-client-samba
  2. ipa-client-samba 유틸리티를 사용하여 클라이언트를 준비하고 초기 Samba 구성을 생성합니다.

    [root@idm_client]# ipa-client-samba
    Searching for IPA server...
    IPA server: DNS discovery
    Chosen IPA master: idm_server.idm.example.com
    SMB principal to be created: cifs/idm_client.idm.example.com@IDM.EXAMPLE.COM
    NetBIOS name to be used: IDM_CLIENT
    Discovered domains to use:
    
     Domain name: idm.example.com
    NetBIOS name: IDM
             SID: S-1-5-21-525930803-952335037-206501584
        ID range: 212000000 - 212199999
    
     Domain name: ad.example.com
    NetBIOS name: AD
             SID: None
        ID range: 1918400000 - 1918599999
    
    Continue to configure the system with these values? [no]: yes
    Samba domain member is configured. Please check configuration at /etc/samba/smb.conf and start smb and winbind services
  3. 기본적으로 ipa-client-samba는 사용자가 연결할 때 사용자의 홈 디렉토리를 동적으로 공유하는 /etc/samba/smb.conf 파일에 [homes] 섹션을 자동으로 추가합니다. 이 서버에 홈 디렉터리가 없거나 공유하려는 경우 /etc/samba/smb.conf에서 다음 행을 제거하십시오.

    [homes]
        read only = no
  4. 디렉토리와 프린터를 공유합니다. 자세한 내용은 다음을 참조하십시오.

  5. 로컬 방화벽에서 Samba 클라이언트에 필요한 포트를 엽니다.

    [root@idm_client]# firewall-cmd --permanent --add-service=samba-client
    [root@idm_client]# firewall-cmd --reload
  6. smbwinbind 서비스를 활성화하고 시작합니다.

    [root@idm_client]# systemctl enable --now smb winbind

검증 단계

samba-client 패키지가 설치된 다른 IdM 도메인 멤버에서 다음 확인 단계를 실행합니다.

  • Kerberos 인증을 사용하여 Samba 서버의 공유를 나열합니다.

    $ smbclient -L idm_client.idm.example.com -U user_name --use-kerberos=required
    lp_load_ex: changing to config backend registry
    
        Sharename       Type      Comment
        ---------       ----      -------
        example         Disk
        IPC$            IPC       IPC Service (Samba 4.15.2)
    ...

추가 리소스

  • ipa-client-samba(1) man page

3.6.3. IdM이 새 도메인을 신뢰하는 경우 ID 매핑 구성 수동 추가

Samba에는 사용자가 리소스에 액세스하는 각 도메인에 대한 ID 매핑 구성이 필요합니다. IdM 클라이언트에서 실행 중인 기존 Samba 서버에서 관리자가 Active Directory(AD) 도메인에 새 신뢰를 추가한 후 ID 매핑 구성을 수동으로 추가해야 합니다.

사전 요구 사항

  • IdM 클라이언트에 Samba가 구성되어 있습니다. 이후에 새로운 신뢰가 IdM에 추가되었습니다.
  • Kerberos에 대한 DES 및 RC4 암호화 유형은 신뢰할 수 있는 AD 도메인에서 비활성화해야 합니다. 보안상의 이유로 RHEL 8은 이러한 약한 암호화 유형을 지원하지 않습니다.

절차

  1. 호스트의 keytab을 사용하여 인증합니다.

    [root@idm_client]# kinit -k
  2. ipa idrange-find 명령을 사용하여 새 도메인의 기본 ID와 ID 범위 크기를 모두 표시합니다. 예를 들어 다음 명령은 ad.example.com 도메인의 값을 표시합니다.

    [root@idm_client]# ipa idrange-find --name="AD.EXAMPLE.COM_id_range" --raw
    ---------------
    1 range matched
    ---------------
      cn: AD.EXAMPLE.COM_id_range
      ipabaseid: 1918400000
      ipaidrangesize: 200000
      ipabaserid: 0
      ipanttrusteddomainsid: S-1-5-21-968346183-862388825-1738313271
      iparangetype: ipa-ad-trust
    ----------------------------
    Number of entries returned 1
    ----------------------------

    다음 단계에서 ipabaseidipaidrangesize 속성의 값이 필요합니다.

  3. 사용 가능한 가장 높은 ID를 계산하려면 다음 공식을 사용합니다.

    maximum_range = ipabaseid + ipaidrangesize - 1

    이전 단계의 값을 사용하여 ad.example.com 도메인에 사용 가능한 가장 높은 ID는 1918599999 (1918400000 + 200000 - 1)입니다.

  4. /etc/samba/smb.conf 파일을 편집하고 도메인의 ID 매핑 구성을 [global] 섹션에 추가합니다.

    idmap config AD : range = 1918400000 - 1918599999
    idmap config AD : backend = sss

    ipabaseid 특성의 값을 가장 낮은 값으로 지정하고 이전 단계의 계산된 값을 가장 높은 범위 값으로 지정합니다.

  5. smbwinbind 서비스를 다시 시작합니다.

    [root@idm_client]# systemctl restart smb winbind

검증 단계

  • Kerberos 인증을 사용하여 Samba 서버의 공유를 나열합니다.

    $ smbclient -L idm_client.idm.example.com -U user_name --use-kerberos=required
    lp_load_ex: changing to config backend registry
    
        Sharename       Type      Comment
        ---------       ----      -------
        example         Disk
        IPC$            IPC       IPC Service (Samba 4.15.2)
    ...

3.6.4. 추가 리소스

3.7. POSIX ACL을 사용하는 Samba 파일 공유 설정

Samba는 Linux 서비스로 POSIX ACL과의 공유를 지원합니다. chmod와 같은 유틸리티를 사용하여 Samba 서버에서 권한을 로컬로 관리할 수 있습니다. 공유가 확장된 속성을 지원하는 파일 시스템에 저장된 경우 여러 사용자 및 그룹으로 ACL을 정의할 수 있습니다.

참고

대신 미세한 Windows ACL을 사용해야 하는 경우 Windows ACL을 사용하는 공유 설정을 참조하십시오.

이 섹션의 일부는 Samba Wiki에 게시된 POSIX ACL을 사용하여 공유 설정 설명서에서 채택되었습니다. 라이센스: CC BY 4.0. 작성자 및 기여자: Wiki 페이지의 기록 탭을 참조하십시오.

3.7.1. POSIX ACL을 사용하는 공유 추가

/srv/samba/ example / 디렉터리의 콘텐츠를 제공하고 POSIX ACL을 사용하는 example이라는 공유를 생성할 수 있습니다.

사전 요구 사항

Samba는 다음 모드 중 하나로 설정되었습니다.

절차

  1. 폴더가 없는 경우 해당 폴더를 생성합니다. 예를 들면 다음과 같습니다.

    # mkdir -p /srv/samba/example/
  2. enforcing 모드에서 SELinux를 실행하는 경우 디렉터리에 samba_share_t 컨텍스트를 설정합니다.

    # semanage fcontext -a -t samba_share_t "/srv/samba/example(/.*)?"
    # restorecon -Rv /srv/samba/example/
  3. 디렉터리에 파일 시스템 ACL을 설정합니다. 자세한 내용은 다음을 참조하십시오.

  4. 예제 공유를 /etc/samba/smb.conf 파일에 추가합니다. 예를 들어, 쓰기 가능 공유를 추가하려면 다음을 수행합니다.

    [example]
    	path = /srv/samba/example/
    	read only = no
    참고

    파일 시스템 ACL에 관계없이 read only = no를 설정하지 않으면 Samba는 읽기 전용 모드로 디렉토리를 공유합니다.

  5. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  6. 필요한 포트를 열고 firewall-cmd 유틸리티를 사용하여 방화벽 구성을 다시 로드합니다.

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  7. smb 서비스를 다시 시작하십시오.

    # systemctl restart smb

3.7.2. POSIX ACL을 사용하는 Samba 공유에 표준 Linux ACL 설정

Linux의 표준 ACL은 한 명의 소유자, 하나의 그룹 및 기타 모든 정의되지 않은 사용자에 대한 권한 설정을 지원합니다. chown,chgrpchmod 유틸리티를 사용하여 ACL을 업데이트할 수 있습니다. 정확한 제어가 필요한 경우 보다 복잡한 POSIX ACL을 사용할 수 있습니다.

POSIX ACL을 사용하는 Samba 공유에서 확장 ACL 설정.

다음 절차에서는 /srv/samba/example/ 디렉터리의 소유자를 root 사용자로 설정하고, Domain Users 그룹에 읽기 및 쓰기 권한을 부여하며, 다른 모든 사용자에 대한 액세스를 거부합니다.

사전 요구 사항

  • ACL을 설정하려는 Samba 공유가 있습니다.

절차

# chown root:"Domain Users" /srv/samba/example/
# chmod 2770 /srv/samba/example/

참고

디렉토리에서 set-group-ID(SGID) 비트를 활성화하면 새 디렉토리 항목을 생성한 사용자의 기본 그룹으로 설정하는 일반적인 동작이 아니라 모든 새 파일 및 하위 디렉터리의 기본 그룹을 디렉토리 그룹의 기본 그룹으로 자동으로 설정합니다.

추가 리소스

  • chown(1)chmod(1) 매뉴얼 페이지

3.7.3. POSIX ACL을 사용하는 Samba 공유에 확장 ACL 설정

공유 디렉터리가 확장 ACL을 지원하는 경우 파일 시스템을 사용하여 복잡한 권한을 설정할 수 있습니다. 확장 ACL에는 여러 사용자와 그룹에 대한 권한이 포함될 수 있습니다.

확장 POSIX ACL을 사용하면 여러 사용자 및 그룹으로 복잡한 ACL을 구성할 수 있습니다. 그러나 다음 권한만 설정할 수 있습니다.

  • 액세스 권한 없음
  • 읽기 액세스
  • 쓰기 액세스
  • 전체 제어

Create folder / append data와 같은 세분화된 Windows 권한이 필요한 경우 Windows ACL을 사용하도록 공유를 구성합니다. Windows ACL을 사용하는 공유 설정을 참조하십시오.

다음 절차는 공유에서 확장 ACL을 활성화하는 방법을 보여줍니다. 또한 확장 ACL 설정에 대한 예제도 포함되어 있습니다.

사전 요구 사항

  • ACL을 설정하려는 Samba 공유가 있습니다.

절차

  1. /etc/samba/smb.conf 파일의 공유 섹션에서 다음 매개 변수를 활성화하여 확장 ACL의 ACL 상속을 활성화합니다.

    inherit acls = yes

    자세한 내용은 smb.conf(5) 도움말 페이지의 매개 변수 설명을 참조하십시오.

  2. smb 서비스를 다시 시작하십시오.

    # systemctl restart smb
  3. 디렉터리에 ACL을 설정합니다. 예를 들면 다음과 같습니다.

    예 3.2. 확장 ACL 설정

    다음 절차에서는 Domain Admins 그룹에 대한 읽기, 쓰기, 실행 권한을 설정하고, Domain Users 그룹에 대한 읽기, 실행 권한을 설정하고, /srv/samba/example/ 디렉터리의 다른 모든 사용자에 대한 액세스를 거부합니다.

    1. 기본 사용자 계정 그룹에 자동 부여 권한을 비활성화합니다.

      # setfacl -m group::--- /srv/samba/example/
      # setfacl -m default:group::--- /srv/samba/example/

      디렉터리의 기본 그룹은 동적 CREATOR GROUP 주체에 추가로 매핑됩니다. Samba 공유에 확장 POSIX ACL을 사용하면 이 주체가 자동으로 추가되며 제거할 수 없습니다.

    2. 디렉터리에 대한 권한을 설정합니다.

      1. Domain Admins 그룹에 읽기, 쓰기 및 실행 권한을 부여합니다.

        # setfacl -m group:"DOMAIN\Domain Admins":rwx /srv/samba/example/
      2. Domain Users 그룹에 읽기 및 실행 권한을 부여합니다.

        # setfacl -m group:"DOMAIN\Domain Users":r-x /srv/samba/example/
      3. other ACL 항목과 일치하지 않는 사용자에 대한 액세스를 거부하도록 다른 ACL 항목에 대한 권한을 설정합니다.

        # setfacl -R -m other::--- /srv/samba/example/

      이러한 설정은 이 디렉터리에만 적용됩니다. Windows에서는 이러한 ACL이 This folder only에만 매핑됩니다.

    3. 이전 단계에서 설정한 권한을 이 디렉터리에 생성된 새 파일 시스템 개체에서 상속하려면 다음을 수행합니다.

      # setfacl -m default:group:"DOMAIN\Domain Admins":rwx /srv/samba/example/
      # setfacl -m default:group:"DOMAIN\Domain Users":r-x /srv/samba/example/
      # setfacl -m default:other::--- /srv/samba/example/

      이러한 설정에서 보안 주체의 이 폴더만 이 폴더, 하위 폴더 및 파일로 설정됩니다.

    Samba는 절차에 설정된 권한을 다음 Windows ACL에 매핑합니다.

    Principal액세스적용 대상

    도메인\Domain 관리자

    전체 제어

    이 폴더, 하위 폴더 및 파일

    도메인\Domain 사용자

    읽기 및 실행

    이 폴더, 하위 폴더 및 파일

    Everyone [a]

    없음

    이 폴더, 하위 폴더 및 파일

    소유자 (Unix 사용자\소유자) [b]

    전체 제어

    이 폴더만

    primary_group (Unix 사용자\primary_group) [c]

    없음

    이 폴더만

    CREATOR OWNER [d] [e]

    전체 제어

    하위 폴더 및 파일만

    CREATOR 그룹 [e] [f]

    없음

    하위 폴더 및 파일만

    [a] Samba는 이 주체에 대한 권한을 other ACL 항목에서 매핑합니다.
    [b] Samba는 디렉터리의 소유자를 이 항목에 매핑합니다.
    [c] Samba는 디렉터리의 기본 그룹을 이 항목에 매핑합니다.
    [d] 새 파일 시스템 개체에서 작성자는 이 주체의 권한을 자동으로 상속합니다.
    [e] POSIX ACL을 사용하는 공유에서 지원되지 않는 ACL에서 이러한 주체를 구성하거나 제거합니다.
    [f] 새 파일 시스템 개체에서 작성자의 기본 그룹은 이 주체의 권한을 자동으로 상속합니다.

3.8. POSIX ACL을 사용하는 공유에 대한 권한 설정

선택적으로 Samba 공유에 대한 액세스를 제한하거나 부여하려면 /etc/samba/smb.conf 파일의 공유 섹션에 특정 매개 변수를 설정할 수 있습니다.

참고

공유 기반 권한은 사용자, 그룹 또는 호스트가 공유에 액세스할 수 있는 경우 관리합니다. 이러한 설정은 파일 시스템 ACL에 영향을 미치지 않습니다.

공유 기반 설정을 사용하여 공유 액세스를 제한합니다(예: 특정 호스트의 액세스를 거부합니다.

사전 요구 사항

  • POSIX ACL과의 공유가 설정되었습니다.

3.8.1. 사용자 및 그룹 기반 공유 액세스 구성

사용자 및 그룹 기반 액세스 제어를 사용하면 특정 사용자 및 그룹의 공유에 대한 액세스 권한을 부여하거나 거부할 수 있습니다.

사전 요구 사항

  • 사용자 또는 그룹 기반 액세스를 설정하려는 Samba 공유가 있습니다.

절차

  1. 예를 들어, 사용자 계정에 대한 액세스가 거부되는 동안 Domain Users 그룹의 모든 구성원이 공유에 액세스할 수 있도록 하려면 공유의 구성에 다음 매개변수를 추가합니다.

    valid users = +DOMAIN\"Domain Users"
    invalid users = DOMAIN\user

    잘못된 users 매개변수는 유효한 users 매개변수보다 우선 순위가 높습니다. 예를 들어 사용자 계정이 Domain Users 그룹의 멤버인 경우 이전 예제를 사용할 때 이 계정에 대한 액세스가 거부됩니다.

  2. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

추가 리소스

  • smb.conf(5) man page

3.8.2. 호스트 기반 공유 액세스 구성

호스트 기반 액세스 제어를 사용하면 클라이언트의 호스트 이름, IP 주소 또는 IP 범위에 따라 공유에 대한 액세스 권한을 부여하거나 거부할 수 있습니다.

다음 절차에서는 127.0.0.1 IP 주소, 192.0.2.0/24 IP 범위 및 client1.example.com 호스트에서 공유에 액세스하는 방법을 활성화하고 client2.example.com 호스트에 대한 액세스를 추가적으로 거부하는 방법을 설명합니다.

사전 요구 사항

  • 호스트 기반 액세스를 설정하려는 Samba 공유가 있습니다.

절차

  1. /etc/samba/smb.conf 파일에 있는 공유 구성에 다음 매개변수를 추가합니다.

    hosts allow = 127.0.0.1 192.0.2.0/24 client1.example.com
    hosts deny = client2.example.com

    hosts deny 매개 변수는 호스트 허용 보다 우선 순위가 높습니다. 예를 들어 client1.example.comhosts allow 매개 변수에 나열된 IP 주소로 확인되면 이 호스트에 대한 액세스가 거부됩니다.

  2. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

추가 리소스

  • smb.conf(5) man page

3.9. Windows ACL을 사용하는 공유 설정

Samba는 공유 및 파일 시스템 개체에서 Windows ACL 설정을 지원합니다. 이를 통해 다음을 수행할 수 있습니다.

  • 세분화된 Windows ACL 사용
  • Windows를 사용하여 공유 권한 및 파일 시스템 ACL 관리

또는 POSIX ACL을 사용하도록 공유를 구성할 수 있습니다. 자세한 내용은 POSIX ACL을 사용하는 Samba 파일 공유 설정을 참조하십시오.

이 섹션의 일부는 Samba Wiki에 게시 된 Windows ACL을 사용하여 공유 설정 설명서에서 채택되었습니다. 라이센스: CC BY 4.0. 작성자 및 기여자: Wiki 페이지의 기록 탭을 참조하십시오.

3.9.1. SeDiskOperatorPrivilege 권한 부여

SeDiskOperatorPrivilege 권한이 부여된 사용자 및 그룹만 Windows ACL을 사용하는 공유에 대한 권한을 구성할 수 있습니다.

절차

  1. 예를 들어, DOMAIN\Domain Admins 그룹에 SeDiskOperatorPrivilege 권한을 부여하려면 다음을 수행합니다.

    # net rpc rights grant "DOMAIN\Domain Admins" SeDiskOperatorPrivilege -U "DOMAIN\administrator"
    Enter DOMAIN\administrator's password:
    Successfully granted rights.
    참고

    도메인 환경에서 도메인 그룹에 SeDiskOperatorPrivilege 을 부여합니다. 이를 통해 사용자의 그룹 멤버십을 업데이트하여 권한을 중앙에서 관리할 수 있습니다.

  2. SeDiskOperatorPrivilege 이 부여된 모든 사용자 및 그룹을 나열하려면 다음을 수행하십시오.

    # net rpc rights list privileges SeDiskOperatorPrivilege -U "DOMAIN\administrator"
    Enter administrator's password:
    SeDiskOperatorPrivilege:
      BUILTIN\Administrators
      DOMAIN\Domain Admins

3.9.2. Windows ACL 지원 활성화

Windows ACL을 지원하는 공유를 구성하려면 Samba에서 이 기능을 활성화해야 합니다.

사전 요구 사항

  • 사용자 공유는 Samba 서버에 구성됩니다.

절차

  1. 모든 공유에 대해 전역적으로 활성화하려면 /etc/samba/smb.conf 파일의 [global] 섹션에 다음 설정을 추가합니다.

    vfs objects = acl_xattr
    map acl inherit = yes
    store dos attributes = yes

    대신 공유의 섹션에 동일한 매개 변수를 추가하여 개별 공유에 대해 Windows ACL 지원을 활성화할 수 있습니다.

  2. smb 서비스를 다시 시작하십시오.

    # systemctl restart smb

3.9.3. Windows ACL을 사용하는 공유 추가

/srv/samba/ example / 디렉터리의 콘텐츠를 공유하고 Windows ACL을 사용하는 example이라는 공유를 생성할 수 있습니다.

절차

  1. 폴더가 없는 경우 해당 폴더를 생성합니다. 예를 들면 다음과 같습니다.

    # mkdir -p /srv/samba/example/
  2. enforcing 모드에서 SELinux를 실행하는 경우 디렉터리에 samba_share_t 컨텍스트를 설정합니다.

    # semanage fcontext -a -t samba_share_t "/srv/samba/example(/.)?"*
    # restorecon -Rv /srv/samba/example/
  3. 예제 공유를 /etc/samba/smb.conf 파일에 추가합니다. 예를 들어, 쓰기 가능 공유를 추가하려면 다음을 수행합니다.

    [example]
    	path = /srv/samba/example/
    	read only = no
    참고

    파일 시스템 ACL에 관계없이 read only = no를 설정하지 않으면 Samba는 읽기 전용 모드로 디렉토리를 공유합니다.

  4. [global] 섹션에서 모든 공유에 대해 Windows ACL 지원을 활성화하지 않은 경우 [example] 섹션에 다음 매개변수를 추가하여 이 공유에 대해 이 기능을 활성화합니다.

    vfs objects = acl_xattr
    map acl inherit = yes
    store dos attributes = yes
  5. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  6. 필요한 포트를 열고 firewall-cmd 유틸리티를 사용하여 방화벽 구성을 다시 로드합니다.

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  7. smb 서비스를 다시 시작하십시오.

    # systemctl restart smb

3.9.4. Windows ACL을 사용하는 공유 권한 및 파일 시스템 ACL 관리

Windows ACL을 사용하는 Samba 공유에서 공유 권한 및 파일 시스템 ACL을 관리하려면 컴퓨터 관리와 같은 Windows 애플리케이션을 사용합니다. 자세한 내용은 Windows 설명서를 참조하십시오. 또는 smbcacls 유틸리티를 사용하여 ACL을 관리합니다.

참고

Windows에서 파일 시스템 권한을 수정하려면 SeDiskOperatorPrivilege 권한이 부여된 계정을 사용해야 합니다.

3.10. smbcacls를 사용하여 SMB 공유에서 ACL 관리

smbcacls 유틸리티는 SMB 공유에 저장된 파일 및 디렉터리의 ACL을 나열, 설정 및 삭제할 수 있습니다. smbcacls를 사용하여 파일 시스템 ACL을 관리할 수 있습니다.

  • 고급 Windows ACL 또는 POSIX ACL을 사용하는 로컬 또는 원격 Samba 서버에서
  • Red Hat Enterprise Linux에서 Windows에서 호스팅되는 공유 영역에서 ACL을 원격으로 관리합니다.

3.10.1. 액세스 제어 항목

파일 시스템 오브젝트의 각 ACL 항목에는 다음 형식의 ACE(액세스 제어 항목)가 포함되어 있습니다.

security_principal:access_right/inheritance_information/permissions

예 3.3. 액세스 제어 항목

AD\Domain Users 그룹에 이 폴더, 하위 폴더 및 Windows의 파일에 적용되는 수정 권한이 있는 경우 ACL에 다음 ACE가 포함됩니다.

AD\Domain Users:ALLOWED/OI|CI/CHANGE

ACE에는 다음 부분이 포함됩니다.

보안 주체
보안 주체는 ACL의 권한이 적용되는 사용자, 그룹 또는 SID입니다.
액세스 권한
개체에 대한 액세스 권한이 부여되거나 거부되었는지 여부를 정의합니다. 값은 ALLOWED 또는 DENIED 일 수 있습니다.
상속 정보

다음 값이 있습니다.

표 3.1. 상속 설정

현재의설명매핑 대상

OI

오브젝트 Inherit

이 폴더 및 파일

CI

컨테이너 Inherit

이 폴더 및 하위 폴더

IO

상속 만

ACE가 현재 파일이나 디렉토리에는 적용되지 않습니다.

ID

상속됨

ACE는 상위 디렉터리에서 상속되었습니다.

또한 값은 다음과 같이 결합할 수 있습니다.

표 3.2. 상속 설정 조합

값 조합Windows Applies에 매핑되어 설정

OI|CI

이 폴더, 하위 폴더 및 파일

OI|CI|IO

하위 폴더 및 파일만

CI|IO

하위 폴더만

OI|IO

파일만

권한

이 값은 하나 이상의 Windows 권한 또는 smbcacls 별칭을 나타내는 16진수 값일 수 있습니다.

  • 하나 이상의 Windows 권한을 나타내는 16진수 값입니다.

    다음 표에는 고급 Windows 권한 및 해당 값이 16진수 형식으로 표시됩니다.

    표 3.3. Windows 권한 및 16진수 형식의 해당 smbcacls 값

    Windows 권한16진수 값

    전체 제어

    0x001F01FF

    폴더를 트래버스/실행 파일

    0x00100020

    디렉토리 표시 / 데이터 읽기

    0x00100001

    속성 읽기

    0x00100080

    확장 속성 읽기

    0x00100008

    파일 만들기 / 데이터 쓰기

    0x00100002

    폴더 생성 / 데이터 추가

    0x00100004

    쓰기 속성

    0x00100100

    확장 속성 쓰기

    0x00100010

    하위 폴더 및 파일 삭제

    0x00100040

    delete

    0x00110000

    읽기 권한

    0x00120000

    권한 변경

    0x00140000

    소유권 얻기

    0x00180000

    여러 권한을 비트 단위로 OR 작업을 사용하여 단일 16진수 값으로 결합할 수 있습니다. 자세한 내용은 ACE 마스크 계산을 참조하십시오.

  • smbcacls 별칭. 다음 테이블에는 사용 가능한 별칭이 표시됩니다.

    표 3.4. 기존 smbcacls 별칭 및 해당 Windows 권한

    smbcacls 별칭Windows 권한에 매핑

    R

    읽기

    READ

    읽기 및 실행

    W

    특수:

    • 파일 만들기 / 데이터 쓰기
    • 폴더 생성 / 데이터 추가
    • 쓰기 속성
    • 확장 속성 쓰기
    • 읽기 권한

    D

    delete

    P

    권한 변경

    O

    소유권 얻기

    X

    트래버스/실행

    변경

    수정

    FULL

    전체 제어

    참고

    권한을 설정할 때 단일 문자 별칭을 결합할 수 있습니다. 예를 들어 RD 를 설정하여 Windows 권한 Read and Delete 를 적용할 수 있습니다. 그러나 여러 개의 비 단일 문자 별칭을 결합하거나 별칭과 16진수 값을 결합할 수 없습니다.

3.10.2. smbcacls를 사용하여 ACL 표시

SMB 공유에 ACL을 표시하려면 smbcacls 유틸리티를 사용합니다. 작업 매개 변수(예: --add ) 없이 smbcacls 를 실행하면 유틸리티에 파일 시스템 오브젝트의 ACL이 표시됩니다.

절차

예를 들어----- server/example 공유의 루트 디렉토리의 ACL을 나열하려면 다음을 수행합니다.

# smbcacls //server/example / -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
REVISION:1
CONTROL:SR|PD|DI|DP
OWNER:AD\Administrators
GROUP:AD\Domain Users
ACL:AD\Administrator:ALLOWED/OI|CI/FULL
ACL:AD\Domain Users:ALLOWED/OI|CI/CHANGE
ACL:AD\Domain Guests:ALLOWED/OI|CI/0x00100021

명령의 출력이 표시됩니다.

  • REVISION: 보안 설명자의 내부 Windows NT ACL 개정
  • CONTROL: 보안 설명자 제어
  • OWNER: 보안 설명자 소유자의 이름 또는 SID
  • GROUP: 보안 설명자 그룹의 이름 또는 SID
  • ACL 항목. 자세한 내용은 액세스 제어 항목을 참조하십시오.

3.10.3. ACE 마스크 계산

대부분의 경우 ACE를 추가하거나 업데이트할 때 ExistingScopecacls 별칭 및 해당 Windows 권한 에 나열된 smbcacls 별칭을 사용합니다.

그러나 Windows 권한에 나열된 고급 Windows 권한 및 hex 형식으로 해당 smbcacls 값을 설정하려면 비트 단위 OR 작업을 사용하여 올바른 값을 계산해야 합니다. 다음 쉘 명령을 사용하여 값을 계산할 수 있습니다.

# echo $(printf '0x%X' $(( hex_value_1 | hex_value_2 | ... )))

예 3.4. ACE 마스크 계산

다음 권한을 설정하려고 합니다.

  • 폴더 통과/실행 파일(0x00100020)
  • 폴더 표시 / 읽기 데이터 (0x00100001)
  • 읽기 속성 (0x00100080)

이전 권한의 16진수 값을 계산하려면 다음을 입력합니다.

# echo $(printf '0x%X' $(( 0x00100020 | 0x00100001 | 0x00100080 )))
0x1000A1

ACE를 설정하거나 업데이트할 때 반환된 값을 사용합니다.

3.10.4. smbcacls를 사용하여 ACL 추가, 업데이트 및 제거

smbcacls 유틸리티에 전달하는 매개변수에 따라 파일 또는 디렉터리에서 ACL을 추가, 업데이트 및 제거할 수 있습니다.

ACL 추가

이 폴더, 하위 폴더 및 파일에 대한 CHANGE 권한을 부여하는 0.0.0.0/0 서버 /example 공유의 루트에 ACL을 추가하려면 AD\Domain Users 그룹에 다음을 수행합니다.

# smbcacls //server/example / -U "DOMAIN\administrator --add ACL:"AD\Domain Users":ALLOWED/OI|CI/CHANGE
ACL 업데이트

ACL 업데이트는 새 ACL을 추가하는 것과 유사합니다. 기존 보안 주체와 함께 --modify 매개 변수를 사용하여 ACL을 재정의하여 ACL을 업데이트합니다. smbcacls 가 ACL 목록에서 보안 주체를 찾는 경우 유틸리티는 권한을 업데이트합니다. 그렇지 않으면 명령이 오류와 함께 실패합니다.

ACL for SID principal_name not found

예를 들어 AD\Domain Users 그룹의 권한을 업데이트하고 이 폴더, 하위 폴더 및 파일의 READ 로 설정하려면 다음을 수행합니다.

# smbcacls //server/example / -U "DOMAIN\administrator --modify ACL:"AD\Domain Users":ALLOWED/OI|CI/READ
ACL 삭제

ACL을 삭제하려면 정확한 ACL을 사용하는 --delete 매개 변수를 smbcacls 유틸리티에 전달합니다. 예를 들면 다음과 같습니다.

# smbcacls //server/example / -U "DOMAIN\administrator --delete ACL:"AD\Domain Users":ALLOWED/OI|CI/READ

3.11. 사용자가 Samba 서버에서 디렉토리를 공유 가능

Samba 서버에서는 사용자가 루트 권한 없이 디렉터리를 공유할 수 있도록 구성할 수 있습니다.

3.11.1. 사용자 공유 기능 활성화

사용자가 디렉토리를 공유할 수 있으려면 관리자가 Samba에서 사용자 공유를 활성화해야 합니다.

예를 들어 로컬 example 그룹의 멤버만 활성화하여 사용자 공유를 생성하려면 다음을 수행합니다.

절차

  1. 로컬 example 그룹이 없는 경우 해당 그룹을 생성합니다.

    # groupadd example
  2. Samba에서 사용자 공유 정의를 저장하고 권한을 올바르게 설정하도록 디렉터리를 준비합니다. 예를 들면 다음과 같습니다.

    1. 디렉터리를 만듭니다.

      # mkdir -p /var/lib/samba/usershares/
    2. example 그룹에 대한 쓰기 권한을 설정합니다.

      # chgrp example /var/lib/samba/usershares/
      # chmod 1770 /var/lib/samba/usershares/
    3. 사용자가 이 디렉터리의 다른 사용자가 저장한 파일의 이름을 변경하거나 삭제하지 않도록 Sticky bit를 설정합니다.
  3. /etc/samba/smb.conf 파일을 편집하고 [global] 섹션에 다음을 추가합니다.

    1. 사용자 공유 정의를 저장하도록 구성한 디렉터리의 경로를 설정합니다. 예를 들면 다음과 같습니다.

      usershare path = /var/lib/samba/usershares/
    2. 이 서버에서 Samba를 만들 수 있는 사용자 공유 수를 설정합니다. 예를 들면 다음과 같습니다.

      usershare max shares = 100

      usershare max shares 매개변수에 기본값 0을 사용하는 경우 사용자 공유가 비활성화됩니다.

    3. 선택적으로 절대 디렉토리 경로 목록을 설정합니다. 예를 들어 Samba가 /data 및 / srv 디렉토리의 하위 디렉터리만 공유할 수 있도록 허용하려면 다음을 설정합니다.

      usershare prefix allow list = /data /srv

    설정할 수 있는 추가 사용자 공유 관련 매개변수 목록은 smb.conf(5) 도움말 페이지의 USERSHARES 섹션을 참조하십시오.

  4. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  5. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

    이제 사용자가 사용자 공유를 생성할 수 있습니다.

3.11.2. 사용자 공유 추가

Samba에서 사용자 공유 기능을 활성화한 후 사용자는 net usershare add 명령을 실행하여 root 권한 없이 Samba 서버의 디렉토리를 공유할 수 있습니다.

net usershare add 명령의 개요:

net usershare add share_name path [[ comment ] | [ ACLs ]] [ guest_ok=y|n ]

중요

사용자 공유를 생성할 때 ACL을 설정하는 경우 ACL보다 먼저 주석 매개변수를 지정해야 합니다. 빈 주석을 설정하려면 큰따옴표로 빈 문자열을 사용합니다.

관리자가 /etc/samba/smb.conf 파일의 [global] 섹션에서 관리자 집합 usershare에서 guest = yes를 허용하는 경우 사용자는 사용자 공유에서만 게스트 액세스를 활성화할 수 있습니다.

예 3.5. 사용자 공유 추가

사용자가 Samba 서버에서 /srv/samba/ 디렉터리를 공유하려고 합니다. 공유 이름은 example 이고, 주석을 설정하지 않으며, 게스트 사용자가 액세스할 수 있어야 합니다. 또한 공유 권한은 AD\Domain Users 그룹에 대한 전체 액세스 권한과 기타 사용자의 읽기 권한으로 설정해야 합니다. 이 공유를 추가하려면 사용자로 실행합니다.

$ net usershare add example /srv/samba/ "" "AD\Domain Users":F,Everyone:R guest_ok=yes

3.11.3. 사용자 공유의 설정 업데이트

사용자 공유의 설정을 업데이트하려면 net usershare add 명령을 동일한 공유 이름 및 새 설정으로 사용하여 공유를 재정의합니다. 사용자 공유 추가를 참조하십시오.

3.11.4. 기존 사용자 공유에 대한 정보 표시

사용자는 Samba 서버에 net usershare info 명령을 입력하여 사용자 공유 및 해당 설정을 표시할 수 있습니다.

사전 요구 사항

  • 사용자 공유는 Samba 서버에 구성됩니다.

절차

  1. 사용자가 만든 모든 사용자 공유를 표시하려면 다음을 수행하십시오.

    $ net usershare info -l
    [share_1]
    path=/srv/samba/
    comment=
    usershare_acl=Everyone:R,host_name\user:F,
    guest_ok=y
    ...

    명령을 실행하는 사용자가 생성한 공유만 나열하려면 -l 매개 변수를 생략합니다.

  2. 특정 공유에 대한 정보만 표시하려면 공유 이름 또는 와일드카드를 명령에 전달합니다. 예를 들어 share_ 로 시작하는 공유의 정보를 표시하려면 다음을 수행합니다.

    $ net usershare info -l share_* 

3.11.5. 사용자 공유 나열

Samba 서버에서의 설정 없이 사용 가능한 사용자 공유만 나열하려면 net usershare list 명령을 사용합니다.

사전 요구 사항

  • 사용자 공유는 Samba 서버에 구성됩니다.

절차

  1. 사용자가 생성한 공유를 나열하려면 다음을 수행합니다.

    $ net usershare list -l
    share_1
    share_2
    ...

    명령을 실행하는 사용자가 생성한 공유만 나열하려면 -l 매개 변수를 생략합니다.

  2. 특정 공유만 나열하려면 공유 이름 또는 와일드카드를 명령에 전달합니다. 예를 들어, share_ 로 시작하는 이름의 공유만 나열하려면 다음을 실행합니다.

    $ net usershare list -l share_* 

3.11.6. 사용자 공유 삭제

사용자 공유를 삭제하려면 net usershare delete 명령을 공유를 만든 사용자 또는 root 사용자로 사용합니다.

사전 요구 사항

  • 사용자 공유는 Samba 서버에 구성됩니다.

절차

$ net usershare delete share_name

3.12. 인증 없이 액세스를 허용하도록 공유 구성

특정 상황에서는 사용자가 인증 없이 연결할 수 있는 디렉터리를 공유하려고 합니다. 이를 구성하려면 공유에서 게스트 액세스를 활성화합니다.

주의

인증이 필요하지 않은 공유는 보안 위험이 될 수 있습니다.

3.12.1. 공유에 대한 게스트 액세스 활성화

공유에서 게스트 액세스가 활성화된 경우 Samba는 게스트 연결을 guest account 매개변수에 설정된 운영 체제 계정에 매핑합니다. 게스트 사용자는 다음 조건 중 하나 이상이 충족되면 이 공유에 있는 파일에 액세스할 수 있습니다.

  • 계정은 파일 시스템 ACL에 나열됩니다.
  • 다른 사용자의 POSIX 권한에서 허용

예 3.6. 게스트 공유 권한

게스트 계정을 nobody (기본값)에 매핑하도록 Samba를 구성한 경우 다음 예의 ACL을 사용합니다.

  • 게스트 사용자가 file1.txt를 읽을 수 있도록 허용
  • 게스트 사용자가 file2.txt를 읽고 수정할 수 있도록 허용
  • 게스트 사용자가 file3.txt를 읽거나 수정하지 못하게 합니다.
-rw-r--r--. 1 root       root      1024 1. Sep 10:00 file1.txt
-rw-r-----. 1 nobody     root      1024 1. Sep 10:00 file2.txt
-rw-r-----. 1 root       root      1024 1. Sep 10:00 file3.txt

절차

  1. /etc/samba/smb.conf 파일을 편집합니다.

    1. 이 서버에서 설정한 첫 번째 게스트 공유인 경우:

      1. [global] 섹션에서 guest = Bad User에 map을 설정합니다.

        [global]
                ...
                map to guest = Bad User

        이 설정에서 Samba는 사용자 이름이 존재하지 않는 한 잘못된 암호를 사용하는 로그인 시도를 거부합니다. 지정된 사용자 이름이 없고 공유에서 게스트 액세스가 활성화된 경우 Samba는 연결을 게스트 로그인으로 처리합니다.

      2. 기본적으로 Samba는 게스트 계정을 Red Hat Enterprise Linux의 nobody 계정에 매핑합니다. 또는 다른 계정을 설정할 수 있습니다. 예를 들면 다음과 같습니다.

        [global]
                ...
                guest account = user_name

        이 매개 변수에 설정된 계정은 Samba 서버에 로컬로 존재해야 합니다. 보안상의 이유로 유효한 쉘이 할당되지 않은 계정을 사용하는 것이 좋습니다.

    2. 게스트 ok = yes 설정을 [example] 공유 섹션에 추가합니다.

      [example]
              ...
              guest ok = yes
  2. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  3. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

3.13. macOS 클라이언트에 대해 Samba 구성

가상 파일 시스템(VFS) Samba 모듈은 Apple 서버 메시지 블록(SMB) 클라이언트와의 향상된 호환성을 제공합니다.

3.13.1. macOS 클라이언트에 파일 공유를 제공하기 위한 Samba 구성 최적화

fruit 모듈은 macOS 클라이언트와 Samba의 향상된 호환성을 제공합니다. Samba 서버에서 호스팅되는 모든 공유에 대해 모듈을 구성하여 macOS 클라이언트의 파일 공유를 최적화할 수 있습니다.

참고

전역에서 Flush 모듈을 사용할 수 있습니다. 클라이언트가 서버에 대한 첫 번째 연결을 설정할 때 macOS에서 서버 메시지 블록 버전 2(SMB2) Apple(AAPL) 프로토콜 확장을 협상합니다. 클라이언트가 AAPL 확장을 활성화하지 않고 공유에 먼저 연결하면 클라이언트는 서버의 공유에 확장을 사용하지 않습니다.

사전 요구 사항

  • Samba는 파일 서버로 구성됩니다.

절차

  1. /etc/samba/smb.conf 파일을 편집하고 [global] 섹션에서 advertise streams_xattr VFS 모듈을 활성화합니다.

    vfs objects = fruit streams_xattr
    중요

    streams_xattr활성화하기 전에 coding 모듈을 활성화해야 합니다. popular 모듈은 대체 데이터 스트림(ADS)을 사용합니다. 이러한 이유로 streams_xattr 모듈도 활성화해야 합니다.

  2. 선택적으로 공유에서 macOS Time Machine 지원을 제공하려면 /etc/samba/smb.conf 파일의 공유 구성에 다음 설정을 추가합니다.

    fruit:time machine = yes
  3. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  4. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

추가 리소스

3.14. smbclient 유틸리티를 사용하여 SMB 공유에 액세스

smbclient 유틸리티를 사용하면 명령줄 FTP 클라이언트와 마찬가지로 SMB 서버의 파일 공유에 액세스할 수 있습니다. 예를 들어 이를 사용하여 공유에 파일을 업로드하고 다운로드할 수 있습니다.

사전 요구 사항

  • samba-client 패키지가 설치되어 있습니다.

3.14.1. smbclient 대화형 모드 작동 방식

예를 들어 DOMAIN\user 계정을 사용하여 서버에서 호스팅되는 예제 공유로 인증하려면 다음을 수행합니다.

# smbclient -U "DOMAIN\user" //server/example
Enter domain\user's password:
Try "help" to get a list of possible commands.
smb: \>

smbclient 가 공유에 성공적으로 연결되면 유틸리티는 대화형 모드로 전환되고 다음 프롬프트가 표시됩니다.

smb: \>

대화형 쉘에서 사용 가능한 모든 명령을 표시하려면 다음을 입력합니다.

smb: \> help

특정 명령에 대한 도움말을 표시하려면 다음을 입력합니다.

smb: \> help command_name

추가 리소스

  • sambaclient(1) 도움말 페이지

3.14.2. 대화형 모드에서 smbclient 사용

smbclient-c 매개 변수 없이 사용하는 경우 유틸리티는 대화형 모드로 들어갑니다. 다음 절차에서는 SMB 공유에 연결하고 하위 디렉터리에서 파일을 다운로드하는 방법을 보여줍니다.

절차

  1. 공유에 연결합니다.

    # smbclient -U "DOMAIN\user_name" //server_name/share_name
  2. /example/ 디렉터리로 변경합니다.

    smb: \> d /example/
  3. 디렉터리에 파일을 나열합니다.

    smb: \example\> ls
      .                    D         0  Thu Nov 1 10:00:00 2018
      ..                   D         0  Thu Nov 1 10:00:00 2018
      example.txt          N   1048576  Thu Nov 1 10:00:00 2018
    
             9950208 blocks of size 1024. 8247144 blocks available
  4. example.txt 파일을 다운로드합니다.

    smb: \example\> get example.txt
    getting file \directory\subdirectory\example.txt of size 1048576 as example.txt (511975,0 KiloBytes/sec) (average 170666,7 KiloBytes/sec)
  5. 공유에서 연결을 끊습니다.

    smb: \example\> exit

3.14.3. 스크립팅 모드에서 smbclient 사용

c 매개 변수를 smbclient 에 전달하는 경우 원격 SMB 공유에서 명령을 자동으로 실행할 수 있습니다. 이를 통해 스크립트에서 smbclient를 사용할 수 있습니다.

다음 절차에서는 SMB 공유에 연결하고 하위 디렉터리에서 파일을 다운로드하는 방법을 보여줍니다.

절차

  • 다음 명령을 사용하여 공유에 연결하고 예제 디렉터리로 변경하고 example .txt 파일을 다운로드합니다.
# smbclient -U DOMAIN\user_name //server_name/share_name -c "cd /example/ ; get example.txt ; exit"

3.15. Samba를 인쇄 서버로 설정

Samba를 출력 서버로 설정하면 네트워크의 클라이언트가 Samba를 사용하여 출력할 수 있습니다. 또한 Windows 클라이언트가 구성된 경우 Samba 서버에서 드라이버를 다운로드할 수 있습니다.

이 섹션의 일부는 Samba Wiki에 게시된 인쇄 서버 설명서로 Samba 설정에서 채택되었습니다. 라이센스: CC BY 4.0. 작성자 및 기여자: Wiki 페이지의 기록 탭을 참조하십시오.

사전 요구 사항

Samba는 다음 모드 중 하나로 설정되었습니다.

3.15.1. Samba에서 인쇄 서버 지원 활성화

기본적으로 인쇄 서버 지원은 Samba에서 활성화되지 않습니다. Samba를 출력 서버로 사용하려면 그에 따라 Samba를 구성해야 합니다.

참고

인쇄 작업 및 프린터 작업에는 원격 프로시저 호출(RPC)이 필요합니다. 기본적으로 Samba는 RPC를 관리하기 위해 필요에 따라 CloudEventd_spools s 서비스를 시작합니다. 첫 번째 RPC 호출 중 또는 CUPS의 프린터 목록을 업데이트할 때 Samba는 CUPS에서 프린터 정보를 검색합니다. 프린터당 약 1초가 필요할 수 있습니다. 따라서 프린터가 50개 이상 있는 경우 CloudEvent d_spoolss 설정을 조정합니다.

사전 요구 사항

  • 프린터는 CUPS 서버에 구성됩니다.

    CUPS의 프린터 구성에 대한 자세한 내용은 출력 서버의 CUPS 웹 콘솔(https://printserver:631/help)에 제공된 문서를 참조하십시오.

절차

  1. /etc/samba/smb.conf 파일을 편집합니다.

    1. [ECDHEs] 섹션을 추가하여 Samba에서 출력 백엔드를 활성화합니다.

      [printers]
              comment = All Printers
              path = /var/tmp/
              printable = yes
              create mask = 0600
      중요

      [printers] 공유 이름은 하드 코딩되며 변경할 수 없습니다.

    2. CUPS 서버가 다른 호스트 또는 포트에서 실행되는 경우 [ECDHEs] 섹션에 설정을 지정합니다.

      cups server = printserver.example.com:631
    3. 프린터가 많은 경우 유휴 상태의 수를 CUPS에 연결된 프린터 수보다 높은 값으로 설정합니다. 예를 들어 프린터가 100개 있는 경우 [global] 섹션에서 설정합니다.

      rpcd_spoolss:idle_seconds = 200

      이 설정이 환경에서 확장되지 않는 경우 [global] 섹션의 CloudEvent d_spoolss 작업자 수도 늘립니다.

      rpcd_spoolss:num_workers = 10

      기본적으로 CloudEvent d_spoolss는 작업자 5개를 시작합니다.

  2. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  3. 필요한 포트를 열고 firewall-cmd 유틸리티를 사용하여 방화벽 구성을 다시 로드합니다.

    # firewall-cmd --permanent --add-service=samba
    # firewall-cmd --reload
  4. smb 서비스를 다시 시작하십시오.

    # systemctl restart smb

    서비스를 다시 시작한 후 Samba는 CUPS 백엔드에 구성된 모든 프린터를 자동으로 공유합니다. 특정 프린터만 수동으로 공유하려면 특정 프린터 수동 공유를 참조하십시오.

검증

  • 출력 작업을 제출합니다. 예를 들어,pdf 파일을 인쇄하려면 다음을 입력합니다.

    # smbclient -Uuser //sambaserver.example.com/printer_name -c "print example.pdf"

3.15.2. 수동으로 특정 프린터 공유

Samba를 출력 서버로 구성한 경우 기본적으로 Samba는 CUPS 백엔드에 구성된 모든 프린터를 공유합니다. 다음 절차에서는 특정 프린터만 공유하는 방법을 설명합니다.

사전 요구 사항

  • Samba가 인쇄 서버로 설정됨

절차

  1. /etc/samba/smb.conf 파일을 편집합니다.

    1. [global] 섹션에서 설정을 설정하여 자동 프린터 공유를 비활성화합니다.

      load printers = no
    2. 공유할 각 프린터에 대해 섹션을 추가합니다. 예를 들어 Samba 에서 CUPS 백엔드의 example 라는 프린터를 Example- printer로 공유하려면 다음 섹션을 추가합니다.

      [Example-Printer]
              path = /var/tmp/
              printable = yes
              printer name = example

      각 프린터에 대해 개별 스풀 디렉토리가 필요하지 않습니다. [printers] 섹션에 설정한 것과 동일한 스풀 디렉토리를 프린터 매개변수에 설정할 수 있습니다.

  2. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  3. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

3.16. Samba 인쇄 서버에서 Windows 클라이언트에 대한 자동 프린터 드라이버 다운로드 설정

Windows 클라이언트용 Samba 출력 서버를 실행하는 경우 드라이버 및 사전 설정 프린터를 업로드할 수 있습니다. 사용자가 프린터에 연결하면 Windows가 자동으로 드라이버를 다운로드하여 클라이언트에 로컬로 설치합니다. 사용자는 설치에 대한 로컬 관리자 권한이 필요하지 않습니다. 또한 Windows는 트레이 수와 같이 사전 구성된 드라이버 설정을 적용합니다.

이 섹션의 일부는 Samba Wiki에 게시된 Windows 클라이언트용 자동 프린터 드라이버 다운로드 설정 설명서에서 채택되었습니다. 라이센스: CC BY 4.0. 작성자 및 기여자: Wiki 페이지의 기록 탭을 참조하십시오.

사전 요구 사항

  • Samba가 인쇄 서버로 설정됨

3.16.1. 프린터 드라이버에 대한 기본 정보

이 섹션에서는 프린터 드라이버에 대한 일반적인 정보를 제공합니다.

지원되는 드라이버 모델 버전

Samba는 Windows 2000 이상 및 Windows Server 2000 이상에서 지원되는 프린터 드라이버 모델 버전 3만 지원합니다. Samba는 Windows 8 및 Windows Server 2012에 도입된 드라이버 모델 버전 4를 지원하지 않습니다. 그러나 이러한 버전과 이후 버전의 Windows 버전도 버전 3 드라이버를 지원합니다.

패키지 인식 드라이버

Samba는 패키지 인식 드라이버를 지원하지 않습니다.

업로드할 프린터 드라이버 준비

드라이버를 Samba 인쇄 서버에 업로드하려면 다음을 수행하십시오.

  • 압축된 형식으로 제공되는 경우 드라이버의 압축을 풉니다.
  • 일부 드라이버에서는 Windows 호스트에서 로컬로 드라이버를 설치하는 설정 애플리케이션을 시작해야 합니다. 특정 상황에서 설치 프로그램은 설치를 실행하는 동안 개별 파일을 운영 체제의 임시 폴더로 추출합니다. 드라이버 파일을 업로드에 사용하려면 다음을 수행합니다.

    1. 설치 프로그램을 시작합니다.
    2. 임시 폴더에서 새 위치로 파일을 복사합니다.
    3. 설치를 취소합니다.

프린터 제조업체에 인쇄 서버 업로드를 지원하는 드라이버를 요청합니다.

클라이언트에 프린터를 위한 32비트 및 64비트 드라이버 제공

32비트 및 64비트 Windows 클라이언트 모두에 대해 프린터용 드라이버를 제공하려면 두 아키텍처에서 정확히 동일한 이름으로 드라이버를 업로드해야 합니다. 예를 들어 Example PostScript라는 32비트 드라이버와 Example PostScript (v1.0) 라는 64비트 드라이버를 업로드하는 경우 이름이 일치하지 않습니다. 따라서 프린터에 드라이버 중 하나만 할당할 수 있으며 두 아키텍처에서는 드라이버를 모두 사용할 수 없습니다.

3.16.2. 사용자가 드라이버를 업로드하고 사전 구성 가능

프린터 드라이버를 업로드하고 사전 구성할 수 있으려면 사용자 또는 그룹에 SeprintOperatorPrivilege 권한이 부여되어야 합니다. 사용자를 printadmin 그룹에 추가해야 합니다. Red Hat Enterprise Linux는 samba 패키지를 설치할 때 이 그룹을 자동으로 생성합니다. printadmin 그룹에는 1000 미만의 사용 가능한 가장 낮은 동적 시스템 GID가 할당됩니다.

절차

  1. 예를 들어, printadmin 그룹에 Se print OperatorPrivilege 권한을 부여하려면 다음을 수행합니다.

    # net rpc rights grant "printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
    Enter DOMAIN\administrator's password:
    Successfully granted rights.
    참고

    도메인 환경에서 도메인 그룹에 Se printOperatorPrivilege 을 부여합니다. 이를 통해 사용자의 그룹 멤버십을 업데이트하여 권한을 중앙에서 관리할 수 있습니다.

  2. SePrintOperatorPrivilege 이 부여된 모든 사용자 및 그룹을 나열하려면 다음을 수행하십시오.

    # net rpc rights list privileges SePrintOperatorPrivilege -U "DOMAIN\administrator"
    Enter administrator's password:
    SePrintOperatorPrivilege:
      BUILTIN\Administrators
      DOMAIN\printadmin

3.16.3. print$ 공유 설정

Windows 운영 체제는 인쇄 서버에서 print$ 공유에서 프린터 드라이버를 다운로드합니다. 이 공유 이름은 Windows에서 하드 코딩되며 변경할 수 없습니다.

다음 절차에서는 /var/lib/samba/drivers/ 디렉터리를 print$로 공유하고 로컬 print admin 그룹의 멤버가 프린터 드라이버를 업로드할 수 있도록 하는 방법을 설명합니다.

절차

  1. [print$] 섹션을 /etc/samba/smb.conf 파일에 추가합니다.

    [print$]
            path = /var/lib/samba/drivers/
            read only = no
            write list = @printadmin
            force group = @printadmin
            create mask = 0664
            directory mask = 2775

    다음 설정을 사용합니다.

    • printadmin 그룹의 구성원만 프린터 드라이버를 공유에 업로드할 수 있습니다.
    • 새로 생성된 파일과 디렉토리의 그룹이 printadmin으로 설정됩니다.
    • 새 파일의 권한은 664로 설정됩니다.
    • 새 디렉터리의 권한은 2775로 설정됩니다.
  2. 모든 프린터에 대해 64비트 드라이버만 업로드하려면 /etc/samba/smb.conf 파일의 [global] 섹션에 이 설정을 포함하십시오.

    spoolss: architecture = Windows x64

    이 설정이 없으면 Windows에는 최소 32비트 버전을 업로드한 드라이버만 표시됩니다.

  3. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  4. Samba 구성 다시 로드

    # smbcontrol all reload-config
  5. printadmin 그룹이 없는 경우 해당 그룹을 생성합니다.

    # groupadd printadmin
  6. printadmin 그룹에 Se print OperatorPrivilege 권한을 부여합니다.

    # net rpc rights grant "printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
    Enter DOMAIN\administrator's password:
    Successfully granted rights.
  7. enforcing 모드에서 SELinux를 실행하는 경우 디렉터리에 samba_share_t 컨텍스트를 설정합니다.

    # semanage fcontext -a -t samba_share_t "/var/lib/samba/drivers(/.*)?"
    
    # restorecon -Rv /var/lib/samba/drivers/
  8. /var/lib/samba/drivers/ 디렉터리에 대한 권한을 설정합니다.

    • POSIX ACL을 사용하는 경우 다음을 설정합니다.

      # chgrp -R "printadmin" /var/lib/samba/drivers/
      # chmod -R 2775 /var/lib/samba/drivers/
    • Windows ACL을 사용하는 경우 다음을 설정합니다.

      Principal액세스적용 대상

      CREATOR OWNER

      전체 제어

      하위 폴더 및 파일만

      Authenticated Users

      읽기 및 실행, 폴더 내용 나열, 읽기

      이 폴더, 하위 폴더 및 파일

      printadmin

      전체 제어

      이 폴더, 하위 폴더 및 파일

      Windows에서 ACL 설정에 대한 자세한 내용은 Windows 설명서를 참조하십시오.

3.16.4. 클라이언트가 Samba 출력 서버를 신뢰할 수 있도록 GPO 만들기

보안상의 이유로 최신 Windows 운영 체제는 클라이언트가 신뢰할 수 없는 서버에서 패키지 인식 프린터 드라이버를 다운로드하지 못하도록 합니다. 인쇄 서버가 AD의 멤버인 경우 도메인에 그룹 정책 오브젝트(GPO)를 만들어 Samba 서버를 신뢰할 수 있습니다.

사전 요구 사항

  • Samba 인쇄 서버는 AD 도메인의 멤버입니다.
  • GPO를 생성하는 데 사용하는 Windows 컴퓨터에는 Windows RSAT(원격 서버 관리 도구)가 설치되어 있어야 합니다. 자세한 내용은 Windows 설명서를 참조하십시오.

절차

  1. AD 도메인 Administrator 사용자와 같은 그룹 정책을 편집할 수 있는 계정을 사용하여 Windows 컴퓨터에 로그인합니다.
  2. Group Policy Management Console을 엽니다.
  3. AD 도메인을 마우스 오른쪽 버튼으로 클릭하고 Create a GPO in this domain(이 도메인에서 GPO 만들기)을 선택하고 여기에 연결합니다.

    Samba에서 새 GPO 생성
  4. Legacy Printer Driver Policy 와 같은 GPO 이름을 입력하고 OK(확인 )를 클릭합니다. 새 GPO가 도메인 항목에 표시됩니다.
  5. 새로 만든 GPO를 마우스 오른쪽 버튼으로 클릭하고 Edit(편집 )를 선택하여 그룹 정책 관리 편집기 를 엽니다.
  6. Computer ConfigurationPoliciesTemplates Printers(관리 템플릿 프린터) 로 이동합니다.

    Samba, 프린터 GPO 그룹 선택
  7. 창 오른쪽에서 Point and Print Restriction 을 두 번 클릭하여 정책을 편집합니다.

    1. 정책을 활성화하고 다음 옵션을 설정합니다.

      1. Users(사용자)는 이러한 서버를 가리키고 출력할 수 있으며 Samba 인쇄 서버의 FQDN(정규화된 도메인 이름)을 이 옵션 옆에 있는 필드에 입력합니다.
      2. Security Prompts (보안 프롬프트) 아래에 있는 두 확인란 모두에서 Do not show warning or elevation prompt(경고 또는 승격 프롬프트 표시 안 함)를 선택합니다.

        Samba GPO 포인트 및 인쇄
    2. OK(확인)를 클릭합니다.
  8. Package Point and Print - Approved servers 를 두 번 클릭하여 정책을 편집합니다.

    1. 정책을 활성화하고 Show (표시) 버튼을 클릭합니다.
    2. Samba 출력 서버의 FQDN을 입력합니다.

      Samba GPO 승인 서버
    3. OK (확인)를 클릭하여 Show Contents (콘텐츠 표시) 및 정책의 속성 창을 둘 다 닫습니다.
  9. 그룹 정책 관리 편집기 를 닫습니다.
  10. 그룹 정책 관리 콘솔 을 닫습니다.

Windows 도메인 멤버가 그룹 정책을 적용한 후에는 사용자가 프린터에 연결하면 Samba 서버에서 프린터 드라이버를 자동으로 다운로드합니다.

추가 리소스

  • 그룹 정책을 사용하는 경우 Windows 설명서를 참조하십시오.

3.16.5. 드라이버 업로드 및 프린터 사전 구성

Windows 클라이언트에서 Print Management 애플리케이션을 사용하여 Samba 인쇄 서버에서 호스팅되는 드라이버 및 사전 설정 프린터를 업로드합니다. 자세한 내용은 Windows 설명서를 참조하십시오.

3.17. FIPS 모드가 활성화된 서버에서 Samba 실행

이 섹션에서는 FIPS 모드가 활성화된 상태에서 Samba를 실행할 때의 제한 사항을 간략하게 설명합니다. 또한 Samba를 실행하는 Red Hat Enterprise Linux 호스트에서 FIPS 모드를 활성화하는 절차를 수행합니다.

3.17.1. FIPS 모드에서 Samba 사용 제한

다음 Samba 모드 및 기능은 표시된 조건에서 FIPS 모드에서 작동합니다.

  • 도메인 구성원인 Samba는 AES 암호를 사용하는 Kerberos 인증이 있는 AD(Active Directory) 또는 IdM(Red Hat Identity Management) 환경에서만 사용됩니다.
  • Active Directory 도메인 멤버의 파일 서버로서의 Samba. 그러나 이 경우 클라이언트가 Kerberos를 사용하여 서버에 인증해야 합니다.

FIPS 모드가 활성화된 경우 다음 Samba 기능 및 모드가 작동하지 않습니다.

  • RC4 암호화가 차단되어 NT LAN Manager(NTLM) 인증
  • 서버 메시지 블록 버전 1 (SMB1) 프로토콜
  • NTLM 인증을 사용하므로 독립 실행형 파일 서버 모드
  • NT4 스타일 도메인 컨트롤러
  • NT4 스타일 도메인 구성원. Red Hat은 백그라운드에서 사용하는 기본 도메인 컨트롤러(PDC) 기능을 계속 지원합니다.
  • Samba 서버에 대한 암호 변경. Active Directory 도메인 컨트롤러에 대해 Kerberos를 사용하여 암호 변경만 수행할 수 있습니다.

다음 기능은 FIPS 모드에서 테스트되지 않았으므로 Red Hat에서 지원하지 않습니다.

  • Samba를 프린트 서버로 실행

3.17.2. FIPS 모드에서 Samba 사용

Samba를 실행하는 RHEL 호스트에서 FIPS 모드를 활성화할 수 있습니다.

사전 요구 사항

  • Samba는 Red Hat Enterprise Linux 호스트에서 구성됩니다.
  • Samba는 FIPS 모드에서 지원되는 모드에서 실행됩니다.

절차

  1. RHEL에서 FIPS 모드를 활성화합니다.

    # fips-mode-setup --enable
  2. 서버를 재부팅합니다.

    # reboot
  3. testparm 유틸리티를 사용하여 구성을 확인합니다.

    # testparm -s

    명령에서 오류 또는 비호환성을 표시하는 경우 이를 수정하여 Samba가 올바르게 작동하는지 확인합니다.

3.18. Samba 서버의 성능 튜닝

특정 상황에서 Samba의 성능을 향상시킬 수 있는 설정과 성능에 부정적인 영향을 미칠 수 있는 설정에 대해 알아봅니다.

이 섹션의 일부는 Samba Wiki에 게시된 Performance Tuning 설명서에서 채택되었습니다. 라이센스: CC BY 4.0. 작성자 및 기여자: Wiki 페이지의 기록 탭을 참조하십시오.

사전 요구 사항

  • Samba가 파일 또는 인쇄 서버로 설정됨

3.18.1. SMB 프로토콜 버전 설정

각 새 SMB 버전은 기능을 추가하고 프로토콜의 성능을 향상시킵니다. 최신 Windows 및 Windows Server 운영 체제는 항상 최신 프로토콜 버전을 지원합니다. Samba도 최신 프로토콜 버전을 사용하는 경우 Samba에 연결하는 Windows 클라이언트는 성능 개선을 활용합니다. Samba에서 서버 최대 프로토콜의 기본값은 지원되는 최신 SMB 프로토콜 버전으로 설정됩니다.

참고

안정적인 최신 SMB 프로토콜 버전을 항상 활성화하려면 server max protocol 매개 변수를 설정하지 마십시오. 매개 변수를 수동으로 설정한 경우 최신 프로토콜 버전을 활성화하려면 새 버전의 SMB 프로토콜로 설정을 수정해야 합니다.

다음 절차에서는 server max protocol 매개 변수에서 기본값을 사용하는 방법을 설명합니다.

절차

  1. /etc/samba/smb.conf 파일의 [global] 섹션에서 server max protocol 매개 변수를 제거합니다.
  2. Samba 구성 다시 로드

    # smbcontrol all reload-config

3.18.2. 많은 수의 파일이 포함된 디렉터리로 공유 튜닝

Linux는 대소문자를 구분하지 않는 파일 이름을 지원합니다. 따라서 Samba는 파일을 검색하거나 액세스할 때 디렉토리를 검색하거나 소문자로 검색해야 합니다. 소문자 또는 대문자로만 새 파일을 만들어 성능을 개선하도록 공유를 구성할 수 있습니다.

사전 요구 사항

  • Samba는 파일 서버로 구성됩니다.

절차

  1. 공유의 모든 파일의 이름을 소문자로 바꿉니다.

    참고

    이 절차의 설정을 사용하면 소문자 이외의 이름이 있는 파일이 더 이상 표시되지 않습니다.

  2. 공유의 섹션에서 다음 매개변수를 설정합니다.

    case sensitive = true
    default case = lower
    preserve case = no
    short preserve case = no

    매개 변수에 대한 자세한 내용은 smb.conf(5) 도움말 페이지에서 설명을 참조하십시오.

  3. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  4. Samba 구성을 다시 로드합니다.

    # smbcontrol all reload-config

이러한 설정을 적용한 후에는 이 공유에 새로 생성된 모든 파일의 이름이 소문자를 사용합니다. 이러한 설정으로 인해 Samba에서 더 이상 대문자 및 소문자로 디렉터리를 스캔할 필요가 없으므로 성능이 향상됩니다.

3.18.3. 성능에 부정적인 영향을 줄 수 있는 설정

기본적으로 Red Hat Enterprise Linux의 커널은 높은 네트워크 성능을 위해 조정됩니다. 예를 들어 커널은 버퍼 크기에 자동 튜닝 메커니즘을 사용합니다. /etc/samba/smb.conf 파일에서 socket options 매개 변수를 설정하면 이러한 커널 설정이 재정의됩니다. 결과적으로 이 매개 변수를 설정하면 대부분의 경우 Samba 네트워크 성능이 저하됩니다.

커널에서 최적화된 설정을 사용하려면 /etc/samba/smb.conf[global] 섹션에서 소켓 옵션 매개 변수를 제거합니다.

3.19. SMB 버전이 기본값보다 낮은 SMB 버전이 필요한 클라이언트와 호환되도록 Samba 구성

Samba는 지원하는 최소 SMB(서버 메시지 블록) 버전에 적절하고 안전한 기본값을 사용합니다. 그러나 이전 SMB 버전이 필요한 클라이언트가 있는 경우 Samba를 구성하여 지원할 수 있습니다.

3.19.1. Samba 서버에서 지원하는 최소 SMB 프로토콜 버전 설정

Samba에서 /etc/samba/smb.conf 파일의 server min protocol 매개 변수는 Samba 서버가 지원하는 최소 SMB(서버 메시지 블록) 프로토콜 버전을 정의합니다. 최소 SMB 프로토콜 버전을 변경할 수 있습니다.

참고

기본적으로 RHEL 8.2 이상의 Samba는 SMB2 및 최신 프로토콜 버전만 지원합니다. Red Hat은 더 이상 사용되지 않는 SMB1 프로토콜을 사용하지 않을 것을 권장합니다. 그러나 환경에 SMB1이 필요한 경우 수동으로 server min protocol 매개 변수를 NT1로 설정하여 SMB1 을 다시 활성화할 수 있습니다.

사전 요구 사항

  • Samba가 설치 및 구성되어 있습니다.

절차

  1. /etc/samba/smb.conf 파일을 편집하고 server min protocol 매개 변수를 추가하고, 매개 변수를 서버가 지원해야 하는 최소 SMB 프로토콜 버전으로 설정합니다. 예를 들어 최소 SMB 프로토콜 버전을 SMB3 로 설정하려면 다음을 추가합니다.

    server min protocol = SMB3
  2. smb 서비스를 다시 시작하십시오.

    # systemctl restart smb

추가 리소스

  • smb.conf(5) man page

3.20. 자주 사용되는 Samba 명령줄 유틸리티

이 장에서는 Samba 서버를 사용할 때 자주 사용되는 명령에 대해 설명합니다.

3.20.1. 순 광고 조인 및 net rpc 조인 명령 사용

net 유틸리티의 조인 하위 명령을 사용하여 Samba를 AD 또는 NT4 도메인에 연결할 수 있습니다. 도메인에 가입하려면 /etc/samba/smb.conf 파일을 수동으로 생성하고 PAM과 같은 추가 구성을 선택적으로 업데이트해야 합니다.

중요

도메인 가입을 위해 realm 유틸리티를 사용하는 것이 좋습니다. realm 유틸리티는 관련된 모든 구성 파일을 자동으로 업데이트합니다.

절차

  1. 다음 설정으로 /etc/samba/smb.conf 파일을 수동으로 생성합니다.

    • AD 도메인 멤버의 경우:

      [global]
      workgroup = domain_name
      security = ads
      passdb backend = tdbsam
      realm = AD_REALM
    • NT4 도메인 멤버의 경우:

      [global]
      workgroup = domain_name
      security = user
      passdb backend = tdbsam
  2. * 기본 도메인과 /etc/samba/smb.conf 파일의 [global] 섹션에 참여할 도메인에 대한 ID 매핑 구성을 추가합니다.
  3. /etc/samba/smb.conf 파일을 확인합니다.

    # testparm
  4. 도메인에 도메인 관리자로 가입합니다.

    • AD 도메인에 가입하려면 다음을 수행합니다.

      # net ads join -U "DOMAIN\administrator"
    • NT4 도메인에 가입하려면 다음을 수행합니다.

      # net rpc join -U "DOMAIN\administrator"
  5. winbind 소스를 /etc/nsswitch.conf 파일의 passwd그룹 database 항목에 추가합니다.

    passwd:     files winbind
    group:      files winbind
  6. winbind 서비스를 활성화하고 시작합니다.

    # systemctl enable --now winbind
  7. 선택적으로 authselect 유틸리티를 사용하여 PAM을 구성합니다.

    자세한 내용은 authselect(8) 도움말 페이지를 참조하십시오.

  8. AD 환경에 선택적으로 Kerberos 클라이언트를 구성합니다.

    자세한 내용은 Kerberos 클라이언트 설명서를 참조하십시오.

3.20.2. net rpc 권한 명령 사용

Windows에서는 공유 또는 업로드 프린터 드라이버에 ACL을 설정하는 등의 특수 작업을 수행할 수 있도록 계정과 그룹에 권한을 할당할 수 있습니다. Samba 서버에서는 net rpc rights 명령을 사용하여 권한을 관리할 수 있습니다.

설정할 수 있는 권한 나열

사용 가능한 모든 권한 및 소유자를 나열하려면 net rpc rights list 명령을 사용합니다. 예를 들면 다음과 같습니다.

# net rpc rights list -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
     SeMachineAccountPrivilege  Add machines to domain
      SeTakeOwnershipPrivilege  Take ownership of files or other objects
             SeBackupPrivilege  Back up files and directories
            SeRestorePrivilege  Restore files and directories
     SeRemoteShutdownPrivilege  Force shutdown from a remote system
      SePrintOperatorPrivilege  Manage printers
           SeAddUsersPrivilege  Add users and groups to the domain
       SeDiskOperatorPrivilege  Manage disk shares
           SeSecurityPrivilege  System security
권한 부여

계정 또는 그룹에 권한을 부여하려면 net rpc rights grant 명령을 사용합니다.

예를 들어, DOMAIN\printadmin 그룹에 Se printOperatorPrivilege 권한을 부여합니다.

# net rpc rights grant "DOMAIN\printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully granted rights.
권한 박탈

계정 또는 그룹의 권한을 취소하려면 net rpc rights revoke 명령을 사용합니다.

예를 들어 DOMAIN\printadmin 그룹에서 Seprint OperatorPrivilege 권한을 취소하려면 다음을 수행합니다.

# net rpc rights remoke "DOMAIN\printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator"
Enter DOMAIN\administrator's password:
Successfully revoked rights.

3.20.3. net rpc share 명령 사용

net rpc share 명령은 로컬 또는 원격 Samba 또는 Windows 서버에서 공유를 나열, 추가 및 제거하는 기능을 제공합니다.

공유 나열

SMB 서버의 공유를 나열하려면 net rpc share list 명령을 사용합니다. 선택적으로 -S server_name 매개 변수를 명령에 전달하여 원격 서버의 공유를 나열합니다. 예를 들면 다음과 같습니다.

# net rpc share list -U "DOMAIN\administrator" -S server_name
Enter DOMAIN\administrator's password:
IPC$
share_1
share_2
...
참고

/etc/samba/smb.conf 파일의 섹션에 browseable = no set이 있는 Samba 서버에서 호스팅되는 공유는 출력에 표시되지 않습니다.

공유 추가

net rpc share add 명령을 사용하면 SMB 서버에 공유를 추가할 수 있습니다.

예를 들어 C:\example\ 디렉터리를 공유하는 원격 Windows 서버에 예제 공유를 추가하려면 다음을 수행합니다.

# net rpc share add example="C:\example" -U "DOMAIN\administrator" -S server_name
참고

Windows 디렉토리 이름을 지정할 때 경로에서 후행 역슬래시를 생략해야 합니다.

명령을 사용하여 Samba 서버에 공유를 추가하려면 다음을 수행합니다.

  • -U 매개 변수에 지정된 사용자에게는 대상 서버에 SeDiskOperatorPrivilege 권한이 부여되어야 합니다.
  • /etc/samba/smb.conf 파일에 공유 섹션을 추가하고 Samba를 다시 로드하는 스크립트를 작성해야 합니다. 스크립트는 /etc/samba/smb.conf[global] 섹션에서 add share 명령 매개 변수에 설정해야 합니다. 자세한 내용은 smb.conf(5) 도움말 페이지의 공유 명령 추가 설명을 참조하십시오.
공유 제거

net rpc share delete 명령을 사용하면 SMB 서버에서 공유를 제거할 수 있습니다.

예를 들어 원격 Windows 서버에서 example이라는 공유를 제거하려면 다음을 수행합니다.

# net rpc share delete example -U "DOMAIN\administrator" -S server_name

명령을 사용하여 Samba 서버에서 공유를 제거하려면 다음을 수행합니다.

  • -U 매개 변수에 지정된 사용자에게는 SeDiskOperatorPrivilege 권한이 부여되어 있어야 합니다.
  • /etc/samba/smb.conf 파일에서 공유 섹션을 제거하고 Samba를 다시 로드하는 스크립트를 작성해야 합니다. 스크립트는 /etc/samba/smb.conf[global] 섹션에서 delete share 명령 매개 변수에 설정해야 합니다. 자세한 내용은 smb.conf(5) 도움말 페이지의 delete share 명령 설명을 참조하십시오.

3.20.4. net user 명령 사용

net user 명령을 사용하면 AD DC 또는 NT4 PDC에서 다음 작업을 수행할 수 있습니다.

  • 모든 사용자 계정 나열
  • 사용자 추가
  • 사용자 제거
참고

AD 도메인용 광고 나 NT4 도메인용 rpc 와 같은 연결 방법을 지정하는 것은 도메인 사용자 계정을 나열하는 경우에만 필요합니다. 다른 사용자 관련 하위 명령은 연결 방법을 자동으로 감지할 수 있습니다.

-U user_name 매개 변수를 명령에 전달하여 요청된 작업을 수행할 수 있는 사용자를 지정합니다.

도메인 사용자 계정 나열

AD 도메인의 모든 사용자를 나열하려면 다음을 수행합니다.

# net ads user -U "DOMAIN\administrator"

NT4 도메인의 모든 사용자를 나열하려면 다음을 수행하십시오.

# net rpc user -U "DOMAIN\administrator"
도메인에 사용자 계정 추가

Samba 도메인 멤버에서 net user add 명령을 사용하여 사용자 계정을 도메인에 추가할 수 있습니다.

예를 들어 user 계정을 도메인에 추가합니다.

  1. 계정을 추가합니다.

    # net user add user password -U "DOMAIN\administrator"
    User user added
  2. 선택적으로, 원격 프로시저 호출(RPC) 쉘을 사용하여 AD DC 또는 NT4 PDC에서 계정을 활성화합니다. 예를 들면 다음과 같습니다.

    # net rpc shell -U DOMAIN\administrator -S DC_or_PDC_name
    Talking to domain DOMAIN (S-1-5-21-1424831554-512457234-5642315751)
    
    net rpc> user edit disabled user: no
    Set user's disabled flag from [yes] to [no]
    
    net rpc> exit
도메인에서 사용자 계정 삭제

Samba 도메인 멤버에서는 net user delete 명령을 사용하여 도메인에서 사용자 계정을 제거할 수 있습니다.

예를 들어 도메인에서 user 계정을 제거하려면 다음을 수행합니다.

# net user delete user -U "DOMAIN\administrator"
User user deleted

3.20.5. rpcclient 유틸리티 사용

rpcclient 유틸리티를 사용하면 로컬 또는 원격 SMB 서버에서 클라이언트측 MS-RPC 기능을 수동으로 실행할 수 있습니다. 그러나 대부분의 기능은 Samba에서 제공하는 별도의 유틸리티로 통합됩니다. rpcclient 는 MS-PRC 함수를 테스트하는 경우에만 사용합니다.

사전 요구 사항

  • samba-client 패키지가 설치되어 있습니다.

예를 들어 rpcclient 유틸리티를 사용하여 다음을 수행할 수 있습니다.

  • 프린터 스풀 하위 시스템(SPOOLSS) 관리.

    예 3.7. 프린터에 드라이버 할당

    # rpcclient server_name -U "DOMAIN\administrator" -c 'setdriver "printer_name" "driver_name"'
    Enter DOMAIN\administrators password:
    Successfully set printer_name to driver driver_name.
  • SMB 서버에 대한 정보를 검색합니다.

    예 3.8. 모든 파일 공유 및 공유 프린터 나열

    # rpcclient server_name -U "DOMAIN\administrator" -c 'netshareenum'
    Enter DOMAIN\administrators password:
    netname: Example_Share
    	remark:
    	path:   C:\srv\samba\example_share\
    	password:
    netname: Example_Printer
    	remark:
    	path:   C:\var\spool\samba\
    	password:
  • SCC(Security Account Manager Remote) 프로토콜을 사용하여 작업을 수행합니다.

    예 3.9. SMB 서버에 사용자 나열

    # rpcclient server_name -U "DOMAIN\administrator" -c 'enumdomusers'
    Enter DOMAIN\administrators password:
    user:[user1] rid:[0x3e8]
    user:[user2] rid:[0x3e9]

    독립 실행형 서버 또는 도메인 구성원에 대해 명령을 실행하면 로컬 데이터베이스의 사용자가 나열됩니다. AD DC 또는 NT4 PDC에 대해 명령을 실행하면 도메인 사용자가 나열됩니다.

추가 리소스

  • haproxyclient(1) 도움말 페이지

3.20.6. samba-regedit 애플리케이션 사용

프린터 구성과 같은 특정 설정은 Samba 서버의 레지스트리에 저장됩니다. ncurses 기반 samba-regedit 애플리케이션을 사용하여 Samba 서버의 레지스트리를 편집할 수 있습니다.

samba regedit

사전 요구 사항

  • samba-client 패키지가 설치되어 있습니다.

절차

애플리케이션을 시작하려면 다음을 입력합니다.

# samba-regedit

다음 키를 사용합니다.

  • 커서가 이동한 후 커서가 삭제됩니다. 레지스트리 트리와 값을 탐색합니다.
  • Enter: 키를 열거나 값을 편집합니다.
  • : Key (키)와 Value(값 ) 창 사이를 전환합니다.
  • Ctrl+C: 애플리케이션을 닫습니다.

3.20.7. smbcontrol 유틸리티 사용

smbcontrol 유틸리티를 사용하면 smbd,nmbd,winbindd 또는 모든 서비스에 명령 메시지를 보낼 수 있습니다. 이러한 제어 메시지는 서비스(예:)에서 구성을 다시 로드하도록 지시합니다.

사전 요구 사항

  • samba-common-tools 패키지가 설치되어 있습니다.

절차

  • reload-config 메시지 유형을 all 대상으로 전송하여 smbd,nmbd,winbindd 서비스의 구성을 다시 로드합니다.
# smbcontrol all reload-config

추가 리소스

  • smbcontrol(1) 도움말 페이지

3.20.8. smbpasswd 유틸리티 사용

smbpasswd 유틸리티는 로컬 Samba 데이터베이스에서 사용자 계정과 암호를 관리합니다.

사전 요구 사항

  • samba-common-tools 패키지가 설치되어 있습니다.

절차

  1. 명령을 사용자로 실행하는 경우 smbpasswd 는 명령을 실행하는 사용자의 Samba 암호를 변경합니다. 예를 들면 다음과 같습니다.

    [user@server ~]$ smbpasswd
    New SMB password: password
    Retype new SMB password: password
  2. root 사용자로 smbpasswd를 실행하는 경우 유틸리티를 사용하여 다음을 수행할 수 있습니다.

    • 새 사용자를 생성합니다.

      [root@server ~]# smbpasswd -a user_name
      New SMB password: password
      Retype new SMB password: password
      Added user user_name.
      참고

      사용자를 Samba 데이터베이스에 추가하려면 로컬 운영 체제에서 계정을 만들어야 합니다. 기본 시스템 설정 구성 가이드 의 명령줄에서 새 사용자 추가 섹션을 참조하십시오.

    • Samba 사용자를 활성화합니다.

      [root@server ~]# smbpasswd -e user_name
      Enabled user user_name.
    • Samba 사용자를 비활성화합니다.

      [root@server ~]# smbpasswd -x user_name
      Disabled user user_name
    • 사용자를 삭제합니다.

      [root@server ~]# smbpasswd -x user_name
      Deleted user user_name.

추가 리소스

  • sambapasswd(8) 도움말 페이지

3.20.9. smbstatus 유틸리티 사용

smbstatus 유틸리티는 다음에 대해 보고합니다.

  • smbd 데몬의 PID당 Samba 서버에 대한 연결. 이 보고서에는 사용자 이름, 기본 그룹, SMB 프로토콜 버전, 암호화 및 서명 정보가 포함됩니다.
  • Samba 공유별 연결. 이 보고서에는 smbd 데몬의 PID, 연결 시스템의 IP, 연결이 설정된 타임스탬프, 암호화 및 서명 정보가 포함됩니다.
  • 잠긴 파일 목록. 보고서 항목에는 opportunistic 잠금 (oplock) 유형과 같은 추가 세부 정보가 포함됩니다.

사전 요구 사항

  • samba 패키지가 설치되어 있습니다.
  • smbd 서비스가 실행 중입니다.

절차

# smbstatus

Samba version 4.15.2
PID  Username              Group                Machine                            Protocol Version  Encryption  Signing
....-------------------------------------------------------------------------------------------------------------------------
963  DOMAIN\administrator  DOMAIN\domain users  client-pc  (ipv4:192.0.2.1:57786)  SMB3_02           -           AES-128-CMAC

Service  pid  Machine    Connected at                  Encryption  Signing:
....---------------------------------------------------------------------------
example  969  192.0.2.1  Thu Nov  1 10:00:00 2018 CEST  -           AES-128-CMAC

Locked files:
Pid  Uid    DenyMode   Access    R/W     Oplock      SharePath           Name      Time
....--------------------------------------------------------------------------------------------------------
969  10000  DENY_WRITE 0x120089  RDONLY  LEASE(RWH)  /srv/samba/example  file.txt  Thu Nov  1 10:00:00 2018

추가 리소스

  • smbstatus(1) 도움말 페이지

3.20.10. smbtar 유틸리티 사용

smbtar 유틸리티는 SMB 공유 또는 하위 디렉터리의 콘텐츠를 백업하고 tar 아카이브에 콘텐츠를 저장합니다. 또는 테이프 장치에 콘텐츠를 작성할 수 있습니다.

사전 요구 사항

  • samba-client 패키지가 설치되어 있습니다.

절차

  • 다음 명령을 사용하여 0.0.0.0/0 server/example/ 공유에 있는 demo 디렉터리의 콘텐츠를 백업하고 해당 콘텐츠를 /root/example.tar 아카이브에 저장합니다.

    # smbtar -s server -x example -u user_name -p password -t /root/example.tar

추가 리소스

  • sambatar(1) 도움말 페이지

3.20.11. wbinfo 유틸리티 사용

wbinfo 유틸리티는 winbindd 서비스에서 생성 및 사용하는 정보를 쿼리하고 반환합니다.

사전 요구 사항

  • samba-winbind-clients 패키지가 설치되어 있습니다.

절차

예를 들어 wbinfo를 사용하여 다음을 수행할 수 있습니다.

  • 도메인 사용자를 나열합니다.

    # wbinfo -u
    AD\administrator
    AD\guest
    ...
  • 도메인 그룹을 나열합니다.

    # wbinfo -g
    AD\domain computers
    AD\domain admins
    AD\domain users
    ...
  • 사용자의 SID를 표시합니다.

    # wbinfo --name-to-sid="AD\administrator"
    S-1-5-21-1762709870-351891212-3141221786-500 SID_USER (1)
  • 도메인 및 신뢰에 대한 정보를 표시합니다.

    # wbinfo --trusted-domains --verbose
    Domain Name   DNS Domain            Trust Type  Transitive  In   Out
    BUILTIN                             None        Yes         Yes  Yes
    server                              None        Yes         Yes  Yes
    DOMAIN1       domain1.example.com   None        Yes         Yes  Yes
    DOMAIN2       domain2.example.com   External    No          Yes  Yes

추가 리소스

  • wbinfo(1) 도움말 페이지

3.21. 추가 리소스

4장. BIND DNS 서버 설정 및 구성

BIND는 IETF(Internet Engineering Task Force) DNS 표준 및 초안 표준을 완벽하게 준수하는 기능이 풍부한 DNS 서버입니다. 예를 들어 관리자는 다음과 같이 BIND를 자주 사용합니다.

  • 로컬 네트워크의 DNS 서버 캐싱
  • 영역에 대한 권한 있는 DNS 서버
  • 영역에 고가용성을 제공하는 보조 서버

4.1. SELinux로 BIND를 보호하거나 변경 루트 환경에서 실행하는 방법에 대한 고려 사항

BIND 설치를 보호하려면 다음을 수행할 수 있습니다.

  • 변경-루트 환경 없이 named 서비스를 실행합니다. 이 경우 강제 모드에서 SELinux는 알려진 BIND 보안 취약점을 악용할 수 없습니다. 기본적으로 Red Hat Enterprise Linux는 SELinux를 강제 모드로 사용합니다.

    중요

    강제 모드에서 SELinux를 사용하여 BIND를 실행하는 것이 변경 루트 환경에서 BIND를 실행하는 것보다 더 안전합니다.

  • change-root 환경에서 named-chroot 서비스를 실행합니다.

    관리자는 change-root 기능을 사용하여 프로세스의 루트 디렉터리와 해당 하위 프로세스가 / 디렉터리와 다른 것을 정의할 수 있습니다. named-chroot 서비스를 시작하면 BIND에서 루트 디렉토리를 /var/named/chroot/ 로 전환합니다. 결과적으로 서비스는 mount --bind 명령을 사용하여 /var/named/chroot/ 에 있는 /etc/named-chroot.files 에 나열된 파일 및 디렉터리를 만들고 프로세스는 /var/named/chroot/ 외부의 파일에 대한 액세스 권한이 없습니다.

BIND를 사용하도록 결정하는 경우:

  • 일반 모드에서는 named 서비스를 사용합니다.
  • 변경 루트 환경에서 named-chroot 서비스를 사용합니다. 이를 위해서는 named-chroot 패키지를 추가로 설치해야 합니다.

추가 리소스

  • named(8) 매뉴얼 페이지에 있는 Red Hat SELinux BIND 보안 프로필 섹션

4.2. BIND 관리자 참조 설명서

bind 패키지에 포함된 포괄적인 BIND 관리자 참조 설명서에서는 다음을 제공합니다.

  • 구성 예
  • 고급 기능에 대한 설명서
  • 구성 참조
  • 보안 고려 사항

bind 패키지가 설치된 호스트에 BIND 관리자 참조 매뉴얼을 표시하려면 브라우저에서 /usr/share/doc/bind/Bv9ARM.html 파일을 엽니다.

4.3. BIND를 캐싱 DNS 서버로 구성

기본적으로 BIND DNS 서버는 성공 및 실패한 조회를 확인하고 캐시합니다. 그러면 서비스는 캐시의 동일한 레코드에 대한 요청에 응답합니다. 이렇게 하면 DNS 조회 속도가 크게 향상됩니다.

사전 요구 사항

  • 서버의 IP 주소는 고정입니다.

절차

  1. bindbind-utils 패키지를 설치합니다.

    # yum install bind bind-utils

    이 패키지는 BIND 9.11을 제공합니다. BIND 9.16이 필요한 경우 bind9.16bind9.16-utils 패키지를 설치합니다.

  2. change-root 환경에서 BIND를 실행하려면 bind-chroot 패키지를 설치합니다.

    # yum install bind-chroot

    SELinux가 강제 모드로 호스트에서 BIND를 실행하는 것은 기본적으로 더 안전합니다.

  3. /etc/named.conf 파일을 편집하고 options 문에서 다음과 같이 변경합니다.

    1. listen-onlisten-on-v6 문을 업데이트하여 BIND에서 수신 대기해야 하는 IPv4 및 IPv6 인터페이스를 지정합니다.

      listen-on port 53 { 127.0.0.1; 192.0.2.1; };
      listen-on-v6 port 53 { ::1; 2001:db8:1::1; };
    2. allow-query 문을 업데이트하여 이 DNS 서버를 쿼리할 수 있는 IP 주소 및 범위 클라이언트를 구성합니다.

      allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
    3. allow-recursion 문을 추가하여 어떤 IP 주소 및 범위 BIND에서 재귀 쿼리를 허용하는지 정의합니다.

      allow-recursion { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
      주의

      서버의 공용 IP 주소에서 재귀를 허용하지 마십시오. 그렇지 않으면 서버가 대규모 DNS 확장 공격의 일부가 될 수 있습니다.

    4. 기본적으로 BIND는 루트 서버에서 권한 있는 DNS 서버로 반복적으로 쿼리하여 쿼리를 해결합니다. 또는 공급자와 같은 다른 DNS 서버로 쿼리를 전달하도록 BIND를 구성할 수도 있습니다. 이 경우 BIND에서 쿼리를 전달해야 하는 DNS 서버의 IP 주소 목록을 사용하여 forwarders 문을 추가합니다.

      forwarders { 198.51.100.1; 203.0.113.5; };

      폴백 동작으로 BIND는 전달자 서버가 응답하지 않는 경우 쿼리를 재귀적으로 해결합니다. 이 동작을 비활성화하려면 forward only; 문을 추가합니다.

  4. /etc/named.conf 파일의 구문을 확인합니다.

    # named-checkconf

    명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.

  5. 들어오는 DNS 트래픽을 허용하도록 firewalld 규칙을 업데이트합니다.

    # firewall-cmd --permanent --add-service=dns
    # firewall-cmd --reload
  6. BIND를 시작하고 활성화합니다.

    # systemctl enable --now named

    change-root 환경에서 BIND를 실행하려면 systemctl enable --now named-chroot 명령을 사용하여 서비스를 활성화 및 시작합니다.

검증

  1. 새로 설정된 DNS 서버를 사용하여 도메인을 확인합니다.

    # dig @localhost www.example.org
    ...
    www.example.org.    86400    IN    A    198.51.100.34
    
    ;; Query time: 917 msec
    ...

    이 예에서는 BIND가 동일한 호스트에서 실행되고 localhost 인터페이스의 쿼리에 응답하는 것으로 가정합니다.

    처음으로 레코드를 쿼리한 후 BIND는 해당 캐시에 항목을 추가합니다.

  2. 이전 쿼리를 반복합니다.

    # dig @localhost www.example.org
    ...
    www.example.org.    85332    IN    A    198.51.100.34
    
    ;; Query time: 1 msec
    ...

    캐시된 항목으로 인해 항목이 만료될 때까지 동일한 레코드에 대한 추가 요청이 훨씬 더 빨라집니다.

다음 단계

  • 이 DNS 서버를 사용하도록 네트워크의 클라이언트를 구성합니다. DHCP 서버가 클라이언트에 DNS 서버 설정을 제공하는 경우 그에 따라 DHCP 서버의 구성을 업데이트합니다.

4.4. BIND DNS 서버에서 로깅 구성

bind 패키지에서 제공하는 기본 /etc/named.conf 파일의 구성은 default_debug 채널을 사용하고 메시지를 /var/named/data/named.run 파일에 기록합니다. default_debug 채널은 서버의 디버그 수준이 0이 아닌 경우에만 항목을 기록합니다.

서로 다른 채널 및 카테고리를 사용하여 파일을 분리하기 위해 정의된 심각도가 있는 다양한 이벤트를 작성하도록 BIND를 구성할 수 있습니다.

사전 요구 사항

  • 예를 들어 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
  • named 또는 named-chroot 서비스가 실행 중입니다.

절차

  1. /etc/named.conf 파일을 편집하고 다음과 같이 categorychannel phrases를 logging 구문에 추가합니다. 예를 들면 다음과 같습니다.

    logging {
        ...
    
        category notify { zone_transfer_log; };
        category xfer-in { zone_transfer_log; };
        category xfer-out { zone_transfer_log; };
        channel zone_transfer_log {
            file "/var/named/log/transfer.log" versions 10 size 50m;
            print-time yes;
            print-category yes;
            print-severity yes;
            severity info;
         };
    
         ...
    };

    이 예제 구성을 사용하여 영역 전송과 관련된 메시지를 /var/named/log/transfer.log 로 기록합니다. BIND에서는 로그 파일의 최대 10 개의 버전을 생성하고 최대 50 MB의 크기에 도달하면 순환합니다.

    category phrase는 카테고리 메시지를 전송하는 채널 BIND를 정의합니다.

    채널 문구는 버전 수, 최대 파일 크기, 심각도 수준 BIND가 채널에 기록해야 하는 등 로그 메시지의 대상을 정의합니다. 이벤트의 타임 스탬프, 카테고리 및 심각도 로깅 활성화와 같은 추가 설정은 선택 사항이지만 디버깅 목적에 유용합니다.

  2. 로그 디렉터리가 없는 경우 생성하고 이 디렉터리의 named 사용자에게 쓰기 권한을 부여합니다.

    # mkdir /var/named/log/
    # chown named:named /var/named/log/
    # chmod 700 /var/named/log/
  3. /etc/named.conf 파일의 구문을 확인합니다.

    # named-checkconf

    명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.

  4. BIND를 다시 시작합니다.

    # systemctl restart named

    change-root 환경에서 BIND를 실행하는 경우 systemctl restart named-chroot 명령을 사용하여 서비스를 다시 시작합니다.

검증

  • 로그 파일의 내용을 표시합니다.

    # cat /var/named/log/transfer.log
    ...
    06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR started: TSIG example-transfer-key (serial 2022070603)
    06-Jul-2022 15:08:51.261 xfer-out: info: client @0x7fecbc0b0700 192.0.2.2#36121/key example-transfer-key (example.com): transfer of 'example.com/IN': AXFR ended

추가 리소스

4.5. BIND ACL 작성

BIND의 특정 기능에 대한 액세스를 제어하면 DoS(서비스 거부)와 같은 무단 액세스 및 공격을 방지할 수 있습니다. BIND 액세스 제어 목록(acl) 설명은 IP 주소 및 범위 목록입니다. 각 ACL에는 지정된 IP 주소 및 범위를 참조하기 위해 allow-query 와 같은 여러 문에서 사용할 수 있는 별 이름이 있습니다.

주의

BIND에서는 ACL에서 첫 번째 일치 항목만 사용합니다. 예를 들어 ACL { 192.0.2/24; !192.0.2.1; } 및 IP 주소 10.0.0.1 1 이 연결된 호스트를 정의하는 경우, 두 번째 항목이 이 주소를 제외하더라도 액세스 권한이 부여됩니다.

BIND에는 다음과 같은 ACL이 기본 제공됩니다.

  • 제공되지 않음: 호스트 일치 없음.
  • any: 모든 호스트와 일치합니다.
  • localhost: 루프백 주소 127.0.0.1::1, 및 BIND를 실행하는 서버의 모든 인터페이스의 IP 주소와 일치합니다.
  • localnets: 루프백 주소 127.0.0.1::1, 및 BIND를 실행하는 모든 서브넷에 직접 연결됩니다.

사전 요구 사항

  • 예를 들어 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
  • named 또는 named-chroot 서비스가 실행 중입니다.

절차

  1. /etc/named.conf 파일을 편집하고 다음과 같이 변경합니다.

    1. 파일에 acl 문을 추가합니다. 예를 들어 127.0.0.1,192.0.2.0/242001:db8:1::/64 에 대해 internal-networks 라는 ACL을 생성하려면 다음을 입력합니다.

      acl internal-networks { 127.0.0.1; 192.0.2.0/24; 2001:db8:1::/64; };
      acl dmz-networks { 198.51.100.0/24; 2001:db8:2::/64; };
    2. ACL의 닉네임을 지원하는 설명에 사용합니다. 예를 들면 다음과 같습니다.

      allow-query { internal-networks; dmz-networks; };
      allow-recursion { internal-networks; };
  2. /etc/named.conf 파일의 구문을 확인합니다.

    # named-checkconf

    명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.

  3. BIND를 다시 로드합니다.

    # systemctl reload named

    change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

검증

  • 구성된 ACL을 사용하는 기능을 트리거하는 작업을 실행합니다. 예를 들어 이 절차의 ACL은 정의된 IP 주소의 재귀적 쿼리만 허용합니다. 이 경우 외부 도메인 확인을 위해 ACL의 정의에 없는 호스트에 다음 명령을 입력합니다.

    # dig +short @192.0.2.1 www.example.com

    이 명령에서 출력을 반환하지 않으면 BIND에서 액세스를 거부했으며 ACL이 작동합니다. 클라이언트의 자세한 출력을 보려면 +short 옵션없이 명령을 사용하십시오.

    # dig @192.0.2.1 www.example.com
    ...
    ;; WARNING: recursion requested but not available
    ...

4.6. BIND DNS 서버에서 영역 구성

DNS 영역은 도메인 공간의 특정 하위 트리에 대한 리소스 레코드가 있는 데이터베이스입니다. 예를 들어 example.com 도메인을 담당하는 경우 BIND에서 해당 도메인의 영역을 설정할 수 있습니다. 결과적으로 클라이언트는 www.example.com 를 이 영역에 구성된 IP 주소로 확인할 수 있습니다.

4.6.1. 영역 파일의 SOA 레코드

DNS 영역의 필수 레코드는 SOA(start of authority) 레코드입니다. 예를 들어 이 레코드는 여러 DNS 서버에 영역에 대해 권한이 있지만 DNS 확인자에 대해서도 중요합니다.

BIND의 SOA 레코드에는 다음 구문이 있습니다.

name class type mname rname serial refresh retry expire minimum

가독성을 높이기 위해 관리자는 일반적으로 영역 파일의 레코드를 여러 줄로 분할합니다. 주석으로 구분(;;). SOA 레코드를 분할하면 레코드를 함께 유지합니다.

@ IN SOA ns1.example.com. hostmaster.example.com. (
                          2022070601 ; serial number
                          1d         ; refresh period
                          3h         ; retry period
                          3d         ; expire time
                          3h )       ; minimum TTL
중요

정규화된 도메인 이름(FQDN) 끝에 있는 후행 점을 확인합니다. FQDN은 점으로 구분된 여러 도메인 레이블로 구성됩니다. DNS 루트에는 빈 레이블이 있으므로 FQDN은 점으로 끝납니다. 따라서 BIND는 후행 점 없이 이름에 영역 이름을 추가합니다. 후행 점이 없는 호스트 이름(예: ns1.example.com 은 기본 이름 서버의 올바른 주소가 아닌 ns1.example.com. example.com으로 확장됩니다.)

다음은 SOA 레코드의 필드입니다.

  • 이름: 영역의 이름, 즉 origin. 이 필드를 @ 로 설정하면 BIND가 /etc/named.conf 에 정의된 영역 이름으로 확장됩니다.
  • 클래스: SOA 레코드에서는 이 필드를 항상 인터넷(IN)으로 설정해야 합니다.
  • 유형: SOA 레코드에서는 이 필드를 항상 SOA 로 설정해야 합니다.
  • mname (마스터 이름): 이 영역의 기본 이름 서버의 호스트 이름입니다.
  • R NAME (Responsible name): 이 영역을 담당하는 사용자의 이메일 주소입니다. 형식은 다릅니다. at 기호(@)를 점(..)으로 교체해야 합니다.
  • serial: 이 영역 파일의 버전 번호입니다. 보조 이름 서버는 기본 서버의 일련 번호가 더 높은 경우에만 영역의 복사본을 업데이트합니다.

    형식은 숫자 값일 수 있습니다. 일반적으로 사용되는 형식은 < year><month><day><two-digit-number >입니다. 이 형식을 사용하면 이론적으로 영역 파일을 하루에 100 번까지 변경할 수 있습니다.

  • 새로 고침: 영역이 업데이트된 경우 기본 서버를 확인하기 전에 보조 서버가 대기하는 시간입니다.
  • 재시도: 실패한 시도 후 보조 서버가 주 서버를 쿼리하기 위해 다시 시도한 후의 시간입니다.
  • 만료 날짜: 이전 시도가 모두 실패한 경우 보조 서버가 주 서버 쿼리를 중지한 후의 시간입니다.
  • 최소: RFC 2308은 이 필드의 의미가 음수 캐싱 시간으로 변경되었습니다. 컴플라이언스에서는 이를 사용하여 NXDOMAIN 이름 오류를 캐시하는 기간을 결정합니다.
참고

새로 고침 의 숫자 값,재시도,만료최소 필드는 시간(초)을 정의합니다. 그러나 가독성을 높이기 위해 분의 m, 시간 h 및 일 동안 d 와 같은 시간 접미사를 사용합니다. 예를 들어 3h 는 3 시간을 의미합니다.

추가 리소스

  • RFC 1035: 도메인 이름 - 구현 및 사양
  • RFC 1034: 도메인 이름 - 개념 및 기능
  • RFC 2308: DNS 쿼리의 부정 캐싱 (DNS 캐시)

4.6.2. BIND 기본 서버에서 전달 영역 설정

전달 영역은 이름을 IP 주소 및 기타 정보에 매핑합니다. 예를 들어 도메인 example.com 을 담당하는 경우 www.example.com 과 같은 이름을 확인하도록 BIND에 전달 영역을 설정할 수 있습니다.

사전 요구 사항

  • 예를 들어 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
  • named 또는 named-chroot 서비스가 실행 중입니다.

절차

  1. /etc/named.conf 파일에 영역 정의를 추가합니다.

    zone "example.com" {
        type master;
        file "example.com.zone";
        allow-query { any; };
        allow-transfer { none; };
    };

    이러한 설정은 다음과 같습니다.

    • 이 서버는 example.com 영역의 기본 서버(마스터 유형)로 사용됩니다.
    • /var/named/example.com.zone 파일은 영역 파일입니다. 이 예에서와 같이 상대 경로를 설정한 경우 이 경로는 options 문의 디렉터리에 설정된 디렉터리 와 상대적입니다.
    • 모든 호스트에서 이 영역을 쿼리할 수 있습니다. 또는 액세스를 제한하려면 IP 범위 또는 BIND ACL(액세스 제어 목록) 별 이름을 지정합니다.
    • 호스트가 영역을 전송할 수 없습니다. 보조 서버를 설정하고 보조 서버의 IP 주소에 대해서만 영역 전송을 허용합니다.
  2. /etc/named.conf 파일의 구문을 확인합니다.

    # named-checkconf

    명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.

  3. 다음 콘텐츠를 사용하여 /var/named/example.com.zone 파일을 만듭니다.

    $TTL 8h
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1d         ; refresh period
                              3h         ; retry period
                              3d         ; expire time
                              3h )       ; minimum TTL
    
                      IN NS   ns1.example.com.
                      IN MX   10 mail.example.com.
    
    www               IN A    192.0.2.30
    www               IN AAAA 2001:db8:1::30
    ns1               IN A    192.0.2.1
    ns1               IN AAAA 2001:db8:1::1
    mail              IN A    192.0.2.20
    mail              IN AAAA 2001:db8:1::20

    이 영역 파일은 다음과 같습니다.

    • 리소스 레코드에 대한 기본 TTL(Time-to-live) 값을 8시간으로 설정합니다. 시간 접미사(예: h for hour)가 없으면 BIND는 값을 초로 해석합니다.
    • 영역에 대한 세부 정보와 함께 필요한 SOA 리소스 레코드를 포함합니다.
    • ns1.example.com 을 이 영역에 대한 권한 있는 DNS 서버로 설정합니다. 작동하려면 영역에 하나 이상의 네임 서버(NS) 레코드가 필요합니다. 그러나 RFC 1912를 준수하려면 두 개 이상의 이름 서버가 필요합니다.
    • mail.example.comexample.com 도메인의 메일 교환기(MX)로 설정합니다. 호스트 이름 앞에 있는 숫자 값은 레코드의 우선 순위입니다. 값이 낮은 항목은 우선 순위가 높습니다.
    • www.example.com,mail.example.comns1.example.com 의 IPv4 및 IPv6 주소를 설정합니다.
  4. named 그룹만 읽을 수 있는 영역 파일에 대한 보안 권한을 설정합니다.

    # chown root:named /var/named/example.com.zone
    # chmod 640 /var/named/example.com.zone
  5. /var/named/example.com.zone 파일의 구문을 확인합니다.

    # named-checkzone example.com /var/named/example.com.zone
    zone example.com/IN: loaded serial 2022070601
    OK
  6. BIND를 다시 로드합니다.

    # systemctl reload named

    change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

검증

  • example.com 영역의 다른 레코드를 쿼리하고 출력이 영역 파일에 구성된 레코드와 일치하는지 확인합니다.

    # dig +short @localhost AAAA www.example.com
    2001:db8:1::30
    
    # dig +short @localhost NS example.com
    ns1.example.com.
    
    # dig +short @localhost A ns1.example.com
    192.0.2.1

    이 예에서는 BIND가 동일한 호스트에서 실행되고 localhost 인터페이스의 쿼리에 응답하는 것으로 가정합니다.

4.6.3. BIND 기본 서버에서 역방향 영역 설정

역방향 영역은 IP 주소를 이름에 매핑합니다. 예를 들어 IP 범위 192.0.2.0/24 를 담당하는 경우 이 범위에서 IP 주소를 호스트 이름으로 확인하도록 BIND에서 역방향 영역을 설정할 수 있습니다.

참고

전체 클래스 네트워크에 대한 역방향 영역을 생성하는 경우 영역에 적절하게 이름을 지정합니다. 예를 들어 C 네트워크 192.0.2.0/24 클래스의 경우 영역 이름은 2.0.192.in-addr.arpa 입니다. 다른 네트워크 크기에 대한 역방향 영역을 생성하려면(예: 192.0.2.0/28 ) 영역 이름은 28-2.0.192.in-addr.arpa 입니다.

사전 요구 사항

  • 예를 들어 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
  • named 또는 named-chroot 서비스가 실행 중입니다.

절차

  1. /etc/named.conf 파일에 영역 정의를 추가합니다.

    zone "2.0.192.in-addr.arpa" {
        type master;
        file "2.0.192.in-addr.arpa.zone";
        allow-query { any; };
        allow-transfer { none; };
    };

    이러한 설정은 다음과 같습니다.

    • 이 서버는 2.0.192.in-addr.arpa 역방향 영역의 기본 서버(마스터 유형)입니다.
    • /var/named/2.0.192.in-addr.arpa.zone 파일은 영역 파일입니다. 이 예에서와 같이 상대 경로를 설정한 경우 이 경로는 options 문의 디렉터리에 설정된 디렉터리 와 상대적입니다.
    • 모든 호스트에서 이 영역을 쿼리할 수 있습니다. 또는 액세스를 제한하려면 IP 범위 또는 BIND ACL(액세스 제어 목록) 별 이름을 지정합니다.
    • 호스트가 영역을 전송할 수 없습니다. 보조 서버를 설정하고 보조 서버의 IP 주소에 대해서만 영역 전송을 허용합니다.
  2. /etc/named.conf 파일의 구문을 확인합니다.

    # named-checkconf

    명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.

  3. /var/named/2.0.192.in-addr.arpa.zone 파일을 만듭니다(예: 다음 콘텐츠).

    $TTL 8h
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1d         ; refresh period
                              3h         ; retry period
                              3d         ; expire time
                              3h )       ; minimum TTL
    
                      IN NS   ns1.example.com.
    
    1                 IN PTR  ns1.example.com.
    30                IN PTR  www.example.com.

    이 영역 파일은 다음과 같습니다.

    • 리소스 레코드에 대한 기본 TTL(Time-to-live) 값을 8시간으로 설정합니다. 시간 접미사(예: h for hour)가 없으면 BIND는 값을 초로 해석합니다.
    • 영역에 대한 세부 정보와 함께 필요한 SOA 리소스 레코드를 포함합니다.
    • 이 역방향 영역에 대한 권한 있는 DNS 서버로 ns1.example.com 을 설정합니다. 작동하려면 영역에 하나 이상의 네임 서버(NS) 레코드가 필요합니다. 그러나 RFC 1912를 준수하려면 두 개 이상의 이름 서버가 필요합니다.
    • 192.0.2.1192.0.2.30 주소에 대한 포인터(PTR) 레코드를 설정합니다.
  4. named group만 읽을 수 있는 영역 파일에 대한 보안 권한을 설정합니다.

    # chown root:named /var/named/2.0.192.in-addr.arpa.zone
    # chmod 640 /var/named/2.0.192.in-addr.arpa.zone
  5. /var/named/2.0.192.in-addr.arpa.zone 파일의 구문을 확인합니다.

    # named-checkzone 2.0.192.in-addr.arpa /var/named/2.0.192.in-addr.arpa.zone
    zone 2.0.192.in-addr.arpa/IN: loaded serial 2022070601
    OK
  6. BIND를 다시 로드합니다.

    # systemctl reload named

    change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

검증

  • 역방향 영역에서 다른 레코드를 쿼리하고 출력이 영역 파일에 구성한 레코드와 일치하는지 확인합니다.

    # dig +short @localhost -x 192.0.2.1
    ns1.example.com.
    
    # dig +short @localhost -x 192.0.2.30
    www.example.com.

    이 예에서는 BIND가 동일한 호스트에서 실행되고 localhost 인터페이스의 쿼리에 응답하는 것으로 가정합니다.

4.6.4. BIND 영역 파일 업데이트

예를 들어 서버의 IP 주소가 변경되는 경우 영역 파일을 업데이트해야 합니다. 여러 DNS 서버가 영역을 담당하는 경우 기본 서버에서만 이 절차를 수행합니다. 영역의 사본을 저장하는 기타 DNS 서버는 영역 전송을 통해 업데이트를 수신합니다.

사전 요구 사항

  • 영역이 구성됩니다.
  • named 또는 named-chroot 서비스가 실행 중입니다.

절차

  1. 선택 사항: /etc/named.conf 파일에서 영역 파일의 경로를 식별합니다.

    options {
        ...
        directory       "/var/named";
    }
    
    zone "example.com" {
        ...
        file "example.com.zone";
    };

    영역 정의의 file 문에서 영역 파일의 경로를 찾습니다. 상대 경로는 options 문의 디렉터리에 설정된 디렉터리를 기준으로 합니다.

  2. 영역 파일을 편집합니다.

    1. 필요한 변경 작업을 수행합니다.
    2. SOA(시작 권한) 레코드의 일련번호를 늘립니다.

      중요

      일련 번호가 이전 값과 같거나 낮으면 보조 서버에서 영역의 복사본을 업데이트하지 않습니다.

  3. 영역 파일의 구문을 확인합니다.

    # named-checkzone example.com /var/named/example.com.zone
    zone example.com/IN: loaded serial 2022062802
    OK
  4. BIND를 다시 로드합니다.

    # systemctl reload named

    change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

검증

  • 추가, 수정 또는 제거된 레코드를 쿼리합니다. 예를 들면 다음과 같습니다.

    # dig +short @localhost A ns2.example.com
    192.0.2.2

    이 예에서는 BIND가 동일한 호스트에서 실행되고 localhost 인터페이스의 쿼리에 응답하는 것으로 가정합니다.

4.6.5. 자동화된 키 생성 및 영역 유지 관리 기능을 사용한 DNSSEC 영역 서명

DNSSEC(Domain Name System Security Extension)를 사용하여 영역에 서명하여 인증 및 데이터 무결성을 보장할 수 있습니다. 이러한 영역에는 추가 리소스 레코드가 포함됩니다. 클라이언트는 이 정보를 사용하여 영역 정보의 진위 여부를 확인할 수 있습니다.

영역에 DNSSEC 정책 기능을 활성화하면 BIND에서 다음 작업을 자동으로 수행합니다.

  • 키를 생성
  • 영역에 서명
  • 키를 다시 서명하고 주기적으로 교체하는 등 영역을 유지합니다.
중요

외부 DNS 서버를 활성화하여 영역의 진위 여부를 확인하려면 영역의 공개 키를 상위 영역에 추가해야 합니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 도메인 공급자 또는 레지스트리에 문의하십시오.

이 절차에서는 BIND에서 기본 제공 기본 DNSSEC 정책을 사용합니다. 이 정책은 단일 ECDSAP256SHA 키 서명을 사용합니다. 또는 사용자 정의 키, 알고리즘 및 타이밍을 사용하는 자체 정책을 만듭니다.

사전 요구 사항

  • BIND 9.16 이상이 설치되어 있어야 합니다. 이 요구 사항을 충족하려면 바인딩하지 않고 bind 9.16 패키지를 설치합니다.
  • DNSSEC를 활성화할 영역이 구성됩니다.
  • named 또는 named-chroot 서비스가 실행 중입니다.
  • 서버는 시간 서버와 시간을 동기화합니다. DNSSEC 유효성 검사를 위해서는 정확한 시스템 시간이 중요합니다.

절차

  1. /etc/named.conf 파일을 편집하고 dnssec-policy 기본값 을 DNSSEC를 활성화하려는 영역에 추가합니다.

    zone "example.com" {
        ...
        dnssec-policy default;
    };
  2. BIND를 다시 로드합니다.

    # systemctl reload named

    change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

  3. BIND는 /var/named/K <zone_name > .+ <algorithm> + <key_ID > .key 파일에 공개 키를 저장합니다. 이 파일을 사용하여 상위 영역에 필요한 형식으로 영역의 공개 키를 표시합니다.

    • DS 레코드 형식:

      # dnssec-dsfromkey /var/named/Kexample.com.+013+61141.key
      example.com. IN DS 61141 13 2 3E184188CF6D2521EDFDC3F07CFEE8D0195AACBD85E68BAE0620F638B4B1B027
    • DNSKEY 형식:

      # grep DNSKEY /var/named/Kexample.com.+013+61141.key
      example.com. 3600 IN DNSKEY 257 3 13 sjzT3jNEp120aSO4mPEHHSkReHUf7AABNnT8hNRTzD5cKMQSjDJin2I3 5CaKVcWO1pm+HltxUEt+X9dfp8OZkg==
  4. 영역의 공개 키를 상위 영역에 추가하도록 요청합니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 도메인 공급자 또는 레지스트리에 문의하십시오.

검증

  1. DNSSEC 서명을 활성화한 영역에서 자체 DNS 서버를 쿼리합니다.

    # dig +dnssec +short @localhost A www.example.com
    192.0.2.30
    A 13 3 28800 20220718081258 20220705120353 61141 example.com. e7Cfh6GuOBMAWsgsHSVTPh+JJSOI/Y6zctzIuqIU1JqEgOOAfL/Qz474 M0sgi54m1Kmnr2ANBKJN9uvOs5eXYw==

    이 예에서는 BIND가 동일한 호스트에서 실행되고 localhost 인터페이스의 쿼리에 응답하는 것으로 가정합니다.

  2. 공개 키가 상위 영역에 추가되고 다른 서버로 전파된 후 서버에서 서명된 영역에 쿼리에 인증된 데이터(ad) 플래그를 설정하는지 확인합니다.

    #  dig @localhost example.com +dnssec
    ...
    ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
    ...

4.7. BIND DNS 서버 간 영역 전송 구성

영역 전송을 통해 영역 사본이 있는 모든 DNS 서버가 최신 데이터를 사용합니다.

사전 요구 사항

  • 향후 기본 서버에서 영역 전송을 설정할 영역이 이미 구성되어 있습니다.
  • 향후 보조 서버에서 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
  • 두 서버 모두에서 named 또는 named-chroot 서비스가 실행 중입니다.

절차

  1. 기존 기본 서버에서 다음을 수행합니다.

    1. 공유 키를 생성하고 이를 /etc/named.conf 파일에 추가합니다.

      # tsig-keygen example-transfer-key | tee -a /etc/named.conf
      key "example-transfer-key" {
              algorithm hmac-sha256;
              secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ=";
      };

      이 명령은 tsig-keygen 명령의 출력을 표시하고 이를 /etc/named.conf 에 자동으로 추가합니다.

      나중에 보조 서버에서도 명령 출력이 필요합니다.

    2. /etc/named.conf 파일에서 영역 정의를 편집합니다.

      1. allow-transfer 문에서 서버가 영역을 전송하기 위해 example-transfer-key 문에 지정된 키를 제공해야 함을 정의합니다.

        zone "example.com" {
            ...
            allow-transfer { key example-transfer-key; };
        };

        또는 allow-transfer 문에서 BIND ACL(access control list) 별 이름을 사용합니다.

      2. 기본적으로 영역을 업데이트한 후 BIND는 이 영역에 이름 서버(NS) 레코드가 있는 모든 이름 서버에 알립니다. 보조 서버의 NS 레코드를 영역에 추가하지 않으려면 BIND에 이 서버에 알릴 수 있습니다. 이를 위해 이 보조 서버의 IP 주소를 사용하여 also-notify 문을 영역에 추가합니다.

        zone "example.com" {
            ...
            also-notify { 192.0.2.2; 2001:db8:1::2; };
        };
    3. /etc/named.conf 파일의 구문을 확인합니다.

      # named-checkconf

      명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.

    4. BIND를 다시 로드합니다.

      # systemctl reload named

      change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

  2. 향후 보조 서버에서 다음을 수행합니다.

    1. /etc/named.conf 파일을 다음과 같이 편집합니다.

      1. 기본 서버에서와 동일한 키 정의를 추가합니다.

        key "example-transfer-key" {
                algorithm hmac-sha256;
                secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ=";
        };
      2. /etc/named.conf 파일에 영역 정의를 추가합니다.

        zone "example.com" {
            type slave;
            file "slaves/example.com.zone";
            allow-query { any; };
            allow-transfer { none; };
            masters {
              192.0.2.1 key example-transfer-key;
              2001:db8:1::1 key example-transfer-key;
            };
        };

        이러한 설정 상태:

        • 이 서버는 example.com 영역의 보조 서버(유사유형 슬레이브)입니다.
        • /var/named/slaves/example.com.zone 파일은 영역 파일입니다. 이 예에서와 같이 상대 경로를 설정한 경우 이 경로는 options 문의 디렉터리에 설정된 디렉터리 와 상대적입니다. 이 서버가 기본 서버와 보조 영역 파일을 분리하려면 (예: /var/named/slaves/ ) 디렉터리에 저장할 수 있습니다.
        • 모든 호스트에서 이 영역을 쿼리할 수 있습니다. 또는 액세스를 제한하려면 IP 범위 또는 ACL 별 이름을 지정합니다.
        • 호스트가 이 서버에서 영역을 전송할 수 없습니다.
        • 이 영역의 기본 서버의 IP 주소는 192.0.2.12001:db8:1::2 입니다. 또는 ACL 닉네임을 지정할 수 있습니다. 이 보조 서버는 example-transfer-key 라는 키를 사용하여 기본 서버에 인증합니다.
    2. /etc/named.conf 파일의 구문을 확인합니다.

      # named-checkconf
    3. BIND를 다시 로드합니다.

      # systemctl reload named

      change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

  3. 선택 사항: 기본 서버에서 영역 파일을 수정하고 새 보조 서버의 NS 레코드를 추가합니다.

검증

보조 서버에서 다음을 수행합니다.

  1. named 서비스의 systemd 저널 항목을 표시합니다.

    # journalctl -u named
    ...
    Jul 06 15:08:51 ns2.example.com named[2024]: zone example.com/IN: Transfer started.
    Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: connected using 192.0.2.2#45803
    Jul 06 15:08:51 ns2.example.com named[2024]: zone example.com/IN: transferred serial 2022070101
    Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: Transfer status: success
    Jul 06 15:08:51 ns2.example.com named[2024]: transfer of 'example.com/IN' from 192.0.2.1#53: Transfer completed: 1 messages, 29 records, 2002 bytes, 0.003 secs (667333 bytes/sec)

    변경-루트 환경에서 BIND를 실행하는 경우 journalctl -u named-chroot 명령을 사용하여 저널 항목을 표시합니다.

  2. BIND에서 영역 파일을 생성했는지 확인합니다.

    # ls -l /var/named/slaves/
    total 4
    -rw-r--r--. 1 named named 2736 Jul  6 15:08 example.com.zone

    기본적으로 보조 서버는 영역 파일을 바이너리 원시 형식으로 저장합니다.

  3. 보조 서버에서 전송된 영역의 레코드를 쿼리합니다.

    # dig +short @192.0.2.2 AAAA www.example.com
    2001:db8:1::30

    이 예에서는 이 프로세스에서 설정한 보조 서버가 IP 주소 192.0.2.2 에서 수신 대기한다고 가정합니다.

4.8. DNS 레코드를 덮어쓰도록 BIND에서 응답 정책 영역 구성

DNS 차단 및 필터링을 사용하여 관리자는 DNS 응답을 다시 작성하여 특정 도메인 또는 호스트에 대한 액세스를 차단할 수 있습니다. BIND에서RPZ(응답 정책 영역)는 이 기능을 제공합니다. NXDOMAIN 오류를 반환하거나 쿼리에 응답하지 않는 등 차단된 항목에 대해 다른 작업을 구성할 수 있습니다.

환경에 여러 DNS 서버가 있는 경우 이 절차를 사용하여 기본 서버에서 RPZ를 구성하고 나중에 영역 전송을 구성하여 보조 서버에서 RPZ를 사용할 수 있도록 합니다.

사전 요구 사항

  • 예를 들어 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
  • named 또는 named-chroot 서비스가 실행 중입니다.

절차

  1. /etc/named.conf 파일을 편집하고 다음과 같이 변경합니다.

    1. options 설명에 response-policy 정의를 추가합니다.

      options {
          ...
      
          response-policy {
              zone "rpz.local";
          };
      
          ...
      }

      response-policyzone 문에서 RPZ의 사용자 지정 이름을 설정할 수 있습니다. 그러나 다음 단계의 영역 정의에서 동일한 이름을 사용해야 합니다.

    2. 이전 단계에서 설정한 RPZ의 영역 정의를 추가합니다.

      zone "rpz.local" {
          type master;
          file "rpz.local";
          allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
          allow-transfer { none; };
      };

      이러한 설정 상태:

      • 이 서버는 rpz.local 이라는 RPZ의 기본 서버(master 유형)입니다.
      • /var/named/rpz.local 파일은 영역 파일입니다. 이 예에서와 같이 상대 경로를 설정한 경우 이 경로는 options 문의 디렉터리에 설정된 디렉터리 와 상대적입니다.
      • allow-query 에 정의된 모든 호스트에서 이 RPZ를 쿼리할 수 있습니다. 또는 액세스를 제한하려면 IP 범위 또는 BIND ACL(액세스 제어 목록) 별 이름을 지정합니다.
      • 호스트가 영역을 전송할 수 없습니다. 보조 서버를 설정하고 보조 서버의 IP 주소에 대해서만 영역 전송을 허용합니다.
  2. /etc/named.conf 파일의 구문을 확인합니다.

    # named-checkconf

    명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.

  3. 다음 콘텐츠를 사용하여 /var/named/rpz.local 파일을 만듭니다.

    $TTL 10m
    @ IN SOA ns1.example.com. hostmaster.example.com. (
                              2022070601 ; serial number
                              1h         ; refresh period
                              1m         ; retry period
                              3d         ; expire time
                              1m )       ; minimum TTL
    
                     IN NS    ns1.example.com.
    
    example.org      IN CNAME .
    *.example.org    IN CNAME .
    example.net      IN CNAME rpz-drop.
    *.example.net    IN CNAME rpz-drop.

    이 영역 파일은 다음과 같습니다.

    • 리소스 레코드의 기본 TTL(Time-to-live) 값을 10분으로 설정합니다. 시간 접미사(예: h for hour)가 없으면 BIND는 값을 초로 해석합니다.
    • 영역에 대한 세부 정보와 함께 SOA(인증 기관 시작) 리소스 레코드가 포함되어 있습니다.
    • ns1.example.com 을 이 영역에 대한 권한 있는 DNS 서버로 설정합니다. 작동하려면 영역에 하나 이상의 네임 서버(NS) 레코드가 필요합니다. 그러나 RFC 1912를 준수하려면 두 개 이상의 이름 서버가 필요합니다.
    • 이 도메인의 example.org 및 호스트에 쿼리에 대한 NXDOMAIN 오류를 반환합니다.
    • 이 도메인의 example.net 및 호스트에 쿼리를 삭제합니다.

    전체 작업 및 예제 목록은 IETF 초안을 참조하십시오. DNS 응답 정책 영역(RPZ).

  4. /var/named/rpz.local 파일의 구문을 확인합니다.

    # named-checkzone rpz.local /var/named/rpz.local
    zone rpz.local/IN: loaded serial 2022070601
    OK
  5. BIND를 다시 로드합니다.

    # systemctl reload named

    change-root 환경에서 BIND를 실행하는 경우 systemctl reload named-chroot 명령을 사용하여 서비스를 다시 로드합니다.

검증

  1. RPZ에 구성된 example.org 의 호스트를 확인하고 NXDOMAIN 오류를 반환합니다.

    # dig @localhost www.example.org
    ...
    ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286
    ...

    이 예에서는 BIND가 동일한 호스트에서 실행되고 localhost 인터페이스의 쿼리에 응답하는 것으로 가정합니다.

  2. RPZ에서 쿼리를 삭제하기 위해 RPZ에 구성된 example.net 도메인에서 호스트를 확인하려고 합니다.

    # dig @localhost www.example.net
    ...
    ;; connection timed out; no servers could be reached
    ...

4.9. dnstap을 사용하여 DNS 쿼리 기록

네트워크 관리자는 DNS(Domain Name System) 세부 정보를 기록하여 DNS 트래픽 패턴을 분석하고 DNS 서버 성능을 모니터링하고 DNS 문제를 해결할 수 있습니다. 고급 방법으로 들어오는 이름 쿼리의 세부 정보를 모니터링하고 기록하려면 named 서비스에서 보낸 메시지를 기록하는 dnstap 인터페이스를 사용합니다. DNS 쿼리를 캡처하고 기록하여 웹사이트 또는 IP 주소에 대한 정보를 수집할 수 있습니다.

사전 요구 사항

  • bind-9.11.26-2 패키지 또는 이후 버전이 설치되어 있습니다.
주의

BIND 버전이 이미 설치되어 실행 중인 경우 새 버전의 BIND 를 추가하면 기존 버전이 덮어씁니다.

절차

  1. options 블록에서 /etc/named.conf 파일을 편집하여 dnstap 및 대상 파일을 활성화합니다.

    options
    {
    # ...
    dnstap { all; }; # Configure filter
    dnstap-output file "/var/named/data/dnstap.bin";
    # ...
    };
    # end of options
  2. 로깅할 DNS 트래픽 유형을 지정하려면 /etc/named.conf 파일의 dnstap 블록에 dnstap 필터를 추가합니다. 다음 필터를 사용할 수 있습니다.

    • auth - 권한 있는 영역 응답 또는 응답.
    • 클라이언트 - 내부 클라이언트 쿼리 또는 응답.
    • Forwarder - 쿼리 또는 응답에서 전달합니다.
    • 해결자 - 반복적 해결 쿼리 또는 응답.
    • 업데이트 - 동적 영역 업데이트 요청.
    • All - 위 옵션 중 모두 입니다.
    • 쿼리 또는 응답 - 쿼리 또는 응답 키워드를 지정하지 않으면 dnstap 이 둘 다 기록합니다.

      참고

      dnstap 필터는 로 구분된 여러 정의가 포함되어 있습니다. dnstap {} 블록의 구문은 dnstap {(모든 | auth | client | forwardr | update ) [( query | response ) ] ; …​ };

  3. 변경 사항을 적용하려면 named 서비스를 다시 시작하십시오.

    # systemctl restart named.service
  4. 활성 로그에 대한 주기적인 롤아웃 구성

    다음 예에서 cron 스케줄러는 사용자가 편집한 스크립트의 콘텐츠를 하루에 한 번 실행합니다. 값이 3roll 옵션은 dnstap 에서 최대 3개의 백업 로그 파일을 생성할 수 있음을 지정합니다. value 3dnstap-output 변수의 version 매개 변수를 재정의하고 백업 로그 파일 수를 3으로 제한합니다. 또한 바이너리 로그 파일이 다른 디렉터리로 이동하여 이름이 변경되고 3개의 백업 로그 파일이 이미 존재하는 경우에도 .2 접미사에 도달하지 않습니다. 크기 제한에 따라 바이너리 로그를 자동으로 롤링하는 경우 이 단계를 건너뛸 수 있습니다.

    Example:
    
    sudoedit /etc/cron.daily/dnstap
    
    #!/bin/sh
    rndc dnstap -roll 3
    mv /var/named/data/dnstap.bin.1 /var/log/named/dnstap/dnstap-$(date -I).bin
    
    # use dnstap-read to analyze saved logs
    sudo chmod a+x /etc/cron.daily/dnstap
  5. dnstap-read 유틸리티를 사용하여 사람이 읽을 수 있는 형식으로 로그를 처리하고 분석합니다.

    다음 예에서 dnstap-read 유틸리티는 YAML 파일 형식으로 출력을 출력합니다.

    Example:
    
    dnstap-read -y [file-name]

5장. NFS 서버 배포

NFS(네트워크 파일 시스템) 프로토콜을 사용하면 원격 사용자가 네트워크를 통해 공유 디렉터리를 마운트하고 로컬로 마운트하여 사용할 수 있습니다. 이를 통해 네트워크의 중앙 집중식 서버에 리소스를 통합할 수 있습니다.

5.1. 마이너 NFSv4 버전의 주요 기능

각 마이너 NFSv4 버전은 성능 및 보안을 개선하기 위한 개선 사항을 제공합니다. 이러한 개선 사항을 사용하여 NFSv4의 모든 가능성을 활용하여 네트워크 간에 효율적이고 안정적인 파일 공유를 보장할 수 있습니다.

NFSv4.2의 주요 기능

서버 측 복사
서버 측 복사는 데이터를 네트워크를 통해 뒤로 전송하지 않고 서버에서 파일을 복사하는 NFS 서버의 기능입니다.
스파스 파일
파일에 하나 이상의 빈 공간 또는 0으로 구성된 할당되지 않은 데이터 블록 또는 초기화되지 않은 데이터 블록을 사용할 수 있습니다. 이를 통해 애플리케이션은 스파스 파일에서 홀의 위치를 매핑할 수 있습니다.
공간 예약
클라이언트는 데이터를 작성하기 전에 스토리지 서버에 공간을 예약하거나 할당할 수 있습니다. 이렇게 하면 서버가 공간이 부족하지 않습니다.
레이블이 지정된 NFS
데이터 액세스 권한을 적용하고 NFS 파일 시스템의 개별 파일에 대해 클라이언트와 서버 간에 SELinux 레이블을 활성화합니다.
레이아웃 개선 사항
병렬 NFS(pNFS) 서버가 더 나은 성능 통계를 수집할 수 있는 기능을 제공합니다.

NFSv4.1의 주요 기능

pNFS에 대한 클라이언트 측 지원
고속 I/O를 클러스터형 서버로 지원하기 때문에 여러 시스템에 데이터를 저장하고, 데이터에 대한 직접 액세스 권한, 메타데이터 업데이트에 대한 동기화를 제공할 수 있습니다.
세션
세션은 클라이언트에 속한 연결을 기준으로 서버의 상태를 유지 관리합니다. 이러한 세션은 각 RPC(원격 프로시저 호출) 작업에 대한 연결 설정 및 종료와 관련된 오버헤드를 줄임으로써 성능 및 효율성을 향상시킵니다.

NFSv4.0의 주요 기능

RPC 및 보안
RPCSEC_GSS 프레임워크는 RPC 보안을 강화합니다. NFSv4 프로토콜은 대역 내 보안 협상에 대한 새로운 작업을 도입합니다. 이를 통해 클라이언트는 파일 시스템 리소스에 안전하게 액세스하기 위한 서버 정책을 쿼리할 수 있습니다.
절차 및 작업 구조
NFS 4.0에는 COMPOUND 절차가 도입되어 클라이언트가 RPC를 줄이기 위해 여러 작업을 단일 요청으로 병합할 수 있습니다.
파일 시스템 모델

NFS 4.0은 계층형 파일 시스템 모델을 유지하여 국제화를 위해 파일을 바이트 스트림 및 UTF-8로 인코딩 이름으로 처리합니다.

  • 파일 처리 유형

    volatile 파일 처리를 사용하면 서버가 파일 시스템 변경 사항에 맞게 조정하고 영구 파일 처리 없이도 필요에 따라 클라이언트가 조정할 수 있습니다.

  • 특성 유형

    파일 속성 구조에는 각각 고유한 목적을 제공하는 필수, 권장, 이름이 지정된 속성이 포함됩니다. NFSv3에서 파생되는 필수 속성은 파일 유형을 구분하는 데 중요하지만 ACL과 같은 권장 속성은 액세스 제어 기능을 제공합니다.

  • 다중 서버 네임스페이스

    네임스페이스는 여러 서버에서 확장되어 속성, 참조 지원, 중복 및 원활한 서버 마이그레이션을 기반으로 파일 시스템 전송을 단순화합니다.

OPEN 및 CLOSE 작업
이러한 작업은 파일 조회, 생성 및 의미 체계 공유를 단일 시점에서 결합하고 파일 액세스 관리를 보다 효율적으로 만들 수 있습니다.
파일 잠금
파일 잠금은 프로토콜의 일부이므로 RPC 콜백이 필요하지 않습니다. 파일 잠금 상태는 임대 기반 모델에서 서버에서 관리하며, 리스를 갱신하지 못하면 서버에 의한 상태 해제가 발생할 수 있습니다.
클라이언트 캐싱 및 위임
캐싱은 특성 및 디렉터리 캐싱에 대한 클라이언트 결정 타임아웃을 사용하여 이전 버전과 유사합니다. NFS 4.0의 위임을 사용하면 서버가 클라이언트에 특정 책임을 할당하여 특정 파일 공유 의미가 보장되며 즉각적인 서버 개입없이 로컬 파일 작업을 수행할 수 있습니다.

5.2. AUTH_SYS 인증 방법

AUTH_SYS 메서드( AUTH_UNIX 라고도 함)는 클라이언트 인증 메커니즘입니다. AUTH_SYS 를 사용하면 클라이언트는 사용자의 사용자 ID(UID) 및 그룹 ID(GID)를 서버에 전송하여 파일에 액세스할 때 ID 및 권한을 확인합니다. 클라이언트 제공 정보가 의존하므로 덜 안전한 것으로 간주되므로 잘못 구성된 경우 무단 액세스가 가능합니다.

매핑 메커니즘을 사용하면 UID 및 GID 할당이 시스템 간에 다른 경우에도 NFS 클라이언트가 서버에서 적절한 권한으로 파일에 액세스할 수 있습니다. UID 및 GID는 다음 메커니즘을 통해 NFS 클라이언트와 서버 간에 매핑됩니다.

직접 매핑

UID 및 GID는 로컬 시스템과 원격 시스템 간에 NFS 서버와 클라이언트에 의해 직접 매핑됩니다. 이를 위해서는 NFS 파일 공유에 참여하는 모든 시스템에서 일관된 UID 및 GID 할당이 필요합니다. 예를 들어 클라이언트에서 UID 1000이 있는 사용자는 서버에서 UID 1000이 있는 사용자만 액세스할 수 있는 공유의 파일에 액세스할 수 있습니다.

NFS 환경에서 간소화된 ID 관리를 위해 관리자는 LDAP 또는 NIS(Network Information Service)와 같은 중앙 집중식 서비스를 사용하여 여러 시스템의 UID 및 GID 매핑을 관리하는 경우가 많습니다.

사용자 및 그룹 ID 매핑
NFS 서버와 클라이언트는 idmapd 서비스를 사용하여 서로 다른 시스템 간에 UID와 GID를 변환하여 일관된 식별 및 권한 할당을 수행할 수 있습니다.

5.3. AUTH_GSS 인증 방법

Kerberos는 비보안 네트워크를 통해 클라이언트 및 서버에 대한 보안 인증을 허용하는 네트워크 인증 프로토콜입니다. 대칭 키 암호화를 사용하며 사용자 및 서비스를 인증하기 위해 신뢰할 수 있는 KMS(Key Distribution Center)가 필요합니다.

RPCSEC_GSS Kerberos 메커니즘을 사용하는 AUTH_SYS 와 달리 서버는 클라이언트에 의존하지 않고 파일에 액세스하는 사용자를 올바르게 나타냅니다. 대신 암호화는 서버에 사용자를 인증하는 데 사용되며 악의적인 클라이언트가 사용자의 Kerberos 자격 증명을 사용하지 않고도 사용자를 가장하지 못하게 합니다.

/etc/exports 파일에서 sec 옵션은 공유에서 제공해야 하는 Kerberos 보안의 하나 또는 여러 가지 방법을 정의하고 클라이언트는 이러한 방법 중 하나를 사용하여 공유를 마운트할 수 있습니다. sec 옵션은 다음 값을 지원합니다.

  • sys: 암호화 보호 없음 (기본값)
  • krb5: 인증 전용
  • krb5i: 인증 및 무결성 보호
  • krb5p: 인증, 무결성 검사 및 트래픽 암호화

메서드에서 제공하는 암호화 기능이 많을수록 성능이 저하됩니다.

5.4. 내보낸 파일 시스템에 대한 파일 권한

내보낸 파일 시스템의 파일 권한은 NFS를 통해 액세스하는 클라이언트의 파일 및 디렉터리에 대한 액세스 권한을 결정합니다.

원격 호스트에서 NFS 파일 시스템을 마운트하면 각 공유 파일에 있는 유일한 보호는 파일 시스템 권한입니다. 동일한 UID(사용자 ID) 값을 공유하는 두 사용자가 다른 클라이언트 시스템에 동일한 NFS 파일 시스템을 마운트하는 경우 서로의 파일을 수정할 수 있습니다.

NFS는 클라이언트의 root 사용자를 서버의 root 사용자와 동일하게 처리합니다. 그러나 기본적으로 NFS 서버는 NFS 공유에 액세스할 때 rootnobody 계정에 매핑합니다. root_squash 옵션은 이 동작을 제어합니다.

추가 리소스

  • exports(5) 도움말 페이지

5.5. NFS 서버에 필요한 서비스

RHEL(Red Hat Enterprise Linux)은 커널 모듈과 사용자 공간 프로세스의 조합을 사용하여 NFS 파일 공유를 제공합니다.

표 5.1. NFS 서버에 필요한 서비스

서비스 이름NFS 버전설명

nfsd

3, 4

공유 NFS 파일 시스템에 대해 서비스를 요청하는 NFS 커널 모듈입니다.

rpcbind

3

이 프로세스에서는 로컬 원격 프로시저 호출(RPC) 서비스의 포트 예약을 허용하여 해당 원격 RPC 서비스에 액세스할 수 있도록 합니다. rpcbind 서비스는 요청에 응답하고 지정된 RPC 서비스에 대한 연결을 설정합니다.

rpc.mountd

3, 4

이 서비스는 NFSv3 클라이언트의 MOUNT 요청을 처리하고 NFSv4 서버는 이 서비스의 내부 기능을 사용합니다.

요청된 NFS 공유가 현재 NFS 서버에서 내보내지고 클라이언트가 액세스할 수 있는지 확인합니다.

rpc.nfsd

3, 4

이 프로세스는 서버에서 정의하는 명시적인 NFS 버전 및 프로토콜을 알립니다. NFS 클라이언트가 연결할 때마다 서버 스레드를 제공하는 등 NFS 클라이언트의 동적 요구 사항을 충족하기 위해 커널과 함께 작동합니다.

nfs-server 서비스는 이 프로세스를 시작합니다.

lockd

3

이 커널 모듈은 클라이언트가 서버의 파일을 잠글 수 있는 NLM(Network Lock Manager) 프로토콜을 구현합니다. NFS 서버가 실행되면 RHEL에서 모듈을 자동으로 로드합니다.

rpc.rquotad

3, 4

이 서비스는 원격 사용자에 대한 사용자 할당량 정보를 제공합니다.

rpc.idmapd

4

이 프로세스에서는 NFSv4 클라이언트와 서버 upcall을 제공합니다. 이 호출은 NFSv4 이름( 'user@domain'형식의 문자열)과 로컬 사용자 및 그룹 ID 간에 매핑됩니다.

gssproxy

3, 4

이 서비스는 rpc.nfsd 를 대신하여 krb5 인증을 처리합니다.

nfsdcld

4

이 서비스는 다른 클라이언트가 서버 재부팅과 결합된 네트워크 파티션 중에 충돌하는 잠금을 수행할 때 서버가 잠금 회수를 부여하지 못하도록 NFSv4 클라이언트 추적 데몬을 제공합니다.

rpc.statd

3

이 서비스는 로컬 호스트가 재부팅될 때 및 원격 NFSv3 호스트가 재부팅될 때 커널에 알림을 제공합니다.

추가 리소스

  • rpcbind(8), rpc.mountd(8), rpc.nfsd(8), rpc.statd(8), rpc.rquotad(8), rpc.idmapd(8), nfsdcld(8) 도움말 페이지

5.6. /etc/exports 구성 파일

/etc/exports 파일은 서버가 내보내는 디렉터리를 제어합니다. 각 행에는 내보내기 지점, 디렉터리를 마운트할 수 있는 공백으로 구분된 클라이언트 목록, 각 클라이언트에 대한 옵션이 포함되어 있습니다.

<directory> <host_or_network_1>(<options_1>) <host_or_network_n>(<options_n>)...

다음은 /etc/exports 항목의 개별 부분입니다.

<export>
내보낼 디렉터리입니다.
<host_or_network>
내보내기가 공유되는 호스트 또는 네트워크입니다. 예를 들어 호스트 이름, IP 주소 또는 IP 네트워크를 지정할 수 있습니다.
<options>
호스트 또는 네트워크의 옵션.

클라이언트와 옵션 사이에 공백을 추가하면 동작이 변경됩니다. 예를 들어 다음 줄은 다음과 같은 의미가 없습니다.

/projects	client.example.com(rw)
/projects	client.example.com (rw)

첫 번째 줄에서 서버는 client.example.com 만 읽기-쓰기 모드로 /projects 디렉터리를 마운트하고 다른 호스트에서 공유를 마운트할 수 없습니다. 그러나 두 번째 행의 client.example.com(rw) 사이의 공간으로 인해 서버는 읽기 전용 모드(기본 설정)로 디렉터리를 client.example.com 으로 내보내지만 다른 모든 호스트는 읽기-쓰기 모드로 공유를 마운트할 수 있습니다.

NFS 서버는 내보낸 각 디렉터리에 대해 다음 기본 설정을 사용합니다.

표 5.2. /etc/exports에 있는 항목의 기본 옵션

기본 설정설명

ro

디렉터리를 읽기 전용 모드로 내보냅니다.

sync

이전 요청의 변경 사항을 디스크에 쓰기 전에 NFS 서버는 요청에 응답하지 않습니다.

wdelay

서버가 다른 쓰기 요청이 보류 중인 것으로 의심되는 경우 디스크에 쓰기를 지연합니다.

root_squash

클라이언트의 root 사용자가 내보낸 디렉터리에 대한 root 권한이 없도록 합니다. root_squash 가 활성화된 상태에서 NFS 서버는 root 의 액세스 권한을 nobody 사용자에게 매핑합니다.

5.7. NFSv4 전용 서버 구성

네트워크에 NFSv3 클라이언트가 없는 경우 NFSv4 또는 특정 마이너 프로토콜 버전만 지원하도록 NFS 서버를 구성할 수 있습니다. 서버에서 NFSv4만 사용하면 네트워크에 열려 있는 포트 수를 줄일 수 있습니다.

절차

  1. nfs-utils 패키지를 설치합니다.

    # dnf install nfs-utils
  2. /etc/nfs.conf 파일을 편집하고 다음과 같이 변경합니다.

    1. [nfsd] 섹션에서 vers3 매개 변수를 비활성화하여 NFSv3를 비활성화합니다.

      [nfsd]
      vers3=n
    2. 선택 사항: 특정 NFSv4 마이너 버전만 필요한 경우 모든 vers4.<minor_version > 매개변수의 주석을 제거하고 그에 따라 설정합니다. 예를 들면 다음과 같습니다.

      [nfsd]
      vers3=n
      # vers4=y
      vers4.0=n
      vers4.1=n
      vers4.2=y

      이 구성을 사용하면 서버에서 NFS 버전 4.2만 제공합니다.

      중요

      특정 NFSv4 마이너 버전만 필요한 경우 마이너 버전의 매개변수만 설정합니다. 예기치 않은 활성화 또는 마이너 버전의 비활성화를 방지하기 위해 vers4 매개변수의 주석을 제거하지 마십시오. 기본적으로 vers4 매개변수는 모든 NFSv4 마이너 버전을 활성화하거나 비활성화합니다. 그러나 다른 vers 매개 변수와 함께 vers4 를 설정하면 이 동작이 변경됩니다.

  3. 모든 NFSv3 관련 서비스를 비활성화합니다.

    # systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
  4. 선택 사항: 공유할 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.

    # mkdir -p /nfs/projects/

    기존 디렉터리를 공유하려면 이 단계를 건너뜁니다.

  5. /nfs/projects/ 디렉터리에 필요한 권한을 설정합니다.

    # chmod 2770 /nfs/projects/
    # chgrp users /nfs/projects/

    이러한 명령은 /nfs/projects/ 디렉터리에서 users 그룹에 대한 쓰기 권한을 설정하고 동일한 그룹이 이 디렉터리에 생성된 새 항목에 자동으로 설정되어 있는지 확인합니다.

  6. 공유하려는 각 디렉터리의 /etc/exports 파일에 내보내기 지점을 추가합니다.

    /nfs/projects/     192.0.2.0/24(rw) 2001:db8::/32(rw)

    이 항목은 192.0.2.0/242001:db8::/32 서브넷의 클라이언트에 대한 읽기 및 쓰기 액세스 권한으로 액세스할 수 있도록 /nfs/projects/ 디렉터리를 공유합니다.

  7. firewalld 에서 관련 포트를 엽니다.

    # firewall-cmd --permanent --add-service nfs
    # firewall-cmd --reload
  8. NFS 서버를 활성화하고 시작합니다.

    # systemctl enable --now nfs-server

검증

  • 서버에서 서버가 구성한 NFS 버전만 제공하는지 확인합니다.

    # cat /proc/fs/nfsd/versions
    -3 +4 -4.0 -4.1 +4.2
  • 클라이언트에서 다음 단계를 수행합니다.

    1. nfs-utils 패키지를 설치합니다.

      # dnf install nfs-utils
    2. 내보낸 NFS 공유를 마운트합니다.

      # mount server.example.com:/nfs/projects/ /mnt/
    3. users 그룹의 멤버인 사용자로 /mnt/:에 파일을 생성합니다.

      # touch /mnt/file
    4. 디렉터리를 나열하여 파일이 생성되었는지 확인합니다.

      # ls -l /mnt/
      total 0
      -rw-r--r--. 1 demo users 0 Jan 16 14:18 file

5.8. 선택적 NFSv4 지원으로 NFSv3 서버 구성

여전히 NFSv3 클라이언트를 사용하는 네트워크에서 NFSv3 프로토콜을 사용하여 공유를 제공하도록 서버를 구성합니다. 네트워크에 최신 클라이언트가 있는 경우에도 NFSv4를 활성화할 수 있습니다. 기본적으로 Red Hat Enterprise Linux NFS 클라이언트는 서버에서 제공하는 최신 NFS 버전을 사용합니다.

절차

  1. nfs-utils 패키지를 설치합니다.

    # dnf install nfs-utils
  2. 선택 사항: 기본적으로 NFSv3 및 NFSv4는 활성화되어 있습니다. NFSv4 또는 특정 마이너 버전만 필요하지 않은 경우 모든 vers4.<minor_version > 매개변수의 주석을 제거하고 그에 따라 설정합니다.

    [nfsd]
    # vers3=y
    # vers4=y
    vers4.0=n
    vers4.1=n
    vers4.2=y

    이 구성을 사용하면 서버에서 NFS 버전 3 및 4.2만 제공합니다.

    중요

    특정 NFSv4 마이너 버전만 필요한 경우 마이너 버전의 매개변수만 설정합니다. 예기치 않은 활성화 또는 마이너 버전의 비활성화를 방지하기 위해 vers4 매개변수의 주석을 제거하지 마십시오. 기본적으로 vers4 매개변수는 모든 NFSv4 마이너 버전을 활성화하거나 비활성화합니다. 그러나 다른 vers 매개 변수와 함께 vers4 를 설정하면 이 동작이 변경됩니다.

  3. 기본적으로 NFSv3 RPC 서비스는 임의의 포트를 사용합니다. 방화벽 구성을 활성화하려면 /etc/nfs.conf 파일에서 고정 포트 번호를 구성합니다.

    1. [lockd] 섹션에서 nlockmgr RPC 서비스의 고정 포트 번호를 설정합니다. 예를 들면 다음과 같습니다.

      [lockd]
      port=5555

      이 설정을 사용하면 서비스는 UDP 및 TCP 프로토콜 모두에 이 포트 번호를 자동으로 사용합니다.

    2. [statd] 섹션에서 rpc.statd 서비스의 고정 포트 번호를 설정합니다. 예를 들면 다음과 같습니다.

      [statd]
      port=6666

      이 설정을 사용하면 서비스는 UDP 및 TCP 프로토콜 모두에 이 포트 번호를 자동으로 사용합니다.

  4. 선택 사항: 공유할 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.

    # mkdir -p /nfs/projects/

    기존 디렉터리를 공유하려면 이 단계를 건너뜁니다.

  5. /nfs/projects/ 디렉터리에 필요한 권한을 설정합니다.

    # chmod 2770 /nfs/projects/
    # chgrp users /nfs/projects/

    이러한 명령은 /nfs/projects/ 디렉터리에서 users 그룹에 대한 쓰기 권한을 설정하고 동일한 그룹이 이 디렉터리에 생성된 새 항목에 자동으로 설정되어 있는지 확인합니다.

  6. 공유하려는 각 디렉터리의 /etc/exports 파일에 내보내기 지점을 추가합니다.

    /nfs/projects/     192.0.2.0/24(rw) 2001:db8::/32(rw)

    이 항목은 192.0.2.0/242001:db8::/32 서브넷의 클라이언트에 대한 읽기 및 쓰기 액세스 권한으로 액세스할 수 있도록 /nfs/projects/ 디렉터리를 공유합니다.

  7. firewalld 에서 관련 포트를 엽니다.

    # firewall-cmd --permanent --add-service={nfs,rpc-bind,mountd}
    # firewall-cmd --permanent --add-port={5555/tcp,5555/udp,6666/tcp,6666/udp}
    # firewall-cmd --reload
  8. NFS 서버를 활성화하고 시작합니다.

    # systemctl enable --now rpc-statd nfs-server

검증

  • 서버에서 서버가 구성한 NFS 버전만 제공하는지 확인합니다.

    # cat /proc/fs/nfsd/versions
    +3 +4 -4.0 -4.1 +4.2
  • 클라이언트에서 다음 단계를 수행합니다.

    1. nfs-utils 패키지를 설치합니다.

      # dnf install nfs-utils
    2. 내보낸 NFS 공유를 마운트합니다.

      # mount -o vers=<version> server.example.com:/nfs/projects/ /mnt/
    3. 공유가 지정된 NFS 버전으로 마운트되었는지 확인합니다.

      # mount | grep "/mnt"
      server.example.com:/nfs/projects/ on /mnt type nfs (rw,relatime,vers=3,...
    4. users 그룹의 멤버인 사용자로 /mnt/:에 파일을 생성합니다.

      # touch /mnt/file
    5. 디렉터리를 나열하여 파일이 생성되었는지 확인합니다.

      # ls -l /mnt/
      total 0
      -rw-r--r--. 1 demo users 0 Jan 16 14:18 file

5.9. NFS 서버에서 할당량 지원 활성화

사용자 또는 그룹이 저장할 수 있는 데이터 양을 제한하려면 파일 시스템에 할당량을 구성할 수 있습니다. NFS 서버에서 rpc-rquotad 서비스는 할당량이 NFS 클라이언트의 사용자에게도 적용되도록 합니다.

사전 요구 사항

  • NFS 서버가 실행 중이고 구성되어 있습니다.
  • 할당량은 ext 또는 XFS 파일 시스템에 구성되어 있습니다.

절차

  1. 내보내는 디렉터리에서 할당량이 활성화되어 있는지 확인합니다.

    • ext 파일 시스템의 경우 다음을 입력합니다.

      # quotaon -p /nfs/projects/
      group quota on /nfs/projects (/dev/sdb1) is on
      user quota on /nfs/projects (/dev/sdb1) is on
      project quota on /nfs/projects (/dev/sdb1) is off
    • XFS 파일 시스템의 경우 다음을 입력합니다.

      # findmnt /nfs/projects
      TARGET    	SOURCE	FSTYPE OPTIONS
      /nfs/projects /dev/sdb1 xfs	rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,usrquota,grpquota
  2. quota-rpc 패키지를 설치합니다.

    # dnf install rpc-quotad
  3. 선택 사항: 기본적으로 quota RPC 서비스는 포트 875에서 실행됩니다. 다른 포트에서 서비스를 실행하려면 /etc/sysconfig/rpc -rquotad 파일의 RPCRQUOTADOPTS 변수에 -p <port_number >를 추가합니다.

    RPCRQUOTADOPTS="-p __<port_number>__"
  4. 선택 사항: 기본적으로 원격 호스트는 할당량만 읽을 수 있습니다. 클라이언트가 할당량을 설정할 수 있도록 하려면 /etc/sysconfig/rpc-rquotad 파일의 RPCRQUOTADOPTS 변수에 -S 옵션을 추가합니다.

    RPCRQUOTADOPTS="-S"
  5. firewalld 에서 포트를 엽니다.

    # firewall-cmd --permanent --add-port=875/udp
    # firewall-cmd --reload
  6. rpc-quotad 서비스를 활성화하고 시작합니다.

    # systemctl enable --now rpc-rquotad

검증

  1. 클라이언트에서 다음을 수행합니다.

    1. 내보낸 공유를 마운트합니다.

      # mount server.example.com:/nfs/projects/ /mnt/
    2. 할당량을 표시합니다. 명령은 내보낸 디렉터리의 파일 시스템에 따라 달라집니다. 예를 들면 다음과 같습니다.

      • 마운트된 모든 ext 파일 시스템에 특정 사용자의 할당량을 표시하려면 다음을 입력합니다.

        # quota -u <user_name>
        Disk quotas for user demo (uid 1000):
             Filesystem     space     quota     limit     grace     files     quota      limit     grace
        server.example.com:/nfs/projects
                     0K       100M      200M                  0         0         0
      • XFS 파일 시스템에 사용자 및 그룹 할당량을 표시하려면 다음을 입력합니다.

        # xfs_quota -x -c "report -h" /mnt/
        User quota on /nfs/projects (/dev/vdb1)
                    Blocks
        User ID     Used     Soft     Hard     Warn/Grace
        ---------- ---------------------------------
        root        0        0        0        00 [------]
        demo        0        100M     200M     00 [------]

추가 리소스

  • quota(1) 도움말 페이지
  • xfs_quota(8) 도움말 페이지

5.10. NFS 서버에서 RDMA를 통해 NFS 활성화

RDMA(Remote Direct Memory Access)는 클라이언트 시스템이 스토리지 서버의 메모리에서 자체 메모리로 직접 데이터를 전송할 수 있는 프로토콜입니다. 이렇게 하면 스토리지 처리량이 향상되고 서버와 클라이언트 간의 데이터 전송 대기 시간이 단축되고 두 종료 모두에서 CPU 부하가 줄어듭니다. NFS 서버와 클라이언트가 모두 RDMA를 통해 연결된 경우 클라이언트는 NFSoRDMA를 사용하여 내보낸 디렉터리를 마운트할 수 있습니다.

사전 요구 사항

  • NFS 서비스가 실행 중이고 구성됨
  • RoCE(InfiniBand 또는 RDMA over Converged Ethernet) 장치가 서버에 설치되어 있습니다.
  • IP over InfiniBand (IPoIB)는 서버에 구성되고 InfiniBand 장치에 IP 주소가 할당됩니다.

절차

  1. rdma-core 패키지를 설치합니다.

    # dnf install rdma-core
  2. 패키지가 이미 설치된 경우 /etc/rdma/modules/rdma.conf 파일의 xprtrdmasvcrdma 모듈이 주석 해제되었는지 확인합니다.

    # NFS over RDMA client support
    xprtrdma
    # NFS over RDMA server support
    svcrdma
  3. 선택 사항: 기본적으로 RDMA를 통한 NFS에서는 포트 20049를 사용합니다. 다른 포트를 사용하려면 /etc/nfs.conf 파일의 [nfsd] 섹션에서 rdma-port 설정을 설정합니다.

    rdma-port=_<port>_
  4. firewalld 에서 NFSoRDMA 포트를 엽니다.

    # firewall-cmd --permanent --add-port={20049/tcp,20049/udp}
    # firewall-cmd --reload

    20049 이외의 다른 포트를 설정하면 포트 번호를 조정합니다.

  5. nfs-server 서비스를 다시 시작합니다.

    # systemctl restart nfs-server

검증

  1. InfiniBand 하드웨어가 있는 클라이언트에서 다음 단계를 수행합니다.

    1. 다음 패키지를 설치합니다.

      # dnf install nfs-utils rdma-core
    2. RDMA를 통해 내보낸 NFS 공유를 마운트합니다.

      # mount -o rdma server.example.com:/nfs/projects/ /mnt/

      기본값(20049) 이외의 포트 번호를 설정하면 port = <port_number> 를 명령에 전달합니다.

      # mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/
    3. rdma 옵션을 사용하여 공유가 마운트되었는지 확인합니다.

      # mount | grep "/mnt"
      server.example.com:/nfs/projects/ on /mnt type nfs (...,proto=rdma,...)

5.11. Red Hat Identity Management 도메인에서 Kerberos를 사용하여 NFS 서버 설정

Red Hat IdM(Identity Management)을 사용하는 경우 NFS 서버를 IdM 도메인에 연결할 수 있습니다. 이를 통해 사용자와 그룹을 중앙에서 관리하고 인증, 무결성 보호 및 트래픽 암호화에 Kerberos를 사용할 수 있습니다.

사전 요구 사항

  • NFS 서버는 Red Hat IdM(Identity Management) 도메인에 등록되어 있습니다.
  • NFS 서버가 실행 중이고 구성되어 있습니다.

절차

  1. IdM 관리자로 kerberos 티켓을 받습니다.

    # kinit admin
  2. nfs/<FQDN> 서비스 주체를 생성합니다.

    # ipa service-add nfs/nfs_server.idm.example.com
  3. IdM에서 nfs 서비스 주체를 검색하여 /etc/krb5.keytab 파일에 저장합니다.

    # ipa-getkeytab -s idm_server.idm.example.com -p nfs/nfs_server.idm.example.com -k /etc/krb5.keytab
  4. 선택 사항: /etc/krb5.keytab 파일에 주체를 표시합니다.

    # klist -k /etc/krb5.keytab
    Keytab name: FILE:/etc/krb5.keytab
    KVNO Principal
    ---- --------------------------------------------------------------------------
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       1 nfs/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM
       7 host/nfs_server.idm.example.com@IDM.EXAMPLE.COM

    기본적으로 IdM 클라이언트는 호스트를 IdM 도메인에 결합할 때 /etc/krb5.keytab 파일에 호스트 주체를 추가합니다. 호스트 주체가 없는 경우 ipa-getkeytab -s idm_server.idm.example.com -p host/nfs_server.idm.example.com -k /etc/krb5.keytab 명령을 사용하여 추가합니다.

  5. ipa-client-automount 유틸리티를 사용하여 IdM ID의 매핑을 구성합니다.

    #  ipa-client-automount
    Searching for IPA server...
    IPA server: DNS discovery
    Location: default
    Continue to configure the system with these values? [no]: yes
    Configured /etc/idmapd.conf
    Restarting sssd, waiting for it to become available.
    Started autofs
  6. /etc/exports 파일을 업데이트하고 Kerberos 보안 방법을 클라이언트 옵션에 추가합니다. 예를 들면 다음과 같습니다.

    /nfs/projects/      	192.0.2.0/24(rw,sec=krb5i)

    클라이언트가 여러 보안 방법 중에서 선택할 수 있도록 하려면 해당 방법을 콜론으로 구분하여 지정합니다.

    /nfs/projects/      	192.0.2.0/24(rw,sec=krb5:krb5i:krb5p)
  7. 내보낸 파일 시스템을 다시 로드합니다.

    # exportfs -r

6장. Squid 캐싱 프록시 서버 구성

Squid는 콘텐츠를 캐시하여 대역폭과 부하 웹 페이지를 더 빠르게 줄이는 프록시 서버입니다. 이 장에서는 HTTP, HTTPS 및 FTP 프로토콜에 대한 프록시로 Squid를 설정하는 방법과 인증 및 액세스 제한에 대해 설명합니다.

6.1. 인증 없이 캐싱 프록시로 Squid 설정

인증 없이 Squid를 캐싱 프록시로 구성할 수 있습니다. 이 절차에서는 IP 범위를 기반으로 프록시에 대한 액세스를 제한합니다.

사전 요구 사항

  • 이 절차에서는 /etc/squid/squid.conf 파일이 squid 패키지에서 제공하는 것으로 가정합니다. 이전에 이 파일을 편집한 경우 파일을 제거하고 패키지를 다시 설치합니다.

절차

  1. squid 패키지를 설치합니다.

    # yum install squid
  2. /etc/squid/squid.conf 파일을 편집합니다.

    1. 프록시를 사용할 수 있어야 하는 IP 범위와 일치하도록 localnet ACL(액세스 제어 목록)을 조정합니다.

      acl localnet src 192.0.2.0/24
      acl localnet 2001:db8:1::/64

      기본적으로 /etc/squid/squid.conf 파일에는 localnet ACL에 지정된 모든 IP 범위의 프록시를 사용할 수 있는 http_access allow localnet 규칙이 포함되어 있습니다. http_access allow localnet 규칙 전에 모든 localnet ACL을 지정해야 합니다.

      중요

      사용자 환경과 일치하지 않는 기존 acl localnet 항목을 모두 제거합니다.

    2. 다음 ACL은 기본 구성에 존재하며 HTTPS 프로토콜을 사용하는 포트로 443 을 정의합니다.

      acl SSL_ports port 443

      사용자가 다른 포트에서도 HTTPS 프로토콜을 사용할 수 있어야 하는 경우 다음 각 포트에 대한 ACL을 추가합니다.

      acl SSL_ports port port_number
    3. acl Safe_ports 규칙 목록을 업데이트하여 Squid가 연결을 설정할 수 있는 포트를 구성합니다. 예를 들어 프록시를 사용하여 클라이언트가 포트 21(FTP), 80(HTTP) 및 443(HTTPS)의 리소스에만 액세스할 수 있도록 구성하려면 구성의 다음 acl Safe_ports 문만 유지합니다.

      acl Safe_ports port 21
      acl Safe_ports port 80
      acl Safe_ports port 443

      기본적으로 구성에는 Safe_ports ACL에 정의되지 않은 포트에 대한 액세스 거부를 정의하는 http_access deny! Safe_ports 규칙이 포함됩니다.

    4. cache_dir 매개변수의 캐시 유형, 캐시 크기 및 추가 캐시 유형별 설정을 구성합니다.

      cache_dir ufs /var/spool/squid 10000 16 256

      다음 설정이 필요합니다.

      • squid는 ufs 캐시 유형을 사용합니다.
      • squid는 해당 캐시를 /var/spool/squid/ 디렉터리에 저장합니다.
      • 캐시가 10000 MB까지 증가합니다.
      • squid는 /var/spool/squid/ 디렉터리에 16 level-1 하위 디렉터리를 생성합니다.
      • squid는 각 level-1 디렉토리에 256 개의 하위 디렉터리를 생성합니다.

        cache_dir 지시문을 설정하지 않으면 Squid가 캐시를 메모리에 저장합니다.

  3. cache_dir 매개변수에서 /var/spool/squid/ 와 다른 캐시 디렉터리를 설정하는 경우:

    1. 캐시 디렉토리를 생성합니다.

      # mkdir -p path_to_cache_directory
    2. 캐시 디렉토리에 대한 권한을 구성합니다.

      # chown squid:squid path_to_cache_directory
    3. 강제 모드에서 SELinux를 실행하는 경우 캐시 디렉터리에 squid_cache_t 컨텍스트를 설정합니다.

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      시스템에서 semanage 유틸리티를 사용할 수 없는 경우 policycoreutils-python-utils 패키지를 설치합니다.

  4. 방화벽에서 3128 포트를 엽니다.

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  5. squid 서비스를 활성화하고 시작합니다.

    # systemctl enable --now squid

검증 단계

프록시가 올바르게 작동하는지 확인하려면 curl 유틸리티를 사용하여 웹 페이지를 다운로드합니다.

# curl -O -L "https://www.redhat.com/index.html" -x "proxy.example.com:3128"

curl 에 오류를 표시하지 않고 index.html 파일이 현재 디렉터리로 다운로드된 경우 프록시가 작동합니다.

6.2. LDAP 인증을 사용하여 Squid를 캐싱 프록시로 설정

Squid를 LDAP를 사용하여 사용자를 인증하는 캐싱 프록시로 구성할 수 있습니다. 이 절차에서는 인증된 사용자만 프록시를 사용할 수 있도록 구성됩니다.

사전 요구 사항

  • 이 절차에서는 /etc/squid/squid.conf 파일이 squid 패키지에서 제공하는 것으로 가정합니다. 이전에 이 파일을 편집한 경우 파일을 제거하고 패키지를 다시 설치합니다.
  • LDAP 디렉터리에 uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com 과 같은 서비스 사용자가 있습니다. Squid는 이 계정을 인증 사용자를 검색하기 위해서만 사용합니다. 인증 사용자가 있는 경우 Squid는 이 사용자로 을 디렉터리에 바인딩하여 인증을 확인합니다.

절차

  1. squid 패키지를 설치합니다.

    # yum install squid
  2. /etc/squid/squid.conf 파일을 편집합니다.

    1. basic_ldap_auth helper 유틸리티를 구성하려면 /etc/squid/squid.conf 상단에 다음 설정 항목을 추가합니다.

      auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389

      다음은 위의 예제에서 basic_ldap_auth 도우미 유틸리티에 전달된 매개변수를 설명합니다.

      • -B base_DN 은 LDAP 검색 기반을 설정합니다.
      • -d proxy_service_user_DN 은 Squid가 디렉터리에서 인증 사용자를 검색하는 데 사용하는 계정의 DN(고유 이름)을 설정합니다.
      • -W path_to_password_file 은 프록시 서비스 사용자의 암호가 포함된 파일의 경로를 설정합니다. 암호 파일을 사용하면 운영 체제의 프로세스 목록에 암호가 표시되지 않습니다.
      • -F LDAP_filter 는 LDAP 검색 필터를 지정합니다. squid는 인증 사용자가 제공한 사용자 이름으로 %s 변수를 대체합니다.

        예제의 (&(objectClass=person)(uid=%s) 필터는 사용자 이름이 uid 특성에 설정된 값과 디렉터리 항목에 사람 오브젝트 클래스가 포함되어 있어야 함을 정의합니다.

      • -ZZSTARTTLS 명령을 사용하여 LDAP 프로토콜을 통해 TLS 암호화 연결을 적용합니다. 다음과 같은 경우에는 -ZZ 를 생략하십시오.

        • LDAP 서버는 암호화된 연결을 지원하지 않습니다.
        • URL에 지정된 포트는 LDAPS 프로토콜을 사용합니다.
      • H LDAP_URL 매개 변수는 프로토콜, 호스트 이름 또는 IP 주소, LDAP 서버의 포트를 URL 형식으로 지정합니다.
    2. Squid가 인증된 사용자만 프록시를 사용하도록 허용하는 다음 ACL 및 규칙을 추가합니다.

      acl ldap-auth proxy_auth REQUIRED
      http_access allow ldap-auth
      중요

      http_access deny 모든 규칙을 거부하기 전에 이러한 설정을 지정합니다.

    3. localnet ACL에 지정된 IP 범위에서 프록시 인증을 바이패스하려면 다음 규칙을 제거합니다.

      http_access allow localnet
    4. 다음 ACL은 기본 구성에 존재하며 HTTPS 프로토콜을 사용하는 포트로 443 을 정의합니다.

      acl SSL_ports port 443

      사용자가 다른 포트에서도 HTTPS 프로토콜을 사용할 수 있어야 하는 경우 다음 각 포트에 대한 ACL을 추가합니다.

      acl SSL_ports port port_number
    5. acl Safe_ports 규칙 목록을 업데이트하여 Squid가 연결을 설정할 수 있는 포트를 구성합니다. 예를 들어 프록시를 사용하여 클라이언트가 포트 21(FTP), 80(HTTP) 및 443(HTTPS)의 리소스에만 액세스할 수 있도록 구성하려면 구성의 다음 acl Safe_ports 문만 유지합니다.

      acl Safe_ports port 21
      acl Safe_ports port 80
      acl Safe_ports port 443

      기본적으로 구성에는 Safe_ports ACL에 정의되지 않은 포트에 대한 액세스 거부를 정의하는 http_access deny! Safe_ports 규칙이 포함됩니다.

    6. cache_dir 매개변수의 캐시 유형, 캐시 크기 및 추가 캐시 유형별 설정을 구성합니다.

      cache_dir ufs /var/spool/squid 10000 16 256

      다음 설정이 필요합니다.

      • squid는 ufs 캐시 유형을 사용합니다.
      • squid는 해당 캐시를 /var/spool/squid/ 디렉터리에 저장합니다.
      • 캐시가 10000 MB까지 증가합니다.
      • squid는 /var/spool/squid/ 디렉터리에 16 level-1 하위 디렉터리를 생성합니다.
      • squid는 각 level-1 디렉토리에 256 개의 하위 디렉터리를 생성합니다.

        cache_dir 지시문을 설정하지 않으면 Squid가 캐시를 메모리에 저장합니다.

  3. cache_dir 매개변수에서 /var/spool/squid/ 와 다른 캐시 디렉터리를 설정하는 경우:

    1. 캐시 디렉토리를 생성합니다.

      # mkdir -p path_to_cache_directory
    2. 캐시 디렉토리에 대한 권한을 구성합니다.

      # chown squid:squid path_to_cache_directory
    3. 강제 모드에서 SELinux를 실행하는 경우 캐시 디렉터리에 squid_cache_t 컨텍스트를 설정합니다.

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      시스템에서 semanage 유틸리티를 사용할 수 없는 경우 policycoreutils-python-utils 패키지를 설치합니다.

  4. LDAP 서비스 사용자의 암호를 /etc/squid/ldap_password 파일에 저장하고 파일에 대한 적절한 권한을 설정합니다.

    # echo "password" > /etc/squid/ldap_password
    # chown root:squid /etc/squid/ldap_password
    # chmod 640 /etc/squid/ldap_password
  5. 방화벽에서 3128 포트를 엽니다.

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  6. squid 서비스를 활성화하고 시작합니다.

    # systemctl enable --now squid

검증 단계

프록시가 올바르게 작동하는지 확인하려면 curl 유틸리티를 사용하여 웹 페이지를 다운로드합니다.

# curl -O -L "https://www.redhat.com/index.html" -x "user_name:password@proxy.example.com:3128"

curl에서 오류를 표시하지 않고 index.html 파일이 현재 디렉터리로 다운로드된 경우 프록시가 작동합니다.

문제 해결 단계

도우미 유틸리티가 올바르게 작동하는지 확인하려면 다음을 수행하십시오.

  1. auth_param 매개변수에 사용한 것과 동일한 설정으로 도우미 유틸리티를 수동으로 시작합니다.

    # /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
  2. 유효한 사용자 이름과 암호를 입력하고 Enter 키를 누릅니다.

    user_name password

    도우미 유틸리티에서 OK 를 반환하는 경우 인증이 성공했습니다.

6.3. kerberos 인증을 사용하여 캐싱 프록시로 Squid 설정

Kerberos를 사용하여 AD(Active Directory)에 사용자를 인증하는 캐싱 프록시로 Squid를 구성할 수 있습니다. 이 절차에서는 인증된 사용자만 프록시를 사용할 수 있도록 구성됩니다.

사전 요구 사항

  • 이 절차에서는 /etc/squid/squid.conf 파일이 squid 패키지에서 제공하는 것으로 가정합니다. 이전에 이 파일을 편집한 경우 파일을 제거하고 패키지를 다시 설치합니다.

절차

  1. 다음 패키지를 설치합니다.

    # yum install squid krb5-workstation
  2. AD 도메인 관리자로 인증합니다.

    # kinit administrator@AD.EXAMPLE.COM
  3. Squid의 키탭을 생성하여 /etc/squid/HTTP.keytab 파일에 저장하십시오.

    # export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab
    # net ads keytab CREATE -U administrator
  4. keytab에 HTTP 서비스 주체를 추가합니다.

    # net ads keytab ADD HTTP -U administrator
  5. keytab 파일의 소유자를 squid 사용자로 설정합니다.

    # chown squid /etc/squid/HTTP.keytab
  6. 필요한 경우 keytab 파일에 프록시 서버의 FQDN(정규화된 도메인 이름)에 대한 HTTP 서비스 주체가 포함되어 있는지 확인합니다.

    # klist -k /etc/squid/HTTP.keytab
    Keytab name: FILE:/etc/squid/HTTP.keytab
    KVNO Principal
    ---- ---------------------------------------------------
    ...
       2 HTTP/proxy.ad.example.com@AD.EXAMPLE.COM
    ...
  7. /etc/squid/squid.conf 파일을 편집합니다.

    1. negotiate_kerberos_auth 도우미 유틸리티를 구성하려면 /etc/squid/squid.conf 의 상단에 다음 설정 항목을 추가하십시오.

      auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.example.com@AD.EXAMPLE.COM

      다음은 위의 예제에서 negotiate_kerberos_auth 도우미 유틸리티로 전달되는 매개변수를 설명합니다.

      • -K 파일은 키 탭 파일의 경로를 설정합니다. squid 사용자는 이 파일에 대한 읽기 권한이 있어야 합니다.
      • -s HTTP/host_name@kerberos_realm 은 Squid가 사용하는 Kerberos 주체를 설정합니다.

        선택적으로 다음 매개변수 중 하나 또는 둘 다를 도우미 유틸리티에 전달하여 로깅을 활성화할 수 있습니다.

      • - 인증 사용자와 같은 정보 메시지를 기록합니다.
      • -D는 디버그 로깅을 활성화합니다.

        squid는 도우미 유틸리티의 디버깅 정보를 /var/log/squid/cache.log 파일에 기록합니다.

    2. Squid가 인증된 사용자만 프록시를 사용하도록 허용하는 다음 ACL 및 규칙을 추가합니다.

      acl kerb-auth proxy_auth REQUIRED
      http_access allow kerb-auth
      중요

      http_access deny 모든 규칙을 거부하기 전에 이러한 설정을 지정합니다.

    3. localnet ACL에 지정된 IP 범위에서 프록시 인증을 바이패스하려면 다음 규칙을 제거합니다.

      http_access allow localnet
    4. 다음 ACL은 기본 구성에 존재하며 HTTPS 프로토콜을 사용하는 포트로 443 을 정의합니다.

      acl SSL_ports port 443

      사용자가 다른 포트에서도 HTTPS 프로토콜을 사용할 수 있어야 하는 경우 다음 각 포트에 대한 ACL을 추가합니다.

      acl SSL_ports port port_number
    5. acl Safe_ports 규칙 목록을 업데이트하여 Squid가 연결을 설정할 수 있는 포트를 구성합니다. 예를 들어 프록시를 사용하여 클라이언트가 포트 21(FTP), 80(HTTP) 및 443(HTTPS)의 리소스에만 액세스할 수 있도록 구성하려면 구성의 다음 acl Safe_ports 문만 유지합니다.

      acl Safe_ports port 21
      acl Safe_ports port 80
      acl Safe_ports port 443

      기본적으로 구성에는 Safe_ports ACL에 정의되지 않은 포트에 대한 액세스 거부를 정의하는 http_access deny! Safe_ports 규칙이 포함됩니다.

    6. cache_dir 매개변수의 캐시 유형, 캐시 크기 및 추가 캐시 유형별 설정을 구성합니다.

      cache_dir ufs /var/spool/squid 10000 16 256

      다음 설정이 필요합니다.

      • squid는 ufs 캐시 유형을 사용합니다.
      • squid는 해당 캐시를 /var/spool/squid/ 디렉터리에 저장합니다.
      • 캐시가 10000 MB까지 증가합니다.
      • squid는 /var/spool/squid/ 디렉터리에 16 level-1 하위 디렉터리를 생성합니다.
      • squid는 각 level-1 디렉토리에 256 개의 하위 디렉터리를 생성합니다.

        cache_dir 지시문을 설정하지 않으면 Squid가 캐시를 메모리에 저장합니다.

  8. cache_dir 매개변수에서 /var/spool/squid/ 와 다른 캐시 디렉터리를 설정하는 경우:

    1. 캐시 디렉토리를 생성합니다.

      # mkdir -p path_to_cache_directory
    2. 캐시 디렉토리에 대한 권한을 구성합니다.

      # chown squid:squid path_to_cache_directory
    3. 강제 모드에서 SELinux를 실행하는 경우 캐시 디렉터리에 squid_cache_t 컨텍스트를 설정합니다.

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      시스템에서 semanage 유틸리티를 사용할 수 없는 경우 policycoreutils-python-utils 패키지를 설치합니다.

  9. 방화벽에서 3128 포트를 엽니다.

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  10. squid 서비스를 활성화하고 시작합니다.

    # systemctl enable --now squid

검증 단계

프록시가 올바르게 작동하는지 확인하려면 curl 유틸리티를 사용하여 웹 페이지를 다운로드합니다.

# curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"

curl 에서 오류를 표시하지 않고 index.html 파일이 현재 디렉터리에 있는 경우 프록시가 작동합니다.

문제 해결 단계

Kerberos 인증을 수동으로 테스트하려면 다음을 수행합니다.

  1. AD 계정에 대한 Kerberos 티켓을 받습니다.

    # kinit user@AD.EXAMPLE.COM
  2. 선택적으로 티켓을 표시합니다.

    # klist
  3. negotiate_kerberos_auth_test 유틸리티를 사용하여 인증을 테스트합니다.

    # /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com

    도우미 유틸리티에서 토큰을 반환하면 인증이 성공했습니다.

    Token: YIIFtAYGKwYBBQUCoIIFqDC...

6.4. Squid에서 도메인 거부 목록 구성

관리자는 특정 도메인에 대한 액세스를 차단하려는 경우가 많습니다. 이 섹션에서는 Squid에서 도메인 거부 목록을 구성하는 방법을 설명합니다.

사전 요구 사항

  • Squid가 구성되어 있으며 사용자는 프록시를 사용할 수 있습니다.

절차

  1. /etc/squid/squid.conf 파일을 편집하고 다음 설정을 추가합니다.

    acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt"
    http_access deny all domain_deny_list
    중요

    사용자 또는 클라이언트에 대한 액세스를 허용하는 첫 번째 http_access allow 문 앞에 이러한 항목을 추가합니다.

  2. /etc/squid/domain_deny_list.txt 파일을 만들고 차단하려는 도메인을 추가합니다. 예를 들어 하위 도메인을 포함한 example.com 에 대한 액세스를 차단하고 example.net 을 차단하려면 다음을 추가합니다.

    .example.com
    example.net
    중요

    squid 구성에서 /etc/squid/domain_deny_list.txt 파일을 참조하는 경우 이 파일은 비워서는 안 됩니다. 파일이 비어 있으면 Squid가 시작되지 않습니다.

  3. squid 서비스를 다시 시작하십시오.

    # systemctl restart squid

6.5. 특정 포트 또는 IP 주소에서 수신 대기하도록 Squid 서비스 구성

기본적으로 Squid 프록시 서비스는 모든 네트워크 인터페이스의 3128 포트에서 수신 대기합니다. 포트를 변경하고 특정 IP 주소에서 수신 대기하도록 Squid를 구성할 수 있습니다.

사전 요구 사항

  • squid 패키지가 설치되어 있습니다.

절차

  1. /etc/squid/squid.conf 파일을 편집합니다.

    • Squid 서비스가 수신 대기하는 포트를 설정하려면 http_port 매개 변수에 포트 번호를 설정합니다. 예를 들어 포트를 8080 으로 설정하려면 다음을 설정합니다.

      http_port 8080
    • Squid 서비스가 수신 대기하는 IP 주소를 구성하려면 http_port 매개변수에서 IP 주소 및 포트 번호를 설정합니다. 예를 들어 Squid가 포트 3128192.0.2.1 IP 주소에서만 수신 대기하도록 구성하려면 다음을 설정합니다.

      http_port 192.0.2.1:3128

      구성 파일에 여러 http_port 매개 변수를 추가하여 Squid가 여러 포트 및 IP 주소에서 수신 대기하도록 구성합니다.

      http_port 192.0.2.1:3128
      http_port 192.0.2.1:8080
  2. Squid가 기본값(3128)으로 다른 포트를 사용하도록 구성한경우:

    1. 방화벽에서 포트를 엽니다.

      # firewall-cmd --permanent --add-port=port_number/tcp
      # firewall-cmd --reload
    2. 강제 모드에서 SELinux를 실행하는 경우 포트를 squid_port_t 포트 유형 정의에 할당합니다.

      # semanage port -a -t squid_port_t -p tcp port_number

      시스템에서 semanage 유틸리티를 사용할 수 없는 경우 policycoreutils-python-utils 패키지를 설치합니다.

  3. squid 서비스를 다시 시작하십시오.

    # systemctl restart squid

6.6. 추가 리소스

  • 설정 매개변수 usr/share/doc/squid-<version>/squid.conf.documented

7장. 데이터베이스 서버

7.1. 데이터베이스 서버 소개

데이터베이스 서버는 DBMS(데이터베이스 관리 시스템)의 기능을 제공하는 서비스입니다. DBMS는 데이터베이스 관리를 위한 유틸리티를 제공하며 최종 사용자, 애플리케이션 및 데이터베이스와 상호 작용합니다.

Red Hat Enterprise Linux 8은 다음과 같은 데이터베이스 관리 시스템을 제공합니다.

  • MariaDB 10.3
  • MariaDB 10.5 - RHEL 8.4 이후 사용 가능
  • MySQL 8.0
  • PostgreSQL 10
  • PostgreSQL 9.6
  • PostgreSQL 12 - RHEL 8.1.1 이후 사용 가능
  • PostgreSQL 13 - RHEL 8.4 이후 사용 가능
  • PostgreSQL 15 - RHEL 8.8 이후 사용 가능

7.2. MariaDB 사용

MariaDB 서버는 MySQL 기술을 기반으로 하는 오픈 소스 빠르고 강력한 데이터베이스 서버입니다. MariaDB 는 데이터를 구조화된 정보로 변환하고 데이터에 액세스하기 위한 SQL 인터페이스를 제공하는 관계형 데이터베이스입니다. 여기에는 여러 스토리지 엔진 및 플러그인, GIS(지리적 정보 시스템) 및 JSON(JavaScript Object Notation) 기능이 포함됩니다.

RHEL 시스템에 MariaDB 를 설치하고 구성하는 방법, MariaDB 데이터를 백업하는 방법, 이전 MariaDB 버전에서 마이그레이션하는 방법, MariaDB Galera Cluster 를 사용하여 데이터베이스를 복제하는 방법을 알아봅니다.

7.2.1. MariaDB 설치

RHEL 8에서 MariaDB 서버는 다음 버전에서 사용할 수 있으며 각각 별도의 스트림에서 제공됩니다.

  • MariaDB 10.3
  • MariaDB 10.5 - RHEL 8.4 이후 사용 가능

MariaDB 를 설치하려면 다음 절차를 사용합니다.

절차

  1. mariadb 모듈에서 스트림(버전)을 선택하고 서버 프로필을 지정하여 MariaDB 서버 패키지를 설치합니다. 예를 들면 다음과 같습니다.

    # yum module install mariadb:10.3/server
  2. mariadb 서비스를 시작합니다.

    # systemctl start mariadb.service
  3. 부팅 시 시작되도록 mariadb 서비스를 활성화합니다.

    # systemctl enable mariadb.service
  4. MariaDB 10.3에 권장됩니다. MariaDB 를 설치할 때 보안을 개선하려면 다음 명령을 실행합니다.

    $ mysql_secure_installation

    명령은 완전히 대화형 스크립트를 시작하여 프로세스의 각 단계에 대한 메시지를 표시합니다. 이 스크립트를 사용하면 다음과 같은 방법으로 보안을 강화할 수 있습니다.

    • root 계정의 암호 설정
    • 익명 사용자 제거
    • 원격 root 로그인 허용 (로컬 호스트 내부)

      참고

      mysql_secure_installation 스크립트는 MariaDB 10.5 이상에서 더 이상 중요하지 않습니다. 보안 개선 사항은 MariaDB 10.5 이후 기본 동작의 일부입니다.

중요

충돌하는 RPM 패키지로 인해 MariaDBMySQL 데이터베이스 서버를 RHEL 8에서 병렬로 설치할 수 없습니다. RHEL 7용 Red Hat Software Collections에서는 구성 요소의 병렬 설치가 가능합니다. RHEL 8에서는 컨테이너에서 다른 버전의 데이터베이스 서버를 사용할 수 있습니다.

7.2.2. MariaDB 구성

네트워킹에 사용할 MariaDB 서버를 구성하려면 다음 절차를 사용합니다.

절차

  1. /etc/my.cnf. d/mariadb-server.cnf 파일의 [mysqld ] 섹션을 편집합니다. 다음 구성 지시문을 설정할 수 있습니다.

    • bind-address - 서버가 수신 대기하는 주소입니다. 가능한 옵션은 다음과 같습니다.

      • 호스트 이름
      • IPv4 주소
      • IPv6 주소
    • skip-networking - 서버가 TCP/IP 연결을 수신하는지 여부를 제어합니다. 가능한 값은 다음과 같습니다.

      • 0 - 모든 클라이언트 수신 대기
      • 1 - 로컬 클라이언트만 수신 대기
    • 포트 - MariaDB 가 TCP/IP 연결을 수신 대기하는 포트입니다.
  2. mariadb 서비스를 다시 시작합니다.

    # systemctl restart mariadb.service

7.2.3. MariaDB 서버에서 TLS 암호화 설정

기본적으로 MariaDB 는 암호화되지 않은 연결을 사용합니다. 보안 연결을 위해 MariaDB 서버에서 TLS 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성합니다.

7.2.3.1. MariaDB 서버에 CA 인증서, 서버 인증서 및 개인 키 배치

MariaDB 서버에서 TLS 암호화를 활성화하려면 MariaDB 서버에 인증 기관(CA) 인증서, 서버 인증서 및 개인 키를 저장할 수 있습니다.

사전 요구 사항

  • Privacy Enhanced Mail (PEM) 형식의 다음 파일이 서버에 복사되었습니다.

    • 서버의 개인 키: server.example.com.key.pem
    • 서버 인증서: server.example.com.crt.pem
    • CA(인증 기관) 인증서: ca.crt.pem

    개인 키 및 CSR(인증서 서명 요청) 생성 및 CA에서 인증서 요청에 대한 자세한 내용은 CA 문서를 참조하십시오.

절차

  1. CA 및 서버 인증서를 /etc/pki/tls/certs/ 디렉터리에 저장합니다.

    # mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/
    # mv <path>/ca.crt.pem /etc/pki/tls/certs/
  2. MariaDB 서버가 파일을 읽을 수 있도록 CA 및 서버 인증서에 대한 권한을 설정합니다.

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem

    인증서는 보안 연결을 설정하기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 검색할 수 있습니다. 따라서 CA 및 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.

  3. 서버의 개인 키를 /etc/pki/tls/private/ 디렉터리에 저장합니다.

    # mv <path>/server.example.com.key.pem /etc/pki/tls/private/
  4. 서버의 개인 키에 보안 권한을 설정합니다.

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem

    권한이 없는 사용자가 개인 키에 액세스할 수 있는 경우 MariaDB 서버에 대한 연결이 더 이상 안전하지 않습니다.

  5. SELinux 컨텍스트를 복원하십시오.

    #  restorecon -Rv /etc/pki/tls/

7.2.3.2. MariaDB 서버에서 TLS 구성

보안을 개선하려면 MariaDB 서버에서 TLS 지원을 활성화합니다. 결과적으로 클라이언트는 TLS 암호화를 사용하여 서버로 데이터를 전송할 수 있습니다.

사전 요구 사항

  • MariaDB 서버를 설치했습니다.
  • mariadb 서비스가 실행 중입니다.
  • Privacy Enhanced Mail (PEM) 형식의 다음 파일은 서버에 있으며 mysql 사용자가 읽을 수 있습니다.

    • 서버의 개인 키: /etc/pki/tls/private/server.example.com.key.pem
    • 서버 인증서: /etc/pki/tls/certs/server.example.com.crt.pem
    • CA(인증 기관) 인증서 /etc/pki/tls/certs/ca.crt.pem
  • 서버 인증서의 주체 고유 이름(DN) 또는 subject alternatives name(SAN) 필드는 서버의 호스트 이름과 일치합니다.

절차

  1. /etc/my.cnf.d/mariadb-server-tls.cnf 파일을 생성합니다.

    1. 다음 콘텐츠를 추가하여 개인 키, 서버 및 CA 인증서에 대한 경로를 구성합니다.

      [mariadb]
      ssl_key = /etc/pki/tls/private/server.example.com.key.pem
      ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem
      ssl_ca = /etc/pki/tls/certs/ca.crt.pem
    2. CRL(인증서 해지 목록)이 있는 경우 이를 사용하도록 MariaDB 서버를 구성합니다.

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
    3. 선택 사항: MariaDB 10.5.2 이상을 실행하는 경우 암호화 없이 연결 시도를 거부할 수 있습니다. 이 기능을 활성화하려면 다음을 추가합니다.

      require_secure_transport = on
    4. 선택 사항: MariaDB 10.4.6 이상을 실행하는 경우 서버에서 지원할 TLS 버전을 설정할 수 있습니다. 예를 들어 TLS 1.2 및 TLS 1.3을 지원하려면 다음을 추가합니다.

      tls_version = TLSv1.2,TLSv1.3

      기본적으로 서버는 TLS 1.1, TLS 1.2 및 TLS 1.3을 지원합니다.

  2. mariadb 서비스를 다시 시작합니다.

    # systemctl restart mariadb

검증

문제 해결을 간소화하려면 TLS 암호화를 사용하도록 로컬 클라이언트를 구성하기 전에 MariaDB 서버에서 다음 단계를 수행합니다.

  1. MariaDB 에 TLS 암호화가 활성화되어 있는지 확인합니다.

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | have_ssl      | YES             |
    +---------------+-----------------+

    have_ssl 변수를 yes 로 설정하면 TLS 암호화가 활성화됩니다.

  2. 특정 TLS 버전만 지원하도록 MariaDB 서비스를 구성한 경우 tls_version 변수를 표시합니다.

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | tls_version   | TLSv1.2,TLSv1.3 |
    +---------------+-----------------+

7.2.3.3. 특정 사용자 계정에 대해 TLS 암호화 연결 필요

중요한 데이터에 액세스할 수 있는 사용자는 항상 TLS 암호화 연결을 사용하여 네트워크를 통해 암호화되지 않은 데이터를 전송하지 않도록 해야 합니다.

모든 연결(에서 required_secure_transport =)에 보안 전송이 필요한서버에서 를 구성할 수 없는 경우 TLS 암호화가 필요하도록 개별 사용자 계정을 구성합니다.

사전 요구 사항

  • MariaDB 서버에는 TLS 지원이 활성화되어 있습니다.
  • 보안 전송을 요구하도록 구성하는 사용자가 있습니다.
  • 클라이언트는 서버의 인증서를 발급한 CA 인증서를 신뢰합니다.

절차

  1. 관리자로 MariaDB 서버에 연결합니다.

    # mysql -u root -p -h server.example.com

    관리자가 서버에 원격으로 액세스할 수 있는 권한이 없는 경우 MariaDB 서버에서 명령을 수행하고 localhost 에 연결합니다.

  2. REQUIRE SSL 절을 사용하여 사용자가 TLS 암호화 연결을 사용하여 연결해야 함을 적용합니다.

    MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;

검증

  1. TLS 암호화를 사용하여 서버에 예제 사용자로 연결합니다.

    # mysql -u example -p -h server.example.com --ssl
    ...
    MariaDB [(none)]>

    오류가 표시되지 않고 대화형 MariaDB 콘솔에 액세스할 수 있는 경우 TLS와의 연결이 성공합니다.

  2. TLS가 비활성화된 예제 사용자로 연결을 시도합니다.

    # mysql -u example -p -h server.example.com --skip-ssl
    ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)

    이 사용자에게는 TLS가 필요하지만 비활성화됨(--skip-ssl)이므로 서버에서 로그인 시도를 거부했습니다.

7.2.4. MariaDB 클라이언트에서 전역적으로 TLS 암호화 활성화

MariaDB 서버가 TLS 암호화를 지원하는 경우 보안 연결만 설정하고 서버 인증서를 확인하도록 클라이언트를 구성합니다. 다음 절차에서는 서버에 있는 모든 사용자에 대해 TLS 지원을 활성화하는 방법을 설명합니다.

7.2.4.1. 기본적으로 TLS 암호화를 사용하도록 MariaDB 클라이언트 구성

RHEL에서는 MariaDB 클라이언트가 TLS 암호화를 사용하도록 구성하고 서버 인증서의 CN(Common Name)이 사용자가 연결하는 호스트 이름과 일치하는지 확인할 수 있습니다. 따라서 메시지 가로채기(man-in-the-middle) 공격을 방지합니다.

사전 요구 사항

  • MariaDB 서버에는 TLS 지원이 활성화되어 있습니다.
  • 서버의 인증서를 발급한 CA(인증 기관)가 RHEL에서 신뢰할 수 없는 경우 CA 인증서가 클라이언트에 복사됩니다.

절차

  1. RHEL이 서버의 인증서를 발급한 CA를 신뢰하지 않는 경우:

    1. CA 인증서를 /etc/pki/ca-trust/source/anchors/ 디렉터리에 복사합니다.

      # cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
    2. 모든 사용자가 CA 인증서 파일을 읽을 수 있도록 권한을 설정합니다.

      # chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
    3. CA 신뢰 데이터베이스를 다시 빌드합니다.

      # update-ca-trust
  2. 다음 콘텐츠를 사용하여 /etc/my.cnf.d/mariadb-client-tls.cnf 파일을 생성합니다.

    [client-mariadb]
    ssl
    ssl-verify-server-cert

    이러한 설정은 MariaDB 클라이언트가 TLS 암호화(ssl)를 사용하고 클라이언트가 서버 인증서의 CN과 호스트 이름을 비교하는 것을 정의합니다(ssl-verify-server-cert).

검증

  • 호스트 이름을 사용하여 서버에 연결하고 서버 상태를 표시합니다.

    # mysql -u root -p -h server.example.com -e status
    ...
    SSL:        Cipher in use is TLS_AES_256_GCM_SHA384

    SSL 항목에 사용 중 암호화가 있는 경우..., 연결이 암호화됩니다.

    이 명령에서 사용하는 사용자에게는 원격으로 인증할 수 있는 권한이 있습니다.

    연결하는 호스트 이름이 서버의 TLS 인증서의 호스트 이름과 일치하지 않으면 ssl-verify-server-cert 매개변수로 인해 연결이 실패합니다. 예를 들어 localhost 에 연결하는 경우 :

    # mysql -u root -p -h localhost -e status
    ERROR 2026 (HY000): SSL connection error: Validation of SSL server certificate failed

추가 리소스

  • mysql(1) 도움말 페이지의 --ssl* 매개 변수 설명.

7.2.5. MariaDB 데이터 백업

Red Hat Enterprise Linux 8의 MariaDB 데이터베이스에서 데이터를 백업하는 방법에는 두 가지가 있습니다.

  • 논리적 백업
  • 물리적 백업

논리적 백업 은 데이터를 복원하는 데 필요한 SQL 문으로 구성됩니다. 이러한 유형의 백업은 일반 텍스트 파일로 정보와 레코드를 내보냅니다.

물리적 백업보다 논리적 백업의 주요 장점은 이식성과 유연성입니다. 데이터는 물리적 백업에서 사용할 수 없는 다른 하드웨어 구성, MariaDB 버전 또는 DBMS(데이터베이스 관리 시스템)에서 복원할 수 있습니다.

mariadb.service 가 실행 중인 경우 논리적 백업을 수행할 수 있습니다. 논리적 백업에는 로그 및 구성 파일이 포함되지 않습니다.

물리적 백업 은 콘텐츠를 저장하는 파일과 디렉토리의 복사본으로 구성됩니다.

물리적 백업은 논리적 백업과 비교하여 다음과 같은 이점이 있습니다.

  • 출력이 더 작습니다.
  • 백업은 크기가 작습니다.
  • 백업 및 복원 속도가 빨라집니다.
  • 백업에는 로그 및 구성 파일이 포함됩니다.

물리적 백업은 mariadb.service 가 실행 중이 아니거나 백업 중 변경을 방지하기 위해 데이터베이스의 모든 테이블이 잠겨 있는 경우 수행해야 합니다.

다음 MariaDB 백업 방법 중 하나를 사용하여 MariaDB 데이터베이스에서 데이터를 백업할 수 있습니다.

  • mysqldump를 사용한 논리적 백업
  • Mariabackup 유틸리티를 사용한 물리적 온라인 백업
  • 파일 시스템 백업
  • 백업 솔루션으로의 복제

7.2.5.1. mysqldump를 사용하여 논리적 백업 수행

mysqldump 클라이언트는 백업 또는 다른 데이터베이스 서버로 전송을 위해 데이터베이스 또는 데이터베이스 컬렉션을 덤프하는 데 사용할 수 있는 백업 유틸리티입니다. mysqldump 의 출력은 일반적으로 서버 테이블 구조를 다시 생성하거나 데이터로 채우거나 둘 다로 채워지는 SQL 문으로 구성됩니다. mysqldump 는 CSV와 같은 XML 및 구분된 텍스트 형식을 포함하여 다른 형식의 파일을 생성할 수도 있습니다.

mysqldump 백업을 수행하려면 다음 옵션 중 하나를 사용할 수 있습니다.

  • 하나 이상의 선택된 데이터베이스 백업
  • 모든 데이터베이스 백업
  • 하나의 데이터베이스에서 테이블의 하위 집합 백업

절차

  • 단일 데이터베이스를 덤프하려면 다음을 실행합니다.

    # mysqldump [options] --databases db_name > backup-file.sql
  • 한 번에 여러 데이터베이스를 덤프하려면 다음을 실행합니다.

    # mysqldump [options] --databases db_name1 [db_name2 …​] > backup-file.sql
  • 모든 데이터베이스를 덤프하려면 다음을 실행합니다.

    # mysqldump [options] --all-databases > backup-file.sql
  • 하나 이상의 덤프된 전체 데이터베이스를 서버에 다시 로드하려면 다음을 실행합니다.

    # mysql < backup-file.sql
  • 데이터베이스를 원격 MariaDB 서버에 로드하려면 다음을 실행합니다.

    # mysql --host=remote_host < backup-file.sql
  • 하나의 데이터베이스의 테이블 하위 집합을 덤프하려면 mysqldump 명령 끝에 선택한 테이블 목록을 추가합니다.

    # mysqldump [options] db_name [tbl_name …​​] > backup-file.sql
  • 하나의 데이터베이스에서 덤프된 테이블의 하위 집합을 로드하려면 다음을 실행합니다.

    # mysql db_name < backup-file.sql
    참고

    db_name 데이터베이스는 이 시점에 있어야 합니다.

  • mysqldump 에서 지원하는 옵션 목록을 보려면 다음을 실행합니다.

    $ mysqldump --help

추가 리소스

7.2.5.2. Mariabackup 유틸리티를 사용하여 물리적 온라인 백업 수행

mariabackup 은 Percona XtraBackup 기술을 기반으로 하는 유틸리티로서 InnoDB, Aria, MyISAM 테이블의 물리적 온라인 백업을 수행할 수 있습니다. 이 유틸리티는 AppStream 리포지토리에서 mariadb-backup 패키지에서 제공합니다.

mariabackup 은 암호화 및 압축된 데이터를 포함하는 MariaDB 서버에 대한 전체 백업 기능을 지원합니다.

사전 요구 사항

  • mariadb-backup 패키지가 시스템에 설치됩니다.

    # yum install mariadb-backup
  • 백업이 실행될 사용자 자격 증명이 포함된 Mariabackup 을 제공해야 합니다. 명령줄 또는 구성 파일을 통해 자격 증명을 제공할 수 있습니다.
  • Mariabackup 사용자는 RELOAD,LOCK TABLESREPLICATION CLIENT 권한이 있어야 합니다.

Mariabackup 을 사용하여 데이터베이스 백업을 만들려면 다음 절차를 따르십시오.

절차

  • 명령줄에서 자격 증명을 제공하는 동안 백업을 만들려면 다음을 실행합니다.

    $ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>

    target-dir 옵션은 백업 파일이 저장되는 디렉터리를 정의합니다. 전체 백업을 수행하려면 대상 디렉터리가 비어 있거나 존재하지 않아야 합니다.

    사용자 이름 및 암호 옵션을 사용하여 사용자 이름과 암호를 구성할 수 있습니다.

  • 구성 파일에 인증 정보가 설정된 백업을 생성하려면 다음을 수행합니다.

    1. /etc/my.cnf.d/ 디렉터리에 구성 파일을 만듭니다(예: /etc/my.cnf.d/mariabackup.cnf ).
    2. 새 파일의 [xtrabackup] 또는 [mysqld] 섹션에 다음 행을 추가합니다.

      [xtrabackup]
      user=myuser
      password=mypassword
    3. 백업을 수행합니다.

      $ mariabackup --backup --target-dir <backup_directory>
중요

mariabackup 은 구성 파일의 [mariadb] 섹션에서 옵션을 읽지 않습니다. MariaDB 서버에 기본이 아닌 데이터 디렉터리가 지정된 경우 Mariabackup이 데이터 디렉터리를 찾을 수 있도록 구성 파일의 [xtrabackup] 또는 [mysqld] 섹션에서 이 디렉터리를 지정해야 합니다.

기본이 아닌 데이터 디렉터리를 지정하려면 MariaDB 구성 파일의 [xtrabackup] 또는 [mysqld] 섹션에 다음 행을 포함합니다.

datadir=/var/mycustomdatadir

7.2.5.3. Mariabackup 유틸리티를 사용하여 데이터 복원

백업이 완료되면 다음 옵션 중 하나와 함께 mariabackup 명령을 사용하여 백업에서 데이터를 복원할 수 있습니다.

  • --copy-back 을 사용하면 원본 백업 파일을 유지할 수 있습니다.
  • --move-back 은 백업 파일을 데이터 디렉터리로 이동하고 원래 백업 파일을 제거합니다.

Mariabackup 유틸리티를 사용하여 데이터를 복원하려면 다음 절차를 따르십시오.

사전 요구 사항

  • mariadb 서비스가 실행되고 있지 않은지 확인합니다.

    # systemctl stop mariadb.service
  • 데이터 디렉터리가 비어 있는지 확인합니다.
  • Mariabackup 사용자는 RELOAD,LOCK TABLESREPLICATION CLIENT 권한이 있어야 합니다.

절차

  1. mariabackup 명령을 실행합니다.

    • 데이터를 복원하고 원본 백업 파일을 유지하려면 --copy-back 옵션을 사용합니다.

      $ mariabackup --copy-back --target-dir=/var/mariadb/backup/
    • 데이터를 복원하고 원본 백업 파일을 제거하려면 --move-back 옵션을 사용합니다.

      $ mariabackup --move-back --target-dir=/var/mariadb/backup/
  2. 파일 권한을 수정합니다.

    데이터베이스를 복원할 때 Mariabackup 은 백업의 파일 및 디렉토리 권한을 보존합니다. 그러나 Mariabackup 은 파일을 디스크에 쓰는 사용자 및 그룹으로 데이터베이스를 복원합니다. 백업을 복원한 후 일반적으로 MariaDB 서버의 사용자 및 그룹과 일치하도록 데이터 디렉터리의 소유자(일반적으로 mysql )를 조정해야 할 수 있습니다.

    예를 들어 파일의 소유권을 mysql 사용자 및 그룹으로 재귀적으로 변경하려면 다음을 수행합니다.

    # chown -R mysql:mysql /var/lib/mysql/
  3. mariadb 서비스를 시작합니다.

    # systemctl start mariadb.service

7.2.5.4. 파일 시스템 백업 수행

MariaDB 데이터 파일의 파일 시스템 백업을 생성하려면 MariaDB 데이터 디렉터리의 콘텐츠를 백업 위치에 복사합니다.

현재 구성 또는 로그 파일도 백업하려면 다음 절차의 선택적 단계를 사용하십시오.

절차

  1. mariadb 서비스를 중지합니다.

    # systemctl stop mariadb.service
  2. 필요한 위치에 데이터 파일을 복사합니다.

    # cp -r /var/lib/mysql /backup-location
  3. 필요한 경우 구성 파일을 필요한 위치에 복사합니다.

    # cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
  4. 필요한 경우 로그 파일을 필요한 위치에 복사합니다.

    # cp /var/log/mariadb/* /backup-location/logs
  5. mariadb 서비스를 시작합니다.

    # systemctl start mariadb.service
  6. 백업 위치에서 /var/lib/mysql 디렉터리에 백업 데이터를 로드할 때 mysql:mysql/var/lib/mysql 에 있는 모든 데이터의 소유자인지 확인하십시오.

    # chown -R mysql:mysql /var/lib/mysql

7.2.5.5. 백업 솔루션으로의 복제

복제는 소스 서버를 위한 대체 백업 솔루션입니다. 소스 서버에서 복제본 서버에 복제하는 경우 소스에 영향을 주지 않고 복제본에서 백업을 실행할 수 있습니다. 복제본을 종료하는 동안 계속 소스를 실행하고 복제본에서 데이터를 백업할 수 있습니다.

주의

복제 자체는 충분한 백업 솔루션이 아닙니다. 복제는 하드웨어 장애로부터 소스 서버를 보호하지만 데이터 손실에 대한 보호는 보장하지 않습니다. 이 메서드와 함께 복제본에서 다른 백업 솔루션을 사용하는 것이 좋습니다.

7.2.6. MariaDB 10.3으로 마이그레이션

RHEL 7에는 MySQL 데이터베이스 제품군의 서버 기본 구현으로 MariaDB 5.5 가 포함되어 있습니다. MariaDB 데이터베이스 서버의 이후 버전은 RHEL 7용 Software Collections로 사용할 수 있습니다. RHEL 8에서는 MariaDB 10.3,MariaDB 10.5MySQL 8.0 을 제공합니다.

이 부분에서는 RHEL 7 또는 Red Hat Software Collections 버전의 MariaDB에서 MariaDB 10.3 로의 마이그레이션에 대해 설명합니다. RHEL 8에서 MariaDB 10.3에서 MariaDB 10.5 로 마이그레이션하려면 대신 MariaDB 10.3에서 MariaDB 10.5로 업그레이드를 참조하십시오.

7.2.6.1. RHEL 7과 RHEL 8 버전의 MariaDB 간 주요 차이점

MariaDB 5.5와 MariaDB 10.3 의 가장 중요한 변경 사항은 다음과 같습니다.

  • 동기식 멀티 소스 클러스터인 MariaDB Galera Cluster 는 10.1 이후 MariaDB 의 표준 부분입니다.
  • ARCHIVE 스토리지 엔진은 더 이상 기본적으로 활성화되어 있지 않으며 플러그인을 구체적으로 활성화해야 합니다.
  • BLACKHOLE 스토리지 엔진은 기본적으로 활성화되어 있지 않으며 플러그인을 구체적으로 활성화해야 합니다.
  • InnoDB는 MariaDB 10.1 및 이전 버전에서 사용된 XtraDB 대신 기본 스토리지 엔진으로 사용됩니다.

    자세한 내용은 XtraDB 대신 MariaDB 10.2가 InnoDB를 사용하는 이유를 참조하십시오.

  • 새로운 mariadb-connector-c 패키지에서 는 MySQL 및 MariaDB의 공통 클라이언트 라이브러리를 제공합니다. 이 라이브러리는 MySQLMariaDB 데이터베이스 서버의 모든 버전에서 사용할 수 있습니다. 결과적으로 사용자는 Red Hat Enterprise Linux 8과 함께 배포된 MySQL 및 MariaDB 서버에 애플리케이션 빌드를 연결할 수 있습니다.

MariaDB 5.5 에서 MariaDB 10.3 으로 마이그레이션하려면 MariaDB로 마이그레이션에 설명된 대로 여러 구성 변경을 수행해야 합니다.

7.2.6.2. 설정 변경

MariaDB 5.5에서 MariaDB 10.3 으로의 마이그레이션 권장 마이그레이션 경로는 먼저 MariaDB 10.0 으로 업그레이드한 다음 하나의 버전으로 연속적으로 업그레이드하는 것입니다.

한 번에 하나의 마이너 버전을 업그레이드하는 주요 장점은 데이터와 구성을 포함한 데이터베이스를 변경 사항에 맞게 더 효과적으로 조정하는 것입니다. 업그레이드는 RHEL 8(MariaDB 10.3)에서 사용할 수 있는 것과 동일한 주요 버전에서 종료되므로 구성 변경이나 기타 문제가 크게 줄어듭니다.

MariaDB 5.5 에서 MariaDB 10.0 으로 마이그레이션할 때 구성 변경에 대한 자세한 내용은 Red Hat Software Collections 설명서에서 MariaDB 10.0으로 마이그레이션 을 참조하십시오.

다음 후속 버전의 MariaDB 로 마이그레이션 및 필요한 구성 변경 사항은 다음 문서에 설명되어 있습니다.

참고

MariaDB 5.5에서 MariaDB 10.3 으로 직접 마이그레이션할 수도 있지만 위의 마이그레이션 문서에 설명된 차이점에 필요한 모든 구성 변경 사항을 수행해야 합니다.

7.2.6.3. mysql_upgrade 유틸리티를 사용한 즉각적 업그레이드

데이터베이스 파일을 RHEL 8로 마이그레이션하려면 RHEL 7의 MariaDB 사용자가 mysql_upgrade 유틸리티를 사용하여 즉각적 업그레이드를 수행해야 합니다. mysql_upgrade 유틸리티는 mariadb-server 패키지의 종속성으로 설치된 mariadb-server- utils 하위 패키지에서 제공합니다.

즉각적 업그레이드를 수행하려면 바이너리 데이터 파일을 RHEL 8 시스템의 /var/lib/mysql/ 데이터 디렉터리에 복사하고 mysql_upgrade 유틸리티를 사용해야 합니다.

다음에서 데이터를 마이그레이션하는 데 이 방법을 사용할 수 있습니다.

  • Red Hat Enterprise Linux 7 버전의 MariaDB 5.5
  • Red Hat Software Collections 버전:

    • MariaDB 5.5 (더 이상 지원되지 않음)
    • MariaDB 10.0 (더 이상 지원되지 않음)
    • MariaDB 10.1 (더 이상 지원되지 않음)
    • MariaDB 10.2 (더 이상 지원되지 않음)
    • MariaDB 10.3

      하나의 버전으로 영구적으로 MariaDB 10.3 으로 업그레이드하는 것이 좋습니다. Red Hat Software Collections 릴리스 노트 에서 각 마이그레이션 장을 참조하십시오.

참고

RHEL 7 버전의 MariaDB 에서 업그레이드하는 경우 소스 데이터는 /var/lib/mysql/ 디렉터리에 저장됩니다. Red Hat Software Collections 버전의 MariaDB 의 경우 소스 데이터 디렉터리는 /var/opt/rh/<collection_name>/lib/mysql/(/ opt/rh/mariadb55/root/var/lib/mysql/ 데이터 디렉터리를 사용하는 mariadb55 제외)입니다.

mysql_upgrade 유틸리티를 사용하여 업그레이드를 수행하려면 다음 절차를 사용합니다.

사전 요구 사항

  • 업그레이드를 수행하기 전에 MariaDB 데이터베이스에 저장된 모든 데이터를 백업합니다.

절차

  1. mariadb-server 패키지가 RHEL 8 시스템에 설치되어 있는지 확인합니다.

    # yum install mariadb-server
  2. 데이터를 복사할 때 mariadb 서비스가 소스 및 대상 시스템에서 실행되지 않는지 확인합니다.

    # systemctl stop mariadb.service
  3. 소스 위치의 데이터를 RHEL 8 대상 시스템의 /var/lib/mysql/ 디렉터리로 복사합니다.
  4. 대상 시스템에서 복사된 파일에 대한 적절한 권한 및 SELinux 컨텍스트를 설정합니다.

    # restorecon -vr /var/lib/mysql
  5. 대상 시스템에서 MariaDB 서버를 시작합니다.

    # systemctl start mariadb.service
  6. mysql_upgrade 명령을 실행하여 내부 테이블을 확인하고 복구합니다.

    $ mysql_upgrade
  7. 업그레이드가 완료되면 /etc/my.cnf.d/ 디렉터리에 있는 모든 구성 파일에 MariaDB 10.3 에 유효한 옵션만 포함되어 있는지 확인합니다.
중요

즉각적 업그레이드와 관련하여 특정 위험 및 알려진 문제가 있습니다. 예를 들어 일부 쿼리가 작동하지 않거나 업그레이드 전과 다른 순서로 실행됩니다. 이러한 위험 및 문제에 대한 자세한 내용과 인플레이스 업그레이드에 대한 일반적인 정보는 MariaDB 10.3 릴리스 노트 를 참조하십시오.

7.2.7. MariaDB 10.3에서 MariaDB 10.5로 업그레이드

이 부분에서는 RHEL 8 내의 MariaDB 10.3 에서 MariaDB 10.5 로의 마이그레이션에 대해 설명합니다.

7.2.7.1. MariaDB 10.3과 MariaDB 10.5의 주요 차이점

MariaDB 10.3과 MariaDB 10.5 간의 중요한 변경 사항은 다음과 같습니다.

  • 이제 MariaDB 에서 기본적으로 unix_socket 인증 플러그인을 사용합니다. 이 플러그인을 사용하면 로컬 UNIX 소켓 파일을 통해 MariaDB 에 연결할 때 운영 체제 자격 증명을 사용할 수 있습니다.
  • MariaDBmariadb-* 바이너리를 가리키는 바이너리와 mysql* 심볼릭 링크라는 mariadb-* 를 추가합니다. 예를 들어 mysqladmin,mysqlaccessmysqlshow symlink는 mariadb-admin,mariadb-accessmariadb-show 바이너리를 각각 가리킵니다.
  • SUPER 권한이 각 사용자 역할에 맞게 여러 권한으로 분할되었습니다. 결과적으로 특정 문이 필수 권한이 변경되었습니다.
  • 병렬 복제에서 slave_parallel_mode 는 이제 기본적으로 fake로 설정됩니다.
  • InnoDB 스토리지 엔진에서 다음 변수의 기본값이 변경되었습니다. innodb_adaptive_hash_indexOFF 로, innodb_checksum_algorithm에서 full_ crc32 로 변경되었습니다.
  • MariaDB 는 이전에 사용된 읽기라인 라이브러리 대신 MariaDB 명령 기록( .mysql_history 파일)을 관리하는 기본 소프트웨어의 libedit 구현을 사용합니다. 이 변경 사항은 .mysql_history 파일을 직접 사용하는 사용자에게 영향을 미칩니다. .mysql_historyMariaDB 또는 MySQL 애플리케이션에서 관리하는 파일이며 사용자는 파일에서 직접 작업해서는 안 됩니다. 사람이 읽을 수 있는 모양은 무의미합니다.

    참고

    보안을 강화하기 위해 기록 파일을 유지하지 않는 것이 좋습니다. 명령 기록 기록을 비활성화하려면 다음을 수행합니다.

    1. 있는 경우 .mysql_history 파일을 제거합니다.
    2. 다음 방법 중 하나를 사용합니다.

      • MYSQL_HISTFILE 변수를 /dev/null 로 설정하고 이 설정을 쉘의 시작 파일에 포함합니다.
      • /dev/null 로 심볼릭 링크로 .mysql_history 파일을 변경합니다.

        $ ln -s /dev/null $HOME/.mysql_history

MariaDB Galera Cluster 가 다음과 같은 주요 변경 사항으로 버전 4로 업그레이드되었습니다.

  • Galera 는 무제한 크기의 트랜잭션 복제를 지원하는 새로운 스트리밍 복제 기능을 추가합니다. 스트리밍 복제를 실행하는 동안 클러스터는 작은 조각으로 트랜잭션을 복제합니다.
  • Galera 는 이제 글로벌 트랜잭션 ID(GTID)를 완벽하게 지원합니다.
  • /etc/my.cnf.d/galera.cnf 파일의 wsrep_on 옵션의 기본값이 1 에서 0 으로 변경되어 추가 옵션을 구성하지 않고 최종 사용자가 wsrep 복제를 시작하지 않습니다.

MariaDB 10.5 의 PAM 플러그인 변경 사항은 다음과 같습니다.

  • MariaDB 10.5 에서는 새 버전의 PAM(Pluggable Authentication Modules) 플러그인을 추가합니다. PAM 플러그인 버전 2.0은 MariaDB 가 추가 PAM 모듈을 사용할 수 있도록 별도의 setuid root helper 바이너리를 사용하여 PAM 인증을 수행합니다.
  • 도우미 바이너리는 mysql 그룹의 사용자만 실행할 수 있습니다. 기본적으로 그룹에는 mysql 사용자만 포함되어 있습니다. Red Hat은 이 도우미 유틸리티를 통해 액세스하거나 로깅하지 않고 관리자가 mysql 그룹에 사용자를 추가하지 않도록 권장합니다.
  • MariaDB 10.5 에서는 PAM(Pluggable Authentication Modules) 플러그인과 관련 파일이 새 패키지 mariadb-pam 으로 이동되었습니다. 결과적으로 MariaDB 에 PAM 인증을 사용하지 않는 새로운 setuid root 바이너리가 시스템에 소개되지 않았습니다.
  • mariadb-pam 패키지에는 PAM 플러그인 버전이 모두 포함되어 있습니다. 버전 2.0은 기본값이며 버전 1.0은 auth_pam_v1 공유 오브젝트 라이브러리로 사용할 수 있습니다.
  • mariadb-pam 패키지는 기본적으로 MariaDB 서버와 함께 설치되지 않습니다. MariaDB 10.5 에서 PAM 인증 플러그인을 사용하려면 mariadb-pam 패키지를 수동으로 설치합니다.

7.2.7.2. RHEL 8 버전의 MariaDB 10.3에서 MariaDB 10.5로 업그레이드

이 절차에서는 yummariadb -upgrade 유틸리티를 사용하여 mariadb:10.3 모듈 스트림에서 mariadb:10.5 모듈 스트림으로의 업그레이드를 설명합니다.

mariadb-upgrade 유틸리티는 mariadb-server 패키지의 종속성으로 설치된 mariadb-server- utils 하위 패키지에서 제공합니다.

사전 요구 사항

  • 업그레이드를 수행하기 전에 MariaDB 데이터베이스에 저장된 모든 데이터를 백업합니다.

절차

  1. MariaDB 서버를 중지합니다.

    # systemctl stop mariadb.service
  2. 다음 명령을 실행하여 시스템이 이후 스트림으로 전환할 준비가 되었는지 확인합니다.

    # yum distro-sync

    이 명령은 필요한 작업 없음 메시지로 끝나야 합니다. 완료되었습니다! 자세한 내용은 다음 스트림으로 전환을 참조하십시오.

  3. 시스템에서 mariadb 모듈을 재설정합니다.

    # yum module reset mariadb
  4. mariadb:10.5 모듈 스트림을 활성화합니다.

    # yum module enable mariadb:10.5
  5. 설치된 패키지를 동기화하여 스트림 간 변경을 수행합니다.

    # yum distro-sync

    그러면 설치된 모든 MariaDB 패키지가 업데이트됩니다.

  6. /etc/my.cnf.d/ 에 있는 옵션 파일에 MariaDB 10.5 에 유효한 옵션만 포함하도록 구성을 조정합니다. 자세한 내용은 MariaDB 10.4 및 MariaDB 10.5 의 업스트림 문서를 참조하십시오.
  7. MariaDB 서버를 시작합니다.

    • 독립 실행형으로 데이터베이스를 업그레이드하는 경우:

      # systemctl start mariadb.service
    • Galera 클러스터 노드를 업그레이드하는 경우 다음을 수행합니다.

      # galera_new_cluster

      mariadb 서비스가 자동으로 시작됩니다.

  8. mariadb-upgrade 유틸리티를 실행하여 내부 테이블을 확인하고 복구합니다.

    • 독립 실행형으로 데이터베이스를 업그레이드하는 경우:

      # mariadb-upgrade
    • Galera 클러스터 노드를 업그레이드하는 경우 다음을 수행합니다.

      # mariadb-upgrade --skip-write-binlog
중요

즉각적 업그레이드와 관련하여 특정 위험 및 알려진 문제가 있습니다. 예를 들어 일부 쿼리가 작동하지 않거나 업그레이드 전과 다른 순서로 실행됩니다. 이러한 위험 및 문제에 대한 자세한 내용과 인플레이스 업그레이드에 대한 일반적인 정보는 MariaDB 10.5 릴리스 노트 를 참조하십시오.

7.2.8. Galera를 사용하여 MariaDB 복제

이 섹션에서는 Red Hat Enterprise Linux 8에서 Galera 솔루션을 사용하여 MariaDB 데이터베이스를 복제하는 방법을 설명합니다.

7.2.8.1. MariaDB Galera 클러스터 소개

Galera 복제는 여러 MariaDB 서버로 구성된 동기식 멀티 소스 MariaDB Galera 클러스터 생성을 기반으로 합니다. 일반적으로 복제본이 읽기 전용인 기존의 기본/복제 설정과 달리 MariaDB Galera 클러스터의 노드는 모두 쓸 수 있습니다.

Galera 복제와 MariaDB 데이터베이스 간의 인터페이스는 쓰기 세트 복제 API(wsrep API)로 정의됩니다.

MariaDB Galera 클러스터의 주요 기능은 다음과 같습니다.

  • 동기 복제
  • 액티브-액티브 멀티 소스 토폴로지
  • 클러스터 노드에 읽기 및 쓰기
  • 자동 멤버십 제어, 클러스터에서 실패한 노드 삭제
  • 자동 노드 결합
  • 행 수준에서 병렬 복제
  • 직접 클라이언트 연결: 사용자가 클러스터 노드에 로그온하고 복제가 실행되는 동안 노드에서 직접 작업할 수 있습니다.

동기 복제는 서버와 관련된 쓰기 집합을 클러스터의 모든 노드에 브로드캐스트하여 커밋 시 트랜잭션을 복제함을 의미합니다. 클라이언트(사용자 애플리케이션)는 기본 MariaDB 와 유사한 DBMS(데이터베이스 관리 시스템)에 직접 연결됩니다.

동기 복제를 사용하면 클러스터의 한 노드에서 동시에 발생한 변경 사항이 클러스터의 다른 노드에서 동시에 수행됩니다.

따라서 동기 복제는 비동기 복제에 비해 다음과 같은 이점이 있습니다.

  • 특정 클러스터 노드 간의 변경 사항을 전파하는 데 지연 없음
  • 모든 클러스터 노드는 항상 일관성이 유지됩니다.
  • 클러스터 노드 중 하나가 충돌하면 최신 변경 사항이 손실되지 않습니다.
  • 모든 클러스터 노드의 트랜잭션이 병렬로 실행됩니다.
  • 전체 클러스터의 원인

7.2.8.2. MariaDB Galera Cluster를 빌드하기 위한 구성 요소

MariaDB Galera 클러스터를 빌드하려면 시스템에 다음 패키지를 설치해야 합니다.

  • mariadb-server-galera - MariaDB Galera 클러스터에 대한 지원 파일 및 스크립트를 포함합니다.
  • mariadb-server - 쓰기 세트 복제 API(wsrep API)를 포함하도록 MariaDB 업스트림에서 패치합니다. 이 API는 Galera 복제와 MariaDB 간의 인터페이스를 제공합니다.
  • Galera - MariaDB를 완벽하게 지원하기 위해 MariaDB 업스트림에서 패치했습니다. galera 패키지에는 다음이 포함됩니다.

    • Galera Replication Library 는 전체 복제 기능을 제공합니다.
    • Galera Arbitrator 유틸리티를 분리 장애 시나리오의 투표에 참여하는 클러스터 멤버로 사용할 수 있습니다. 그러나 Galera Arbitrator 는 실제 복제에 참여할 수 없습니다.
    • Galera Systemd 서비스Galera 래퍼 스크립트 ( Galera), Galera Arbitrator 유틸리티를 배포하는 데 사용됩니다. RHEL 8의 MariaDB 10.3 및 MariaDB 10.5에는 각각 /usr/lib/systemd/system/garbd.service/usr/sbin/garbd-wrapper 파일의 Red Hat 버전의 garbd systemd 서비스 및 래퍼 스크립트가 포함되어 있습니다. RHEL 8.6, MariaDB 10.3 및 MariaDB 10.5부터 이제 /usr/share/doc/galera/garb-systemd/usr/share/doc/galera/garbd.service 에 있는 이러한 파일의 업스트림 버전도 제공합니다.

7.2.8.3. MariaDB Galera 클러스터 배포

사전 요구 사항

  • mariadb 모듈에서 스트림(버전)을 선택하고 galera 프로필을 지정하여 MariaDB Galera Cluster 패키지를 설치합니다. 예를 들면 다음과 같습니다.

    # yum module install mariadb:10.3/galera

    결과적으로 다음 패키지가 설치됩니다.

    • mariadb-server-galera
    • mariadb-server
    • galera

      mariadb-server-galera 패키지는 mariadb-servergalera 패키지를 종속성으로 가져옵니다.

      MariaDB Galera Cluster 를 빌드하기 위해 설치해야 하는 패키지에 대한 자세한 내용은 MariaDB 클러스터 빌드용 구성 요소를 참조하십시오.

  • MariaDB 서버 복제 구성은 시스템을 클러스터에 처음 추가하기 전에 업데이트해야 합니다.

    기본 구성은 /etc/my.cnf.d/galera.cnf 파일에 배포됩니다.

    MariaDB Galera 클러스터를 배포하기 전에 /etc/my.cnf.d/galera.cnf 파일에서 다음 문자열로 시작하도록 wsrep_cluster_address 옵션을 설정합니다.

    gcomm://
    • 초기 노드의 경우 wsrep_cluster_address 를 빈 목록으로 설정할 수 있습니다.

      wsrep_cluster_address="gcomm://"
    • 다른 모든 노드의 경우 실행 중인 클러스터의 일부인 모든 노드의 주소를 포함하도록 wsrep_cluster_address 를 설정합니다. 예를 들면 다음과 같습니다.

      wsrep_cluster_address="gcomm://10.0.0.10"

      Galera Cluster 주소를 설정하는 방법에 대한 자세한 내용은 Galera Cluster Address 를 참조하십시오.

절차

  1. 해당 노드에서 다음 래퍼를 실행하여 새 클러스터의 첫 번째 노드를 부트스트랩합니다.

    # galera_new_cluster

    이 래퍼는 MariaDB 서버 데몬(mysqld)이 --wsrep-new-cluster 옵션과 함께 실행되도록 합니다. 이 옵션은 연결할 기존 클러스터가 없는 정보를 제공합니다. 따라서 노드는 새 클러스터를 식별하기 위해 새 UUID를 만듭니다.

    참고

    mariadb 서비스는 여러 MariaDB 서버 프로세스와 상호 작용하는 systemd 방법을 지원합니다. 따라서 MariaDB 서버가 여러 개 있는 경우 인스턴스 이름을 접미사로 지정하여 특정 인스턴스를 부트스트랩할 수 있습니다.

    # galera_new_cluster mariadb@node1
  2. 각 노드에서 다음 명령을 실행하여 다른 노드를 클러스터에 연결합니다.

    # systemctl start mariadb

    결과적으로 노드가 클러스터에 연결되고 클러스터 상태와 자체 동기화됩니다.

7.2.8.4. MariaDB Galera 클러스터에 새 노드 추가

MariaDB Galera 클러스터에 새 노드를 추가하려면 다음 절차를 사용합니다.

이 절차를 사용하여 기존 노드를 다시 연결할 수도 있습니다.

절차

  • 특정 노드에서 /etc/my.cnf.d/galera.cnf 구성 파일의 [mariadb] 섹션에 있는 wsrep_cluster_address 옵션에 있는 하나 이상의 기존 클러스터 구성원에게 주소를 제공하십시오.

    [mariadb]
    wsrep_cluster_address="gcomm://192.168.0.1"

    새 노드가 기존 클러스터 노드 중 하나에 연결되면 클러스터의 모든 노드를 볼 수 있습니다.

    그러나 클러스터의 모든 노드를 wsrep_cluster_address 에 나열하는 것이 좋습니다.

    결과적으로 하나 이상의 클러스터 노드가 중단된 경우에도 모든 노드가 다른 클러스터 노드에 연결하여 클러스터에 참여할 수 있습니다. 모든 멤버가 멤버십에 동의하면 클러스터 상태가 변경됩니다. 새 노드의 상태가 클러스터 상태와 다른 경우 새 노드는 증분 상태 전송(IST) 또는 SST(상태 스냅샷 전송)를 요청하여 다른 노드와 일관성을 보장합니다.

7.2.8.5. MariaDB Galera 클러스터 재시작

동시에 모든 노드를 종료하면 클러스터를 중지하고 실행 중인 클러스터가 더 이상 존재하지 않습니다. 그러나 클러스터의 데이터는 여전히 존재합니다.

클러스터를 다시 시작하려면 MariaDB Galera Cluster 구성에 설명된 대로 첫 번째 노드를 부트스트랩합니다.

주의

클러스터가 부트스트랩되지 않고 첫 번째 노드의 mysqldsystemctl start mariadb 명령으로 시작된 경우 노드는 /etc/my.cnf.d/galera.cnf 파일의 wsrep_cluster_address 옵션에 나열된 노드 중 하나 이상에 연결하려고 합니다. 현재 실행 중인 노드가 없으면 재시작이 실패합니다.

7.2.9. MariaDB 클라이언트 애플리케이션 개발

Red Hat은 MariaDB 클라이언트 라이브러리에 대해 MariaDB 클라이언트 애플리케이션을 개발하는 것이 좋습니다.

MariaDB 클라이언트 라이브러리에 대해 애플리케이션을 빌드하는 데 필요한 개발 파일 및 프로그램은 mariadb-connector-c-devel 패키지에서 제공합니다.

직접 라이브러리 이름을 사용하는 대신 mariadb-connector-c-devel 패키지에 배포되는 mariadb_config 프로그램을 사용합니다. 이 프로그램을 통해 올바른 빌드 플래그가 반환됩니다.

7.3. MySQL 사용

MySQL 서버는 빠르고 강력한 오픈 소스 데이터베이스 서버입니다. MySQL 은 데이터를 구조화된 정보로 변환하고 데이터에 액세스하기 위한 SQL 인터페이스를 제공하는 관계형 데이터베이스입니다. 여기에는 여러 스토리지 엔진 및 플러그인, GIS(지리적 정보 시스템) 및 JSON(JavaScript Object Notation) 기능이 포함됩니다.

RHEL 시스템에 MySQL 을 설치하고 구성하는 방법, MySQL 데이터를 백업하는 방법, 이전 MySQL 버전에서 마이그레이션하는 방법, MySQL 을 복제하는 방법을 알아봅니다.

7.3.1. MySQL 설치

RHEL 8에서 MySQL 8.0 서버는 mysql:8.0 모듈 스트림으로 사용할 수 있습니다.

MySQL 을 설치하려면 다음 절차를 사용하십시오.

절차

  1. mysql 모듈에서 8.0 스트림(버전)을 선택하고 server 프로필을 지정하여 MySQL 서버 패키지를 설치합니다.

    # yum module install mysql:8.0/server
  2. mysqld 서비스를 시작합니다.

    # systemctl start mysqld.service
  3. 부팅 시 mysqld 서비스가 시작되도록 활성화합니다.

    # systemctl enable mysqld.service
  4. 권장 사항: MySQL 을 설치할 때 보안을 강화하려면 다음 명령을 실행합니다.

    $ mysql_secure_installation

    명령은 완전히 대화형 스크립트를 시작하여 프로세스의 각 단계에 대한 메시지를 표시합니다. 이 스크립트를 사용하면 다음과 같은 방법으로 보안을 강화할 수 있습니다.

    • root 계정의 암호 설정
    • 익명 사용자 제거
    • 원격 root 로그인 허용 (로컬 호스트 내부)
참고

충돌하는 RPM 패키지로 인해 RHEL 8에서 MySQLMariaDB 데이터베이스 서버를 병렬로 설치할 수 없습니다. RHEL 7용 Red Hat Software Collections에서는 구성 요소의 병렬 설치가 가능합니다. RHEL 8에서는 컨테이너에서 다른 버전의 데이터베이스 서버를 사용할 수 있습니다.

7.3.2. MySQL 구성

네트워킹을 위해 MySQL 서버를 구성하려면 다음 절차를 사용하십시오.

절차

  1. /etc/my.cnf.d/mysql-server.cnf 파일의 [mysqld] 섹션을 편집합니다. 다음 구성 지시문을 설정할 수 있습니다.

    • bind-address - 서버가 수신 대기하는 주소입니다. 가능한 옵션은 다음과 같습니다.

      • 호스트 이름
      • IPv4 주소
      • IPv6 주소
    • skip-networking - 서버가 TCP/IP 연결을 수신하는지 여부를 제어합니다. 가능한 값은 다음과 같습니다.

      • 0 - 모든 클라이언트 수신 대기
      • 1 - 로컬 클라이언트만 수신 대기
    • 포트 - MySQL 이 TCP/IP 연결을 수신 대기하는 포트입니다.
  2. mysqld 서비스를 다시 시작합니다.

    # systemctl restart mysqld.service

7.3.3. MySQL 서버에서 TLS 암호화 설정

기본적으로 MySQL 은 암호화되지 않은 연결을 사용합니다. 보안 연결의 경우 MySQL 서버에서 TLS 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성합니다.

7.3.3.1. MySQL 서버에 CA 인증서, 서버 인증서 및 개인 키 배치

MySQL 서버에서 TLS 암호화를 활성화하려면 먼저 CA(인증 기관) 인증서, 서버 인증서 및 MySQL 서버에 개인 키를 저장합니다.

사전 요구 사항

  • Privacy Enhanced Mail (PEM) 형식의 다음 파일이 서버에 복사되었습니다.

    • 서버의 개인 키: server.example.com.key.pem
    • 서버 인증서: server.example.com.crt.pem
    • CA(인증 기관) 인증서: ca.crt.pem

    개인 키 및 CSR(인증서 서명 요청) 생성 및 CA에서 인증서 요청에 대한 자세한 내용은 CA 문서를 참조하십시오.

절차

  1. CA 및 서버 인증서를 /etc/pki/tls/certs/ 디렉터리에 저장합니다.

    # mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/
    # mv <path>/ca.crt.pem /etc/pki/tls/certs/
  2. MySQL 서버가 파일을 읽을 수 있도록 하는 CA 및 서버 인증서에 대한 권한을 설정합니다.

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem

    인증서는 보안 연결을 설정하기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 검색할 수 있습니다. 따라서 CA 및 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.

  3. 서버의 개인 키를 /etc/pki/tls/private/ 디렉터리에 저장합니다.

    # mv <path>/server.example.com.key.pem /etc/pki/tls/private/
  4. 서버의 개인 키에 보안 권한을 설정합니다.

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem

    권한이 없는 사용자가 개인 키에 액세스할 수 있는 경우 MySQL 서버에 대한 연결이 더 이상 안전하지 않습니다.

  5. SELinux 컨텍스트를 복원하십시오.

    # restorecon -Rv /etc/pki/tls/

7.3.3.2. MySQL 서버에서 TLS 구성

보안을 강화하려면 MySQL 서버에서 TLS 지원을 활성화합니다. 결과적으로 클라이언트는 TLS 암호화를 사용하여 서버로 데이터를 전송할 수 있습니다.

사전 요구 사항

  • MySQL 서버를 설치했습니다.
  • mysqld 서비스가 실행 중입니다.
  • Privacy Enhanced Mail (PEM) 형식의 다음 파일은 서버에 있으며 mysql 사용자가 읽을 수 있습니다.

    • 서버의 개인 키: /etc/pki/tls/private/server.example.com.key.pem
    • 서버 인증서: /etc/pki/tls/certs/server.example.com.crt.pem
    • CA(인증 기관) 인증서 /etc/pki/tls/certs/ca.crt.pem
  • 서버 인증서의 주체 고유 이름(DN) 또는 subject alternatives name(SAN) 필드는 서버의 호스트 이름과 일치합니다.

절차

  1. /etc/my.cnf.d/mysql-server-tls.cnf 파일을 만듭니다.

    1. 다음 콘텐츠를 추가하여 개인 키, 서버 및 CA 인증서에 대한 경로를 구성합니다.

      [mysqld]
      ssl_key = /etc/pki/tls/private/server.example.com.key.pem
      ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem
      ssl_ca = /etc/pki/tls/certs/ca.crt.pem
    2. CRL(Certificate Revocation List)이 있는 경우 이를 사용하도록 MySQL 서버를 구성합니다.

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
    3. 선택 사항: 암호화 없이 연결 시도를 거부합니다. 이 기능을 활성화하려면 다음을 추가합니다.

      require_secure_transport = on
    4. 선택 사항: 서버가 지원해야 하는 TLS 버전을 설정합니다. 예를 들어 TLS 1.2 및 TLS 1.3을 지원하려면 다음을 추가합니다.

      tls_version = TLSv1.2,TLSv1.3

      기본적으로 서버는 TLS 1.1, TLS 1.2 및 TLS 1.3을 지원합니다.

  2. mysqld 서비스를 다시 시작합니다.

    # systemctl restart mysqld

검증

문제 해결을 간소화하려면 TLS 암호화를 사용하도록 로컬 클라이언트를 구성하기 전에 MySQL 서버에서 다음 단계를 수행합니다.

  1. 이제 MySQL 에 TLS 암호화가 활성화되어 있는지 확인합니다.

    # mysql -u root -p -h <MySQL_server_hostname> -e "SHOW session status LIKE 'Ssl_cipher';"
    +---------------+------------------------+
    | Variable_name | Value                  |
    +---------------+------------------------+
    | Ssl_cipher    | TLS_AES_256_GCM_SHA384 |
    +---------------+------------------------+
  2. 특정 TLS 버전만 지원하도록 MySQL 서버를 구성한 경우 tls_version 변수를 표시합니다.

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | tls_version   | TLSv1.2,TLSv1.3 |
    +---------------+-----------------+
  3. 서버가 올바른 CA 인증서, 서버 인증서 및 개인 키 파일을 사용하는지 확인합니다.

    # mysql -u root -e "SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '^ssl_ca|^ssl_cert|^ssl_key';"
    +-----------------+-------------------------------------------------+
    | Variable_name   | Value                                           |
    +-----------------+-------------------------------------------------+
    | ssl_ca          | /etc/pki/tls/certs/ca.crt.pem                   |
    | ssl_capath      |                                                 |
    | ssl_cert        | /etc/pki/tls/certs/server.example.com.crt.pem   |
    | ssl_key         | /etc/pki/tls/private/server.example.com.key.pem |
    +-----------------+-------------------------------------------------+

7.3.3.3. 특정 사용자 계정에 대해 TLS 암호화 연결 필요

중요한 데이터에 액세스할 수 있는 사용자는 항상 TLS 암호화 연결을 사용하여 네트워크를 통해 암호화되지 않은 데이터를 전송하지 않도록 해야 합니다.

모든 연결(에서 required_secure_transport =)에 보안 전송이 필요한서버에서 를 구성할 수 없는 경우 TLS 암호화가 필요하도록 개별 사용자 계정을 구성합니다.

사전 요구 사항

  • MySQL 서버에는 TLS 지원이 활성화되어 있습니다.
  • 보안 전송을 요구하도록 구성하는 사용자가 있습니다.
  • CA 인증서는 클라이언트에 저장됩니다.

절차

  1. 관리 사용자로 MySQL 서버에 연결합니다.

    # mysql -u root -p -h server.example.com

    관리 사용자에게 원격으로 서버에 액세스할 수 있는 권한이 없는 경우 MySQL 서버에서 명령을 수행하고 localhost 에 연결합니다.

  2. REQUIRE SSL 절을 사용하여 사용자가 TLS 암호화 연결을 사용하여 연결해야 함을 적용합니다.

    MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;

검증

  1. TLS 암호화를 사용하여 서버에 예제 사용자로 연결합니다.

    # mysql -u example -p -h server.example.com
    ...
    MySQL [(none)]>

    오류가 표시되지 않고 대화형 MySQL 콘솔에 액세스할 수 있는 경우 TLS와의 연결에 성공합니다.

    기본적으로 클라이언트는 서버에서 제공하는 경우 TLS 암호화를 자동으로 사용합니다. 따라서 --ssl-ca=ca.crt.pem--ssl-mode=VERIFY_IDENTITY 옵션은 필요하지 않지만 이러한 옵션을 사용하여 클라이언트는 서버 ID를 확인하므로 보안을 개선합니다.

  2. TLS가 비활성화된 예제 사용자로 연결을 시도합니다.

    # mysql -u example -p -h server.example.com --ssl-mode=DISABLED
    ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)

    이 사용자에게는 TLS가 필요하지만 비활성화됨(--ssl-mode=DISABLED)이므로 서버에서 로그인 시도를 거부했습니다.

7.3.4. MySQL 클라이언트에서 CA 인증서 검증으로 TLS 암호화 글로벌 활성화

MySQL 서버가 TLS 암호화를 지원하는 경우 보안 연결만 설정하고 서버 인증서를 확인하도록 클라이언트를 구성합니다. 다음 절차에서는 서버에 있는 모든 사용자에 대해 TLS 지원을 활성화하는 방법을 설명합니다.

7.3.4.1. 기본적으로 TLS 암호화를 사용하도록 MySQL 클라이언트 구성

RHEL에서 MySQL 클라이언트가 TLS 암호화를 사용하도록 전역적으로 구성하고 서버 인증서의 CN(일반 이름)이 사용자가 연결하는 호스트 이름과 일치하는지 확인할 수 있습니다. 따라서 메시지 가로채기(man-in-the-middle) 공격을 방지합니다.

사전 요구 사항

  • MySQL 서버에는 TLS 지원이 활성화되어 있습니다.
  • CA 인증서는 클라이언트의 /etc/pki/tls/certs/ca.crt.pem 파일에 저장됩니다.

절차

  • 다음 콘텐츠를 사용하여 /etc/my.cnf.d/mysql-client-tls.cnf 파일을 만듭니다.

    [client]
    ssl-mode=VERIFY_IDENTITY
    ssl-ca=/etc/pki/tls/certs/ca.crt.pem

    이러한 설정은 MySQL 클라이언트가 TLS 암호화를 사용하고 클라이언트가 서버 인증서의 CN(ssl-mode=VERIFY_IDENTITY)과 호스트 이름을 비교함을 정의합니다. 또한 CA 인증서의 경로를 지정합니다(ssl-ca).

검증

  • 호스트 이름을 사용하여 서버에 연결하고 서버 상태를 표시합니다.

    # mysql -u root -p -h server.example.com -e status
    ...
    SSL:        Cipher in use is TLS_AES_256_GCM_SHA384

    SSL 항목에 사용 중 암호화가 있는 경우..., 연결이 암호화됩니다.

    이 명령에서 사용하는 사용자에게는 원격으로 인증할 수 있는 권한이 있습니다.

    연결하는 호스트 이름이 서버의 TLS 인증서의 호스트 이름과 일치하지 않으면 ssl-mode=VERIFY_IDENTITY 매개변수로 인해 연결이 실패합니다. 예를 들어 localhost 에 연결하는 경우 :

    # mysql -u root -p -h localhost -e status
    ERROR 2026 (HY000): SSL connection error: error:0A000086:SSL routines::certificate verify failed

추가 리소스

  • mysql(1) 도움말 페이지의 --ssl* 매개 변수 설명.

7.3.5. MySQL 데이터 백업

Red Hat Enterprise Linux 8의 MySQL 데이터베이스에서 데이터를 백업하는 방법에는 두 가지가 있습니다.

  • 논리적 백업
  • 물리적 백업

논리적 백업 은 데이터를 복원하는 데 필요한 SQL 문으로 구성됩니다. 이러한 유형의 백업은 일반 텍스트 파일로 정보와 레코드를 내보냅니다.

물리적 백업보다 논리적 백업의 주요 장점은 이식성과 유연성입니다. 데이터는 물리적 백업에서 사용할 수 없는 다른 하드웨어 구성, MySQL 버전 또는 DBMS(데이터베이스 관리 시스템)에서 복원할 수 있습니다.

mysqld.service 가 실행 중인 경우 논리적 백업을 수행할 수 있습니다. 논리적 백업에는 로그 및 구성 파일이 포함되지 않습니다.

물리적 백업 은 콘텐츠를 저장하는 파일과 디렉토리의 복사본으로 구성됩니다.

물리적 백업은 논리적 백업과 비교하여 다음과 같은 이점이 있습니다.

  • 출력이 더 작습니다.
  • 백업은 크기가 작습니다.
  • 백업 및 복원 속도가 빨라집니다.
  • 백업에는 로그 및 구성 파일이 포함됩니다.

mysqld.service 가 실행 중이 아니거나 백업 중 변경되지 않도록 데이터베이스의 모든 테이블이 잠길 때 물리적 백업을 수행해야 합니다.

다음 MySQL 백업 접근법 중 하나를 사용하여 MySQL 데이터베이스에서 데이터를 백업할 수 있습니다.

  • mysqldump를 사용한 논리적 백업
  • 파일 시스템 백업
  • 백업 솔루션으로의 복제

7.3.5.1. mysqldump를 사용하여 논리적 백업 수행

mysqldump 클라이언트는 백업 또는 다른 데이터베이스 서버로 전송을 위해 데이터베이스 또는 데이터베이스 컬렉션을 덤프하는 데 사용할 수 있는 백업 유틸리티입니다. mysqldump 의 출력은 일반적으로 서버 테이블 구조를 다시 생성하거나 데이터로 채우거나 둘 다로 채워지는 SQL 문으로 구성됩니다. mysqldump 는 CSV와 같은 XML 및 구분된 텍스트 형식을 포함하여 다른 형식의 파일을 생성할 수도 있습니다.

mysqldump 백업을 수행하려면 다음 옵션 중 하나를 사용할 수 있습니다.

  • 하나 이상의 선택된 데이터베이스 백업
  • 모든 데이터베이스 백업
  • 하나의 데이터베이스에서 테이블의 하위 집합 백업

절차

  • 단일 데이터베이스를 덤프하려면 다음을 실행합니다.

    # mysqldump [options] --databases db_name > backup-file.sql
  • 한 번에 여러 데이터베이스를 덤프하려면 다음을 실행합니다.

    # mysqldump [options] --databases db_name1 [db_name2 ...] > backup-file.sql
  • 모든 데이터베이스를 덤프하려면 다음을 실행합니다.

    # mysqldump [options] --all-databases > backup-file.sql
  • 하나 이상의 덤프된 전체 데이터베이스를 서버에 다시 로드하려면 다음을 실행합니다.

    # mysql < backup-file.sql
  • 데이터베이스를 원격 MySQL 서버에 로드하려면 다음을 실행합니다.

    # mysql --host=remote_host < backup-file.sql
  • 하나의 데이터베이스에서 리터럴 하위 집합을 덤프하려면 mysqldump 명령 끝에 선택한 테이블 목록을 추가합니다.

    # mysqldump [options] db_name [tbl_name ...​] > backup-file.sql
  • 하나의 데이터베이스에서 덤프된 테이블의 리터럴 하위 집합을 로드하려면 다음을 실행합니다.

    # mysql db_name < backup-file.sql
    참고

    db_name 데이터베이스는 이 시점에 있어야 합니다.

  • mysqldump 에서 지원하는 옵션 목록을 보려면 다음을 실행합니다.

    $ mysqldump --help

7.3.5.2. 파일 시스템 백업 수행

MySQL 데이터 파일의 파일 시스템 백업을 생성하려면 MySQL 데이터 디렉터리의 내용을 백업 위치에 복사합니다.

현재 구성 또는 로그 파일도 백업하려면 다음 절차의 선택적 단계를 사용하십시오.

절차

  1. mysqld 서비스를 중지합니다.

    # systemctl stop mysqld.service
  2. 필요한 위치에 데이터 파일을 복사합니다.

    # cp -r /var/lib/mysql /backup-location
  3. 필요한 경우 구성 파일을 필요한 위치에 복사합니다.

    # cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
  4. 필요한 경우 로그 파일을 필요한 위치에 복사합니다.

    # cp /var/log/mysql/* /backup-location/logs
  5. mysqld 서비스를 시작합니다.

    # systemctl start mysqld.service
  6. 백업 위치에서 /var/lib/mysql 디렉터리에 백업 데이터를 로드할 때 mysql:mysql/var/lib/mysql 에 있는 모든 데이터의 소유자인지 확인하십시오.

    # chown -R mysql:mysql /var/lib/mysql

7.3.5.3. 백업 솔루션으로의 복제

복제는 소스 서버를 위한 대체 백업 솔루션입니다. 소스 서버에서 복제본 서버에 복제하는 경우 소스에 영향을 주지 않고 복제본에서 백업을 실행할 수 있습니다. 복제본을 종료하는 동안 계속 소스를 실행하고 복제본에서 데이터를 백업할 수 있습니다.

MySQL 데이터베이스를 복제하는 방법에 대한 지침은 MySQL 복제를 참조하십시오.

주의

복제 자체는 충분한 백업 솔루션이 아닙니다. 복제는 하드웨어 장애로부터 소스 서버를 보호하지만 데이터 손실에 대한 보호는 보장하지 않습니다. 이 메서드와 함께 복제본에서 다른 백업 솔루션을 사용하는 것이 좋습니다.

추가 리소스

7.3.6. RHEL 8 버전의 MySQL 8.0으로 마이그레이션

RHEL 7에는 MariaDB 5.5MySQL 데이터베이스 제품군에서 서버의 기본 구현으로 포함되어 있습니다. RHEL 7용 Red Hat Software Collections는 MySQL 8.0 과 여러 버전의 MariaDB 를 제공합니다. RHEL 8에서는 MySQL 8.0,MariaDB 10.3MariaDB 10.5 를 제공합니다.

다음 절차에서는 mysql_upgrade 유틸리티를 사용하여 MySQL 8.0 의 Red Hat Software Collections 버전에서 RHEL 8 버전의 MySQL 8.0 으로 마이그레이션하는 방법을 설명합니다. mysql_upgrade 유틸리티는 mysql-server 패키지에서 제공합니다.

참고

MySQL 의 Red Hat Software Collections 버전에서 소스 데이터 디렉터리는 /var/opt/rh/rh-mysql80/lib/mysql/ 입니다. RHEL 8에서 MySQL 데이터는 /var/lib/mysql/ 디렉터리에 저장됩니다.

사전 요구 사항

  • 업그레이드를 수행하기 전에 MySQL 데이터베이스에 저장된 모든 데이터를 백업합니다.

절차

  1. mysql-server 패키지가 RHEL 8 시스템에 설치되었는지 확인합니다.

    # yum install mysql-server
  2. 데이터를 복사할 때 mysqld 서비스가 소스 및 대상 시스템에서 실행되고 있지 않은지 확인합니다.

    # systemctl stop mysqld.service
  3. RHEL 7 소스 시스템의 /var/opt/rh/rh-mysql80/mysql/ 디렉터리에서 RHEL 8 대상 시스템의 /var/lib/mysql/ 디렉터리에 데이터를 복사합니다.
  4. 대상 시스템에서 복사된 파일에 대한 적절한 권한 및 SELinux 컨텍스트를 설정합니다.

    # restorecon -vr /var/lib/mysql
  5. mysql:mysql/var/lib/mysql 디렉터리에 있는 모든 데이터의 소유자인지 확인합니다.

    # chown -R mysql:mysql /var/lib/mysql
  6. 대상 시스템에서 MySQL 서버를 시작합니다.

    # systemctl start mysqld.service

    참고: 이전 버전의 MySQL 에서는 내부 테이블을 확인하고 복구하는 데 mysql_upgrade 명령이 필요했습니다. 이제 서버를 시작할 때 자동으로 수행됩니다.

7.3.7. MySQL 복제

MySQL 은 기본에서 고급까지 복제를 위한 다양한 구성 옵션을 제공합니다. 이 섹션에서는 GTID(Global transaction Identifiers)를 사용하여 새로 설치된 MySQL 서버에서 MySQL 에서 복제하는 트랜잭션 기반 방법에 대해 설명합니다. GTID를 사용하면 트랜잭션 식별 및 일관성 확인이 간소화됩니다.

MySQL 에서 복제를 설정하려면 다음을 수행해야 합니다.

중요

복제에 기존 MySQL 서버를 사용하려면 먼저 데이터를 동기화해야 합니다. 자세한 내용은 업스트림 문서 를 참조하십시오.

7.3.7.1. MySQL 소스 서버 구성

MySQL 소스 서버에 필요한 구성 옵션을 설정하여 데이터베이스 서버에서 수행된 모든 변경 사항을 올바르게 실행하고 복제할 수 있습니다.

사전 요구 사항

  • 소스 서버가 설치되어 있어야 합니다.

절차

  1. [mysqld] 섹션의 /etc/my.cnf.d/mysql-server.cnf 파일에 다음 옵션을 포함합니다.

    • bind-address=source_ip_adress

      이 옵션은 복제본에서 소스로 구성된 연결에 필요합니다.

    • server-id=id

      id 는 고유해야 합니다.

    • log_bin=path_to_source_server_log

      이 옵션은 MySQL 소스 서버의 바이너리 로그 파일의 경로를 정의합니다. 예: log_bin=/var/log/mysql/mysql-bin.log.

    • gtid_mode=ON

      이 옵션을 사용하면 서버에서 글로벌 트랜잭션 식별자(GTID)를 사용할 수 있습니다.

    • enforce-gtid-consistency=ON

      서버는 GTID를 사용하여 안전하게 로깅할 수 있는 문만 실행할 수 있도록 하여 GTID 일관성을 적용합니다.

    • Optional: binlog_do_db=db_name

      선택한 데이터베이스만 복제하려면 이 옵션을 사용합니다. 두 개 이상의 선택된 데이터베이스를 복제하려면 각 데이터베이스를 별도로 지정합니다.

      binlog_do_db=db_name1
      binlog_do_db=db_name2
      binlog_do_db=db_name3
    • Optional: binlog_ignore_db=db_name

      복제에서 특정 데이터베이스를 제외하려면 이 옵션을 사용합니다.

  2. mysqld 서비스를 다시 시작합니다.

    # systemctl restart mysqld.service

7.3.7.2. MySQL 복제본 서버 구성

MySQL 복제본 서버에 필요한 구성 옵션을 설정하여 복제를 성공적으로 수행할 수 있습니다.

사전 요구 사항

  • 복제본 서버가 설치되어 있어야 합니다.

절차

  1. [mysqld] 섹션의 /etc/my.cnf.d/mysql-server.cnf 파일에 다음 옵션을 포함합니다.

    • server-id=id

      id 는 고유해야 합니다.

    • relay-log=path_to_replica_server_log

      릴레이 로그는 복제 중에 MySQL 복제본 서버에서 생성한 로그 파일 집합입니다.

    • log_bin=path_to_replica_sever_log

      이 옵션은 MySQL 복제본 서버의 바이너리 로그 파일에 대한 경로를 정의합니다. 예: log_bin=/var/log/mysql/mysql-bin.log.

      이 옵션은 복제본에 필요하지 않지만 강력히 권장됩니다.

    • gtid_mode=ON

      이 옵션을 사용하면 서버에서 글로벌 트랜잭션 식별자(GTID)를 사용할 수 있습니다.

    • enforce-gtid-consistency=ON

      서버는 GTID를 사용하여 안전하게 로깅할 수 있는 문만 실행할 수 있도록 하여 GTID 일관성을 적용합니다.

    • log-replica-updates=ON

      이 옵션을 사용하면 소스 서버에서 수신한 업데이트가 복제본의 바이너리 로그에 기록됩니다.

    • skip-replica-start=ON

      이 옵션을 사용하면 복제본 서버가 복제 서버가 시작될 때 복제 스레드를 시작하지 않습니다.

    • Optional: binlog_do_db=db_name

      특정 데이터베이스만 복제하려면 이 옵션을 사용합니다. 두 개 이상의 데이터베이스를 복제하려면 각 데이터베이스를 별도로 지정합니다.

      binlog_do_db=db_name1
      binlog_do_db=db_name2
      binlog_do_db=db_name3
    • Optional: binlog_ignore_db=db_name

      복제에서 특정 데이터베이스를 제외하려면 이 옵션을 사용합니다.

  2. mysqld 서비스를 다시 시작합니다.

    # systemctl restart mysqld.service

7.3.7.3. MySQL 소스 서버에서 복제 사용자 생성

복제 사용자를 생성하고 복제 트래픽에 필요한 이 사용자 권한을 부여해야 합니다. 다음 절차에서는 적절한 권한이 있는 복제 사용자를 만드는 방법을 설명합니다. 소스 서버에서만 이 단계를 실행합니다.

사전 요구 사항

절차

  1. 복제 사용자를 생성합니다.

    mysql> CREATE USER 'replication_user'@'replica_server_ip' IDENTIFIED WITH mysql_native_password BY 'password';
  2. 사용자 복제 권한을 부여합니다.

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_ip';
  3. MySQL 데이터베이스에서 부여 테이블을 다시 로드합니다.

    mysql> FLUSH PRIVILEGES;
  4. 소스 서버를 읽기 전용 상태로 설정합니다.

    mysql> SET @@GLOBAL.read_only = ON;

7.3.7.4. 소스 서버에 복제본 서버 연결

MySQL 복제본 서버에서는 소스 서버의 자격 증명과 주소를 구성해야 합니다. 다음 절차에 따라 복제본 서버를 구현합니다.

사전 요구 사항

절차

  1. 복제본 서버를 읽기 전용 상태로 설정합니다.

    mysql> SET @@GLOBAL.read_only = ON;
  2. 복제 소스를 구성합니다.

    mysql> CHANGE REPLICATION SOURCE TO
        -> SOURCE_HOST='source_ip_address',
        -> SOURCE_USER='replication_user',
        -> SOURCE_PASSWORD='password',
        -> SOURCE_AUTO_POSITION=1;
  3. MySQL 복제본 서버에서 복제본 스레드를 시작합니다.

    mysql> START REPLICA;
  4. 소스 및 복제본 서버 둘 다에서 읽기 전용 상태를 설정 해제합니다.

    mysql> SET @@GLOBAL.read_only = OFF;
  5. 선택 사항: 디버깅 목적으로 복제본 서버의 상태를 검사합니다.

    mysql> SHOW REPLICA STATUS\G;
    참고

    복제본 서버가 시작하거나 연결하는 데 실패하면 SHOW MASTER STATUS 명령의 출력에 표시된 바이너리 로그 파일 위치에 따라 특정 이벤트 수를 건너뛸 수 있습니다. 예를 들어 정의된 위치에서 첫 번째 이벤트를 건너뛰십시오.

    mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

    복제 서버를 다시 시작합니다.

  6. 선택 사항: 복제본 서버에서 복제본 스레드를 중지합니다.

    mysql> STOP REPLICA;

7.3.7.5. 검증 단계

  1. 소스 서버에서 예제 데이터베이스를 생성합니다.

    mysql> CREATE DATABASE test_db_name;
  2. test_db_name 데이터베이스가 복제본 서버에 복제되는지 확인합니다.
  3. 소스 또는 복제본 서버에서 다음 명령을 실행하여 MySQL 서버의 바이너리 로그 파일에 대한 상태 정보를 표시합니다.

    mysql> SHOW MASTER STATUS;

    소스에서 실행되는 트랜잭션에 대한 GTID 집합을 표시하는 Executed_Gtid_Set 열은 비어 있지 않아야 합니다.

    참고

    복제본 서버에서 SHOW SLAVE STATUS 를 사용할 때 동일한 GTID 세트가 Executed_Gtid_Set 행에 표시됩니다.

7.3.7.6. 추가 리소스

7.3.8. MySQL 클라이언트 애플리케이션 개발

Red Hat은 MariaDB 클라이언트 라이브러리에 대해 MySQL 클라이언트 애플리케이션을 개발하는 것이 좋습니다. 클라이언트와 서버 간의 통신 프로토콜은 MariaDBMySQL 간에 호환됩니다. MariaDB 클라이언트 라이브러리는 MySQL 구현과 관련된 제한된 수의 기능을 제외하고 대부분의 일반적인 MySQL 시나리오에서 작동합니다.

MariaDB 클라이언트 라이브러리에 대해 애플리케이션을 빌드하는 데 필요한 개발 파일 및 프로그램은 mariadb-connector-c-devel 패키지에서 제공합니다.

직접 라이브러리 이름을 사용하는 대신 mariadb-connector-c-devel 패키지에 배포되는 mariadb_config 프로그램을 사용합니다. 이 프로그램을 통해 올바른 빌드 플래그가 반환됩니다.

7.4. PostgreSQL 사용

PostgreSQL 서버는 SQL 언어를 기반으로 하는 강력하고 확장성이 뛰어난 오픈 소스 데이터베이스 서버입니다. PostgreSQL 서버는 광범위한 데이터 세트 및 다수의 동시 사용자를 관리할 수 있는 개체 관계형 데이터베이스 시스템을 제공합니다. 이러한 이유로 클러스터에서 PostgreSQL 서버를 사용하여 대량의 데이터를 관리할 수 있습니다.

PostgreSQL 서버에는 데이터 무결성을 보장하기 위한 기능이 포함되어 있어 내결함성 환경 및 애플리케이션을 구축할 수 있습니다. PostgreSQL 서버를 사용하면 데이터베이스를 다시 컴파일하지 않고도 자체 데이터 유형, 사용자 지정 함수 또는 다른 프로그래밍 언어의 코드를 사용하여 데이터베이스를 확장할 수 있습니다.

RHEL 시스템에 PostgreSQL 을 설치하고 구성하는 방법, PostgreSQL 데이터를 백업하는 방법 및 이전 PostgreSQL 버전에서 마이그레이션하는 방법을 알아봅니다.

7.4.1. PostgreSQL 설치

RHEL 8에서는 PostgreSQL 서버가 여러 버전에서 사용할 수 있으며 각각 별도의 스트림에서 제공됩니다.

  • PostgreSQL 10 - 기본 스트림
  • PostgreSQL 9.6
  • PostgreSQL 12 - RHEL 8.1.1 이후 사용 가능
  • PostgreSQL 13 - RHEL 8.4 이후 사용 가능
  • PostgreSQL 15 - RHEL 8.8 이후 사용 가능
참고

설계상 동일한 모듈의 두 개 이상 버전(스트림)을 병렬로 설치할 수 없습니다. 따라서 postgresql 모듈에서 사용 가능한 스트림 중 하나만 선택해야 합니다. RHEL 7용 Red Hat Software Collections에서는 구성 요소의 병렬 설치가 가능합니다. RHEL 8에서는 컨테이너에서 다른 버전의 데이터베이스 서버를 사용할 수 있습니다.

PostgreSQL 을 설치하려면 다음 절차를 사용합니다.

절차

  1. postgresql 모듈에서 스트림(버전)을 선택하고 서버 프로필을 지정하여 PostgreSQL 서버 패키지를 설치합니다. 예를 들면 다음과 같습니다.

    # yum module install postgresql:15/server

    postgres 수퍼유저가 자동으로 생성됩니다.

  2. 데이터베이스 클러스터를 초기화합니다.

    # postgresql-setup --initdb

    Red Hat은 기본 /var/lib/pgsql/data 디렉터리에 데이터를 저장하는 것이 좋습니다.

  3. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
  4. 부팅 시 시작되도록 postgresql 서비스를 활성화합니다.

    # systemctl enable postgresql.service

모듈 스트림 사용에 대한 자세한 내용은 사용자 공간 구성 요소 설치, 관리 및 제거를 참조하십시오.

중요

RHEL 8에서 이전 postgresql 스트림에서 업그레이드하려면 이후 스트림으로 전환에 설명된 두 절차를 따르십시오. 7.4.6절. “RHEL 8 버전의 PostgreSQL으로 마이그레이션”

7.4.2. PostgreSQL 사용자 생성

PostgreSQL 사용자는 다음과 같은 유형입니다.

  • postgres UNIX 시스템 사용자 - pg_dump 와 같은 PostgreSQL 서버 및 클라이언트 애플리케이션을 실행하는 데만 사용해야 합니다. 데이터베이스 생성 및 사용자 관리와 같은 PostgreSQL 관리에서는 postgres 시스템 사용자를 사용하지 마십시오.
  • 데이터베이스 슈퍼유저 - 기본 postgres PostgreSQL 슈퍼유저는 postgres 시스템 사용자와 관련이 없습니다. pg_hba.conf 파일에서 postgres 슈퍼 유저에 대한 액세스를 제한할 수 있고, 그렇지 않으면 다른 권한 제한은 없습니다. 다른 데이터베이스 수퍼유저도 만들 수 있습니다.
  • 특정 데이터베이스 액세스 권한이 있는 역할:

    • 데이터베이스 사용자 - 기본적으로 로그인할 수 있는 권한이 있습니다.
    • 사용자 그룹 - 그룹 전체에 대한 권한 관리를 활성화합니다.

역할은 데이터베이스 개체(예: 테이블 및 함수)를 소유하고 SQL 명령을 사용하여 다른 역할에 개체 권한을 할당할 수 있습니다.

표준 데이터베이스 관리 권한에는 SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY, EXECUTE, USAGE 등이 있습니다.

역할 속성은 LOGIN,SUPERUSER,CREATEDB 및 CREATE ROLE 과 같은 특수 권한입니다.

중요

대부분의 작업을 수퍼유저가 아닌 역할로 수행하는 것이 좋습니다. 일반적인 방법은 CREATEDB 및 CREATE ROLE 권한이 있는 역할을 생성하고 이 역할을 데이터베이스 및 역할의 모든 일상적인 관리에 사용하는 것입니다.

사전 요구 사항

  • PostgreSQL 서버가 설치되어 있어야 합니다.
  • 데이터베이스 클러스터가 초기화됩니다.

절차

  • 사용자를 생성하려면 사용자의 암호를 설정하고 사용자에게 CREATEROLECREATEDB 권한을 할당합니다.

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;

    mydbuser 를 사용자 이름으로 바꾸고 mypasswd 를 사용자 암호로 바꿉니다.

예 7.1. PostgreSQL 데이터베이스 초기화, 생성 및 연결

이 예제에서는 PostgreSQL 데이터베이스를 초기화하고, 일상적인 데이터베이스 관리 권한이 있는 데이터베이스 사용자를 생성하고, 관리 권한이 있는 데이터베이스 사용자를 통해 모든 시스템 계정에서 액세스할 수 있는 데이터베이스를 생성하는 방법을 보여줍니다.

  1. PosgreSQL 서버를 설치합니다.

    # yum module install postgresql:13/server
  2. 데이터베이스 클러스터를 초기화합니다.

    # postgresql-setup --initdb
    * Initializing database in '/var/lib/pgsql/data'
    * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
  3. 암호 해시 알고리즘을 scram-sha-256 으로 설정합니다.

    1. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

      #password_encryption = md5              # md5 or scram-sha-256

      다음으로 변경합니다.

      password_encryption = scram-sha-256
    2. /var/lib/pgsql/data/pg_hba.conf 파일에서 IPv4 로컬 연결에 대해 다음 행을 변경합니다.

      host    all             all             127.0.0.1/32            ident

      다음으로 변경합니다.

      host    all             all             127.0.0.1/32            scram-sha-256
  4. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
  5. postgres 라는 시스템 사용자로 로그인합니다.

    # su - postgres
  6. PostgreSQL 대화형 터미널을 시작합니다.

    $ psql
    psql (13.7)
    Type "help" for help.
    
    postgres=#
  7. 선택 사항: 현재 데이터베이스 연결에 대한 정보를 얻습니다.

    postgres=# \conninfo
    You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
  8. mydbuser 라는 사용자를 만들고, mydbuser 의 암호를 설정한 다음 mydbuser 에게 CREATEROLECREATEDB 권한을 할당합니다.

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;
    CREATE ROLE

    이제 mydbuser 사용자가 일상적인 데이터베이스 관리 작업을 수행할 수 있습니다: 데이터베이스를 생성하고 사용자 인덱스를 관리합니다.

  9. \q meta 명령을 사용하여 대화형 터미널에서 로그아웃합니다.

    postgres=# \q
  10. postgres 사용자 세션에서 로그아웃합니다.

    $ logout
  11. PostgreSQL 터미널에 mydbuser 로 로그인하고 호스트 이름을 지정하고 초기화 중에 생성된 기본 postgres 데이터베이스에 연결합니다.

    # psql -U mydbuser -h 127.0.0.1 -d postgres
    Password for user mydbuser:
    Type the password.
    psql (13.7)
    Type "help" for help.
    
    postgres=>
  12. mydatabase 데이터베이스를 생성합니다.

    postgres=> CREATE DATABASE mydatabase;
    CREATE DATABASE
    postgres=>
  13. 세션에서 로그아웃합니다.

    postgres=# \q
  14. mydatabase에 mydbuser 로 연결합니다.

    # psql -U mydbuser -h 127.0.0.1 -d mydatabase
    Password for user mydbuser:
    psql (13.7)
    Type "help" for help.
    mydatabase=>
  15. 선택 사항: 현재 데이터베이스 연결에 대한 정보를 얻습니다.

    mydatabase=> \conninfo
    You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".

7.4.3. PostgreSQL 구성

PostgreSQL 데이터베이스에서 모든 데이터 및 구성 파일은 데이터베이스 클러스터라는 단일 디렉터리에 저장됩니다. 구성 파일을 포함한 모든 데이터를 기본 /var/lib/pgsql/data/ 디렉토리에 저장하는 것이 좋습니다.

PostgreSQL 구성은 다음 파일로 구성됩니다.

  • PostgreSQL.conf - 데이터베이스 클러스터 매개 변수를 설정하는 데 사용됩니다.
  • PostgreSQL .auto.conf - postgresql. conf 와 유사한 기본 PostgreSQL 설정을 보유합니다. 그러나 이 파일은 서버 제어 아래에 있습니다. 이 파일은SYSTEM 쿼리에 의해 편집되며 수동으로 편집할 수 없습니다.
  • pg_ident.conf - 외부 인증 메커니즘의 사용자 ID를 PostgreSQL 사용자 ID로 매핑하는 데 사용됩니다.
  • pg_hba.conf - PostgreSQL 데이터베이스의 클라이언트 인증을 구성하는 데 사용됩니다.

PostgreSQL 구성을 변경하려면 다음 절차를 사용하십시오.

절차

  1. 해당 구성 파일(예: /var/lib/pgsql/data/postgresql.conf )을 편집합니다.
  2. 변경 사항이 적용되도록 postgresql 서비스를 다시 시작합니다.

    # systemctl restart postgresql.service

예 7.2. PostgreSQL 데이터베이스 클러스터 매개변수 구성

이 예제에서는 /var/lib/pgsql/data/postgresql.conf 파일에서 데이터베이스 클러스터 매개변수의 기본 설정을 보여줍니다.

# This is a comment
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB
password_encryption = scram-sha-256

예 7.3. PostgreSQL에서 클라이언트 인증 설정

이 예제에서는 /var/lib/pgsql/data/pg_hba.conf 파일에서 클라이언트 인증을 설정하는 방법을 보여줍니다.

# TYPE    DATABASE       USER        ADDRESS              METHOD
local     all            all                              trust
host      postgres       all         192.168.93.0/24      ident
host      all            all         .example.com         scram-sha-256

7.4.4. PostgreSQL 서버에서 TLS 암호화 구성

기본적으로 PostgreSQL 에서는 암호화되지 않은 연결을 사용합니다. 보다 안전한 연결을 위해 PostgreSQL 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.

사전 요구 사항

  • PostgreSQL 서버가 설치되어 있어야 합니다.
  • 데이터베이스 클러스터가 초기화됩니다.

절차

  1. OpenSSL 라이브러리를 설치합니다.

    # yum install openssl
  2. TLS 인증서 및 키를 생성합니다.

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"

    dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 바꿉니다.

  3. 서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.

    # cp server.{key,crt} /var/lib/pgsql/data/.
  4. 서명된 인증서의 소유자 및 그룹 소유권을 postgres 사용자로 변경합니다.

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
  5. 소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.

    # chmod 0400 /var/lib/pgsql/data/server.key
  6. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경하여 암호 해시 알고리즘을 scram-sha-256 으로 설정합니다.

    #password_encryption = md5              # md5 or scram-sha-256

    다음으로 변경합니다.

    password_encryption = scram-sha-256
  7. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경하여 SSL/TLS를 사용하도록 PostgreSQL을 구성합니다.

    #ssl = off

    다음으로 변경합니다.

    ssl=on
  8. /var/lib/pgsql/data/pg_hba.conf 파일에서 IPv4 로컬 연결에 대해 다음 행을 변경하여 TLS를 사용하는 클라이언트의 연결만 허용하도록 모든 데이터베이스에 대한 액세스를 제한합니다.

    host		all		all		127.0.0.1/32		ident

    다음으로 변경합니다.

    hostssl 	all		all		127.0.0.1/32		scram-sha-256

    또는 다음 새 행을 추가하여 단일 데이터베이스 및 사용자에 대한 액세스를 제한할 수 있습니다.

    hostssl	mydatabase	mydbuser	127.0.0.1/32		scram-sha-256

    mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.

  9. postgresql 서비스를 다시 시작하여 변경 사항을 적용합니다.

    # systemctl restart postgresql.service

검증

  • 연결이 암호화되었는지 수동으로 확인하려면 다음을 수행하십시오.

    1. mydbuser 사용자로 PostgreSQL 데이터베이스에 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.

      $ psql -U mydbuser -h 127.0.0.1 -d mydatabase
      Password for user mydbuser:

      mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.

    2. 현재 데이터베이스 연결에 대한 정보를 얻습니다.

      mydbuser=> \conninfo
      You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".
      SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
  • PostgreSQL 에 대한 연결이 암호화되었는지 확인하는 간단한 애플리케이션을 작성할 수 있습니다. 이 예제에서는 libpq-devel 패키지에서 제공하는 libpq 클라이언트 라이브러리를 사용하는 C로 작성된 애플리케이션을 보여줍니다.

    #include <stdio.h>
    #include <stdlib.h>
    #include <libpq-fe.h>
    
    int main(int argc, char* argv[])
    {
    //Create connection
    PGconn* connection = PQconnectdb("hostaddr=127.0.0.1 password=mypassword port=5432 dbname=mydatabase user=mydbuser");
    
    if (PQstatus(connection) ==CONNECTION_BAD)
        {
        printf("Connection error\n");
        PQfinish(connection);
        return -1; //Execution of the program will stop here
        }
        printf("Connection ok\n");
        //Verify TLS
        if (PQsslInUse(connection)){
         printf("TLS in use\n");
         printf("%s\n", PQsslAttribute(connection,"protocol"));
        }
        //End connection
        PQfinish(connection);
        printf("Disconnected\n");
        return 0;
    }

    mypassword 를 암호, mydatabase 를 데이터베이스 이름으로, mydbuser 를 사용자 이름으로 교체합니다.

    참고

    -l pq 옵션을 사용하여 컴파일하기 위해 pq 라이브러리를 로드해야 합니다. 예를 들어 GCC 컴파일러를 사용하여 애플리케이션을 컴파일하려면 다음을 수행합니다.

    $ gcc source_file.c -lpq -o myapplication

    source_file.c 에 위의 예제 코드가 포함되어 있고 myapplication 은 보안된 PostgreSQL 연결을 확인하기 위한 애플리케이션의 이름입니다.

예 7.4. TLS 암호화를 사용하여 PostgreSQL 데이터베이스 초기화, 생성 및 연결

이 예제에서는 PostgreSQL 데이터베이스를 초기화하고 데이터베이스 사용자 및 데이터베이스를 생성하고 보안 연결을 사용하여 데이터베이스에 연결하는 방법을 보여줍니다.

  1. PosgreSQL 서버를 설치합니다.

    # yum module install postgresql:13/server
  2. 데이터베이스 클러스터를 초기화합니다.

    # postgresql-setup --initdb
    * Initializing database in '/var/lib/pgsql/data'
    * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
  3. OpenSSL 라이브러리를 설치합니다.

    # yum install openssl
  4. TLS 인증서 및 키를 생성합니다.

    # openssl req -new -x509 -days 365 -nodes -text -out server.crt \
      -keyout server.key -subj "/CN=dbhost.yourdomain.com"

    dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 바꿉니다.

  5. 서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.

    # cp server.{key,crt} /var/lib/pgsql/data/.
  6. 서명된 인증서의 소유자 및 그룹 소유권을 postgres 사용자로 변경합니다.

    # chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
  7. 소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.

    # chmod 0400 /var/lib/pgsql/data/server.key
  8. 암호 해시 알고리즘을 scram-sha-256 으로 설정합니다. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

    #password_encryption = md5              # md5 or scram-sha-256

    다음으로 변경합니다.

    password_encryption = scram-sha-256
  9. SSL/TLS를 사용하도록 PostgreSQL을 구성합니다. /var/lib/pgsql/data/postgresql.conf 파일에서 다음 행을 변경합니다.

    #ssl = off

    다음으로 변경합니다.

    ssl=on
  10. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service
  11. postgres 라는 시스템 사용자로 로그인합니다.

    # su - postgres
  12. postgres 사용자로 PostgreSQL 대화형 터미널을 시작합니다.

    $ psql -U postgres
    psql (13.7)
    Type "help" for help.
    
    postgres=#
  13. mydbuser 라는 사용자를 생성하고 mydbuser 의 암호를 설정합니다.

    postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd';
    CREATE ROLE
    postgres=#
  14. mydatabase 데이터베이스를 생성합니다.

    postgres=# CREATE DATABASE mydatabase;
    CREATE DATABASE
    postgres=#
  15. mydbuser 사용자에게 모든 권한을 부여합니다.

    postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser;
    GRANT
    postgres=#
  16. 대화형 터미널에서 로그아웃합니다.

    postgres=# \q
  17. postgres 사용자 세션에서 로그아웃합니다.

    $ logout
  18. /var/lib/pgsql/data/pg_hba.conf 파일에서 IPv4 로컬 연결에 대해 다음 행을 변경하여 TLS를 사용하는 클라이언트의 연결만 허용하도록 모든 데이터베이스에 대한 액세스를 제한합니다.

    host		all		all		127.0.0.1/32		ident

    다음으로 변경합니다.

    hostssl 	all		all		127.0.0.1/32		scram-sha-256
  19. postgresql 서비스를 다시 시작하여 변경 사항을 적용합니다.

    # systemctl restart postgresql.service
  20. mydbuser 사용자로 PostgreSQL 데이터베이스에 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.

    $ psql -U mydbuser -h 127.0.0.1 -d mydatabase
    Password for user mydbuser:
    psql (13.7)
    SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
    Type "help" for help.
    
    mydatabase=>

7.4.5. PostgreSQL 데이터 백업

PostgreSQL 데이터를 백업하려면 다음 방법 중 하나를 사용합니다.

SQL 덤프
SQL dump로 백업하는 것을 참조하십시오.
파일 시스템 수준 백업
파일 시스템 수준 백업을 참조하십시오.
연속 아카이브
지속적인 아카이브 를 참조하십시오.

7.4.5.1. SQL 덤프를 사용하여 PostgreSQL 데이터 백업

SQL 덤프 방법은 SQL 명령으로 덤프 파일을 생성하는 방법을 기반으로 합니다. 덤프가 데이터베이스 서버에 다시 업로드되면 덤프 시와 동일한 상태로 데이터베이스를 다시 생성합니다.

SQL 덤프는 다음 PostgreSQL 클라이언트 애플리케이션에서 확인합니다.

  • pg_dump 는 역할 또는 테이블 공간에 대한 클러스터 전체 정보 없이 단일 데이터베이스를 덤프합니다.
  • pg_dumpall 은 지정된 클러스터의 각 데이터베이스를 덤프하고 역할 및 테이블 공간 정의와 같은 클러스터 전체 데이터를 유지합니다.

기본적으로 pg_dumppg_dumpall 명령은 결과를 표준 출력에 씁니다. 덤프를 파일에 저장하려면 출력을 SQL 파일로 리디렉션합니다. 결과 SQL 파일은 병렬 처리를 허용하는 텍스트 형식 또는 다른 형식으로 되어 있고 개체 복원을 보다 자세히 제어할 수 있습니다.

데이터베이스에 액세스할 수 있는 모든 원격 호스트에서 SQL 덤프를 수행할 수 있습니다.

7.4.5.1.1. SQL 덤프의 장점 및 단점

SQL 덤프에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.

  • SQL 덤프는 서버 버전별이 아닌 유일한 PostgreSQL 백업 방법입니다. pg_dump 유틸리티의 출력은 파일 시스템 수준 백업 또는 연속 아카이브에서는 사용할 수 없는 최신 버전의 PostgreSQL 로 다시 로드할 수 있습니다.
  • SQL 덤프는 32비트에서 64비트 서버로 이동하는 등 데이터베이스를 다른 시스템 아키텍처로 전송할 때 작동하는 유일한 방법입니다.
  • SQL 덤프는 내부적으로 일관된 덤프를 제공합니다. 덤프는 pg_dump 가 실행을 시작한 시점에 데이터베이스의 스냅샷을 나타냅니다.
  • pg_dump 유틸리티는 실행 시 데이터베이스의 다른 작업을 차단하지 않습니다.

SQL 덤프의 단점은 파일 시스템 수준 백업에 비해 더 많은 시간이 필요하다는 것입니다.

7.4.5.1.2. pg_dump를 사용하여 SQL 덤프 수행

클러스터 전체 정보 없이 단일 데이터베이스를 덤프하려면 pg_dump 유틸리티를 사용합니다.

사전 요구 사항

  • 덤프하려는 모든 테이블에 대한 읽기 액세스 권한이 있어야 합니다. 전체 데이터베이스를 덤프하려면 postgres superuser 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

절차

  • 클러스터 전체 정보가 없는 데이터베이스를 덤프합니다.

    $ pg_dump dbname > dumpfile

연결할 데이터베이스 서버 pg_dump 를 지정하려면 다음 명령줄 옵션을 사용합니다.

  • 호스트를 정의하는 -h 옵션.

    기본 호스트는 로컬 호스트이거나 PPP HOST 환경 변수에 의해 지정된 항목입니다.

  • 포트를 정의하는 -p 옵션.

    기본 포트는 PPP PORT 환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.

7.4.5.1.3. pg_dumpall을 사용하여 SQL 덤프 수행

지정된 데이터베이스 클러스터에서 각 데이터베이스를 덤프하고 클러스터 전체 데이터를 보존하려면 pg_dumpall 유틸리티를 사용합니다.

사전 요구 사항

  • postgres 수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

절차

  • 데이터베이스 클러스터의 모든 데이터베이스를 덤프하고 클러스터 전체 데이터를 보존합니다.

    $ pg_dumpall > dumpfile

연결할 데이터베이스 서버 pg_dumpall 을 지정하려면 다음 명령줄 옵션을 사용합니다.

  • 호스트를 정의하는 -h 옵션.

    기본 호스트는 로컬 호스트이거나 PPP HOST 환경 변수에 의해 지정된 항목입니다.

  • 포트를 정의하는 -p 옵션.

    기본 포트는 PPP PORT 환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.

  • 기본 데이터베이스를 정의하는 -l 옵션.

    이 옵션을 사용하면 초기화 중에 자동으로 생성된 postgres 데이터베이스와 다른 기본 데이터베이스를 선택할 수 있습니다.

7.4.5.1.4. pg_dump를 사용하여 덤프된 데이터베이스 복원

pg_dump 유틸리티를 사용하여 덤프한 SQL 덤프에서 데이터베이스를 복원하려면 아래 단계를 수행하십시오.

사전 요구 사항

  • postgres 수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

절차

  1. 새 데이터베이스를 생성합니다.

    $ createdb dbname
  2. 개체를 소유하고 있거나 덤프된 데이터베이스의 오브젝트에 대한 사용 권한이 이미 있는지 확인합니다. 이러한 사용자가 없는 경우 복원에서 원래 소유권 및 권한을 가진 오브젝트를 다시 생성할 수 없습니다.
  3. psql 유틸리티를 실행하여 pg_dump 유틸리티에서 생성한 텍스트 파일 덤프를 복원합니다.

    $ psql dbname < dumpfile

    여기에서 dumpfilepg_dump 명령의 출력입니다. 텍스트가 아닌 파일 덤프를 복원하려면 대신 pg_restore 유틸리티를 사용합니다.

    $ pg_restore non-plain-text-file
7.4.5.1.5. pg_dumpall을 사용하여 덤프된 데이터베이스 복원

pg_dumpall 유틸리티를 사용하여 덤프한 데이터베이스 클러스터에서 데이터를 복원하려면 아래 단계를 따르십시오.

사전 요구 사항

  • postgres 수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

절차

  1. 개체를 소유하고 있거나 덤프된 데이터베이스의 오브젝트에 대한 사용 권한이 이미 있는지 확인합니다. 이러한 사용자가 없는 경우 복원에서 원래 소유권 및 권한을 가진 오브젝트를 다시 생성할 수 없습니다.
  2. psql 유틸리티를 실행하여 pg_dumpall 유틸리티로 생성된 텍스트 파일 덤프를 복원합니다.

    $ psql < dumpfile

    여기에서 dumpfilepg_dumpall 명령의 출력입니다.

7.4.5.1.6. 다른 서버에서 데이터베이스의 SQL 덤프 수행

pg_dumppsql 은 파이프로 쓰고 읽을 수 있기 때문에 한 서버에서 다른 서버로 직접 데이터베이스를 덤프할 수 있습니다.

절차

  • 한 서버에서 다른 서버로 데이터베이스를 덤프하려면 다음을 실행합니다.

    $ pg_dump -h host1 dbname | psql -h host2 dbname
7.4.5.1.7. 복원 중 SQL 오류 처리

기본적으로 SQL 오류가 발생하는 경우 psql 이 계속 실행되므로 데이터베이스가 부분적으로만 복원됩니다.

기본 동작을 변경하려면 덤프를 복원할 때 다음 방법 중 하나를 사용합니다.

사전 요구 사항

  • postgres 수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.

절차

  • ON_ERROR_STOP 변수를 설정하여 SQL 오류가 발생하는 경우 psql 종료 상태로 3을 종료합니다.

    $ psql --set ON_ERROR_STOP=on dbname < dumpfile
  • 복원이 완전히 완료되거나 취소되도록 전체 덤프가 단일 트랜잭션으로 복원되도록 지정합니다.

    • psql 유틸리티를 사용하여 텍스트 파일 덤프를 복원하는 경우:

      $ psql -1
    • pg_restore 유틸리티를 사용하여 텍스트가 아닌 파일 덤프를 복원하는 경우:

      $ pg_restore -e

      이 방법을 사용할 때 사소한 오류도 여러 시간 동안 이미 실행된 복원 작업을 취소할 수 있습니다.

7.4.5.1.8. 추가 리소스

7.4.5.2. 파일 시스템 수준 백업을 사용하여 PostgreSQL 데이터 백업

파일 시스템 수준 백업을 생성하려면 PostgreSQL 데이터베이스 파일을 다른 위치에 복사합니다. 예를 들어 다음 방법을 사용할 수 있습니다.

  • tar 유틸리티를 사용하여 아카이브 파일을 만듭니다.
  • rsync 유틸리티를 사용하여 파일을 다른 위치에 복사합니다.
  • 데이터 디렉터리의 일관된 스냅샷을 생성합니다.
7.4.5.2.1. 파일 시스템 백업의 이점 및 제한 사항

파일 시스템 수준 백업은 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.

  • 파일 시스템 수준 백업은 일반적으로 SQL 덤프보다 빠릅니다.

파일 시스템 수준 백업에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 제한 사항이 있습니다.

  • 이 백업 방법은 RHEL 7에서 RHEL 8로 업그레이드하고 데이터를 업그레이드된 시스템으로 마이그레이션하려는 경우 적합하지 않습니다. 파일 시스템 수준 백업은 아키텍처 및 RHEL 주요 버전에 따라 다릅니다. 업그레이드에 실패하면 RHEL 7 시스템에서 데이터를 복원할 수 있지만 RHEL 8 시스템에서 데이터를 복원할 수 없습니다.
  • 데이터를 백업 및 복원하기 전에 데이터베이스 서버를 종료해야 합니다.
  • 특정 파일 또는 테이블을 백업 및 복원하는 것은 불가능합니다. 파일 시스템 백업은 전체 데이터베이스 클러스터의 전체 백업 및 복원에만 작동합니다.
7.4.5.2.2. 파일 시스템 수준 백업 수행

파일 시스템 수준 백업을 수행하려면 다음 절차를 사용하십시오.

절차

  1. 데이터베이스 클러스터의 위치를 선택하고 이 클러스터를 초기화합니다.

    # postgresql-setup --initdb
  2. postgresql 서비스를 중지합니다.

    # systemctl stop postgresql.service
  3. 파일 시스템 백업을 생성하려면 방법을 사용하여 tar 아카이브와 같이 파일 시스템 백업을 생성합니다.

    $ tar -cf backup.tar /var/lib/pgsql/data
  4. postgresql 서비스를 시작합니다.

    # systemctl start postgresql.service

7.4.5.3. 연속 아카이빙을 통한 PostgreSQL 데이터 백업

7.4.5.3.1. 지속적인 아카이브 소개

PostgreSQL 은 데이터베이스의 데이터 파일의 모든 변경 사항을 클러스터 데이터 디렉터리의 pg_wal/ 하위 디렉터리에서 사용할 수 있는 쓰기 전 로그(WAL) 파일에 기록합니다. 이 로그는 주로 크래시 복구용으로 사용됩니다. 충돌이 발생한 후 마지막 checkpoint 이후 발생한 로그 항목을 일관성으로 복원하는 데 사용할 수 있습니다.

온라인 백업이라고도 하는 지속적인 아카이브 방법은 실행 중인 서버 또는 파일 시스템 수준 백업에서 수행되는 기본 백업 형태의 데이터베이스 클러스터 사본과 WAL 파일을 결합합니다.

데이터베이스 복구가 필요한 경우 데이터베이스 클러스터 복사본에서 데이터베이스를 복원한 다음 백업된 WAL 파일의 로그를 재생하여 시스템을 현재 상태로 가져올 수 있습니다.

지속적인 아카이브 방법을 사용하면 최소한 마지막 기본 백업 시작 시간으로 확장되는 모든 아카이브 WAL 파일의 연속 시퀀스를 유지해야 합니다. 따라서 기본 백업의 이상적인 빈도는 다음에 따라 달라집니다.

  • 아카이브된 WAL 파일에 사용 가능한 스토리지 볼륨입니다.
  • 복구가 필요한 상황에서 가능한 최대 데이터 복구 기간입니다. 마지막 백업 이후 긴 기간이 있는 경우 시스템은 더 많은 WAL 세그먼트를 재생하므로 복구 시간이 더 오래 걸립니다.
참고

지속적인 아카이브 백업 솔루션의 일부로 pg_dump 및 pg_dumpall SQL 덤프를 사용할 수 없습니다. SQL 덤프는 논리적 백업을 생성하고 WAL 재생에서 사용할 수 있는 충분한 정보를 포함하지 않습니다.

연속 보관 방법을 사용하여 데이터베이스 백업 및 복원을 수행하려면 다음 지침을 따르십시오.

  1. WAL 파일을 보관하기 위한 절차를 설정하고 테스트합니다 - WAL 아카이브를 참조하십시오.
  2. 기본 백업 수행 - 기본 백업을 참조하십시오.

데이터를 복원하려면 연속 보관을 사용하여 데이터베이스 복원 지침을 따르십시오.

7.4.5.3.2. 지속적인 아카이빙의 장점과 단점

연속 아카이브는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.

  • 연속 백업 방법을 사용하면 백업의 내부 불일치가 로그 재생에 의해 수정되므로 완전히 일치하지 않는 기본 백업을 사용할 수 있습니다. 따라서 실행 중인 PostgreSQL 서버에서 기본 백업을 수행할 수 있습니다.
  • 파일 시스템 스냅샷이 필요하지 않습니다. tar 또는 유사한 아카이브 유틸리티로 충분합니다.
  • 연속 백업은 로그 재생에 대한 WAL 파일의 시퀀스가 무기한 길어질 수 있기 때문에 WAL 파일을 계속 보관하여 달성할 수 있습니다. 이는 대규모 데이터베이스에 특히 유용합니다.
  • 연속 백업은 특정 시점 복구를 지원합니다. WAL 항목을 끝까지 재생하지 않아도 됩니다. 언제든지 재생을 중지할 수 있으며 기본 백업 이후 언제든지 데이터베이스를 해당 상태로 복원할 수 있습니다.
  • 일련의 WAL 파일을 동일한 기본 백업 파일과 함께 로드한 다른 시스템에서 지속적으로 사용할 수 있는 경우 언제든지 거의 최신 데이터베이스 복사본으로 다른 시스템을 복원할 수 있습니다.

연속 아카이브에는 다른 PostgreSQL 백업 방법에 비해 다음과 같은 단점이 있습니다.

  • 연속 백업 방법은 하위 집합이 아닌 전체 데이터베이스 클러스터의 복원만 지원합니다.
  • 연속 백업에는 광범위한 보관 스토리지가 필요합니다.
7.4.5.3.3. WAL 아카이브 설정

실행 중인 PostgreSQL 서버는 일련의 WAL(Write ahead log) 레코드를 생성합니다. 서버는 이 시퀀스를 WAL 세그먼트 파일로 분할하며, WAL 시퀀스에서 해당 위치를 반영하는 숫자 이름이 지정됩니다. WAL 아카이브가 없으면 세그먼트 파일이 재사용되고 더 높은 세그먼트 번호로 이름이 변경됩니다.

WAL 데이터를 보관하면 세그먼트 파일을 재사용하기 전에 각 세그먼트 파일의 내용을 새 위치에 캡처하여 저장합니다. 다른 시스템의 NFS 마운트된 디렉토리, 테이프 드라이브 또는 CD와 같은 콘텐츠를 저장할 수 있는 여러 옵션이 있습니다.

WAL 레코드에는 구성 파일에 대한 변경 사항이 포함되지 않습니다.

WAL 아카이브를 활성화하려면 다음 절차를 사용합니다.

절차

  1. /var/lib/pgsql/data/postgresql.conf 파일에서 다음을 수행합니다.

    1. the wal_level 구성 매개 변수를 replica 이상으로 설정합니다.
    2. archive_mode 매개 변수를 on 으로 설정합니다.
    3. archive_command 구성 매개 변수에 shell 명령을 지정합니다. cp 명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다.
  2. postgresql 서비스를 다시 시작하여 변경 사항을 활성화합니다.

    # systemctl restart postgresql.service
  3. 아카이브 명령을 테스트하고 기존 파일을 덮어쓰지 않고 오류가 발생하면 0이 아닌 종료 상태를 반환하는지 확인합니다.
  4. 데이터를 보호하려면 세그먼트 파일이 그룹 또는 세계 읽기 액세스 권한이 없는 디렉터리에 보관되었는지 확인합니다.
참고

archive 명령은 완료된 WAL 세그먼트에서만 실행됩니다. 작은 WAL 트래픽을 생성하는 서버는 트랜잭션 완료와 아카이브 스토리지의 안전한 기록 사이에 상당한 지연이 발생할 수 있습니다. 아카이브되지 않은 데이터가 얼마나 오래된지 제한하려면 다음을 수행할 수 있습니다.

  • 지정된 빈도로 서버가 새 WAL 세그먼트 파일로 전환되도록 archive_timeout 매개 변수를 설정합니다.
  • pg_switch_wal 매개 변수를 사용하여 세그먼트 스위치를 강제 적용하여 트랜잭션이 완료된 후 즉시 보관되도록 합니다.

예 7.5. WAL 세그먼트를 보관하기 위한 쉘 명령

이 예에서는 archive_command 구성 매개 변수에 설정할 수 있는 간단한 쉘 명령을 보여줍니다.

다음 명령은 완료된 세그먼트 파일을 필요한 위치로 복사합니다.

archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'

여기서 %p 매개 변수는 아카이브할 파일의 상대 경로로 바뀌고 %f 매개 변수는 파일 이름으로 교체됩니다.

이 명령은 보관 가능한 WAL 세그먼트를 /mnt/server/archivedir/ 디렉터리에 복사합니다. %p 및 % f 매개변수를 교체한 후 실행된 명령은 다음과 같습니다.

test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065

아카이브된 각 새 파일에 대해 유사한 명령이 생성됩니다.

추가 리소스

7.4.5.3.4. 기본 백업 만들기

몇 가지 방법으로 기본 백업을 만들 수 있습니다. 기본 백업을 수행하는 가장 간단한 방법은 실행 중인 PostgreSQL 서버에서 pg_basebackup 유틸리티를 사용하는 것입니다.

기본 백업 프로세스는 WAL 아카이브 영역에 저장된 백업 기록 파일을 만들고 기본 백업에 필요한 첫 번째 WAL 세그먼트 파일 다음에 이름이 지정됩니다.

백업 기록 파일은 시작 및 끝 시간과 백업의 WAL 세그먼트를 포함하는 작은 텍스트 파일입니다. 레이블 문자열을 사용하여 연결된 덤프 파일을 식별한 경우 백업 기록 파일을 사용하여 복원할 덤프 파일을 확인할 수 있습니다.

참고

데이터를 복구할 수 있도록 몇 가지 백업 세트를 확실하게 유지하는 것이 좋습니다.

기본 백업을 수행하려면 다음 절차를 사용합니다.

사전 요구 사항

  • postgres 수퍼유저, 데이터베이스 관리자 권한이 있는 사용자 또는 최소 REPLICATION 권한이 있는 다른 사용자로 명령을 실행해야 합니다.
  • 기본 백업 중 및 이후에 생성된 모든 WAL 세그먼트 파일을 보관해야 합니다.

절차

  1. pg_basebackup 유틸리티를 사용하여 기본 백업을 수행합니다.

    • 개별 파일(일반 형식)으로 기본 백업을 생성하려면 다음을 수행합니다.

      $ pg_basebackup -D backup_directory -Fp

      backup_directory 를 원하는 백업 위치로 바꿉니다.

      테이블 공간을 사용하고 서버와 동일한 호스트에서 기본 백업을 수행하는 경우 --tablespace-mapping 옵션도 사용해야 합니다. 그렇지 않으면 백업을 동일한 위치에 쓰기를 시도할 때 백업이 실패합니다.

    • tar 아카이브( tar 및 압축된 형식)로 기본 백업을 생성하려면 다음을 수행합니다.

      $ pg_basebackup -D backup_directory -Ft -z

      backup_directory 를 원하는 백업 위치로 바꿉니다.

      이러한 데이터를 복원하려면 올바른 위치에 있는 파일을 수동으로 추출해야 합니다.

  2. 기본 백업 프로세스가 완료되면 백업 기록 파일에 지정된 데이터베이스 클러스터의 복사본과 백업 중에 사용되는 WAL 세그먼트 파일을 안전하게 보관합니다.
  3. WAL 세그먼트는 기본 백업보다 오래되어 더 이상 복원이 필요하지 않기 때문에 기본 백업에 사용되는 WAL 세그먼트보다 숫자적으로 낮은 값을 삭제합니다.

연결할 데이터베이스 서버 pg_basebackup 을 지정하려면 다음 명령줄 옵션을 사용합니다.

  • 호스트를 정의하는 -h 옵션.

    기본 호스트는 DASD HOST 환경 변수에서 지정한 로컬 호스트 또는 호스트입니다.

  • 포트를 정의하는 -p 옵션.

    기본 포트는 PPP PORT 환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.

7.4.5.3.5. 연속 아카이브 백업을 사용하여 데이터베이스 복원

연속 백업을 사용하여 데이터베이스를 복원하려면 다음 절차를 따릅니다.

절차

  1. 서버를 중지합니다.

    # systemctl stop postgresql.service
  2. 필요한 데이터를 임시 위치에 복사합니다.

    전체 클러스터 데이터 디렉터리 및 모든 테이블 공간을 복사하는 것이 좋습니다. 이를 위해서는 기존 데이터베이스의 두 사본을 저장할 수 있는 충분한 여유 공간이 필요합니다.

    공간이 충분하지 않은 경우 시스템이 중단되기 전에 보관되지 않은 로그가 포함될 수 있는 클러스터의 pg_wal 디렉터리 콘텐츠를 저장합니다.

  3. 클러스터 데이터 디렉토리 아래에 있는 기존 파일과 하위 디렉토리를 사용하고 있는 테이블 공간의 루트 디렉토리 아래에 모두 제거합니다.
  4. 기본 백업에서 데이터베이스 파일을 복원합니다.

    다음을 확인하십시오.

    • 파일이 올바른 소유권(root이 아닌 데이터베이스 시스템 사용자)을 사용하여 복원됩니다 .
    • 올바른 권한으로 파일이 복원됩니다.
    • pg_tblspc/ 하위 디렉터리의 심볼릭 링크가 올바르게 복원됩니다.
  5. pg_wal/ 하위 디렉터리에 있는 파일을 모두 제거합니다.

    이러한 파일은 기본 백업에서 발생하므로 더 이상 사용되지 않습니다. pg_wal/ 을 보관하지 않은 경우 적절한 권한으로 다시 만듭니다.

  6. 2단계에 저장된 아카이브되지 않은 WAL 세그먼트 파일을 pg_wal/ 에 복사합니다.
  7. 클러스터 데이터 디렉터리에 recovery.conf 복구 명령 파일을 만들고 restore_command 구성 매개 변수에 shell 명령을 지정합니다. cp 명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

    restore_command = 'cp /mnt/server/archivedir/%f "%p"'
  8. 서버를 시작합니다.

    # systemctl start postgresql.service

    서버는 복구 모드로 전환하고 필요한 아카이브된 WAL 파일을 읽습니다.

    외부 오류로 인해 복구가 종료되면 서버를 다시 시작할 수 있으며 복구가 계속됩니다. 복구 프로세스가 완료되면 서버의 recovery .conf의 이름이 recovery. done으로 변경됩니다. 이렇게 하면 서버가 정상적인 데이터베이스 작업을 시작한 후 실수로 복구 모드로 전환되지 않습니다.

  9. 데이터베이스 내용을 확인하여 데이터베이스가 필수 상태로 복구되었는지 확인합니다.

    데이터베이스가 필수 상태로 복구되지 않은 경우 1단계로 돌아갑니다. 데이터베이스가 필수 상태로 복구된 경우 사용자가 pg_hba.conf 파일에서 클라이언트 인증 구성을 복원하여 연결하도록 허용합니다.

연속 백업으로 복원하는 방법에 대한 자세한 내용은 PostgreSQL 문서를 참조하십시오.

7.4.5.3.6. 추가 리소스

7.4.6. RHEL 8 버전의 PostgreSQL으로 마이그레이션

Red Hat Enterprise Linux 7에는 PostgreSQL 서버의 기본 버전으로 PostgreSQL 9.2 가 포함되어 있습니다. 또한 여러 버전의 PostgreSQL 이 RHEL 7용 Software Collections로 제공됩니다.

Red Hat Enterprise Linux 8은 PostgreSQL 10 을 기본 postgresql 스트림, PostgreSQL 9.6,PostgreSQL 12,PostgreSQL 13, PostgreSQL 15 로 제공합니다.

Red Hat Enterprise Linux의 PostgreSQL 사용자는 데이터베이스 파일에 대해 두 가지 마이그레이션 경로를 사용할 수 있습니다.

빠른 업그레이드 방법은 dump 및 restore 프로세스보다 빠릅니다. 그러나 경우에 따라 빠른 업그레이드가 작동하지 않으며 덤프 및 복원 프로세스만 사용할 수 있습니다. 이러한 경우는 다음과 같습니다.

  • 아키텍처 간 업그레이드
  • plpython 또는 plpython 2 확장을 사용하는 시스템. RHEL 8 AppStream 리포지토리에는 postgresql-plpython 2 패키지가 아닌 postgresql-plpython 3 패키지만 포함되어 있습니다.
  • Red Hat Software Collections 버전의 PostgreSQL 마이그레이션에는 빠른 업그레이드가 지원되지 않습니다.

최신 버전의 PostgreSQL으로 마이그레이션하기 위한 전제 조건으로 모든 PostgreSQL 데이터베이스를 백업 합니다.

덤프 및 복원 프로세스에는 데이터베이스를 덤프하고 SQL 파일의 백업을 수행해야 하며 빠른 업그레이드 방법에 권장됩니다.

이후 버전의 PostgreSQL 으로 마이그레이션하기 전에 마이그레이션하려는 PostgreSQL 버전과 대상 버전에서 마이그레이션하려는 모든 PostgreSQL 버전에 대한 업스트림 호환성 노트 를 참조하십시오.

7.4.6.1. PostgreSQL 13과 PostgreSQL 15의 주요 차이점

PostgreSQL 15 에서는 이전 버전과 호환되지 않는 다음과 같은 변경 사항이 도입되었습니다.

공용 스키마의 기본 권한

공용 스키마의 기본 권한이 PostgreSQL 15 에서 수정되었습니다. 새로 생성된 사용자는 GRANT ALL ON SCHEMA public TO myuser; 명령을 사용하여 권한을 명시적으로 부여해야 합니다.

다음 예제는 PostgreSQL 13 및 이전 버전에서 작동합니다.

postgres=# CREATE USER mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);

다음 예제는 PostgreSQL 15 에서 작동합니다.

postgres=# CREATE USER mydbuser;
postgres=# GRANT ALL ON SCHEMA public TO mydbuser;
postgres=# \c postgres mydbuser
postgres=$ CREATE TABLE mytable (id int);
참고

mydbuser acces가 pg_hba.conf 파일에 적절하게 구성되었는지 확인합니다. 자세한 내용은 PostgreSQL 사용자 생성을 참조하십시오.

PQsendQuery() 가 더 이상 파이프라인 모드에서 지원되지 않음

PostgreSQL 15 이후 libpq PQsendQuery() 기능은 더 이상 파이프라인 모드에서 지원되지 않습니다. 대신 PQsendQueryParams() 함수를 사용하도록 영향을 받는 애플리케이션을 수정합니다.

7.4.6.2. pg_upgrade 유틸리티를 사용한 빠른 업그레이드

빠른 업그레이드 중에 바이너리 데이터 파일을 /var/lib/pgsql/data/ 디렉터리에 복사하고 pg_upgrade 유틸리티를 사용해야 합니다.

이 방법을 사용하여 데이터를 마이그레이션할 수 있습니다.

  • RHEL 7 시스템 버전 PostgreSQL 9.2 에서 RHEL 8 버전 PostgreSQL 10
  • PostgreSQL 10 의 RHEL 8 버전에서 PostgreSQL 12의 RHEL 8 버전으로
  • PostgreSQL 12 의 RHEL 8 버전에서 PostgreSQL 13의 RHEL 8 버전으로
  • PostgreSQL 13 의 RHEL 8 버전에서 PostgreSQL 15의 RHEL 8 버전

RHEL 8에서 이전 postgresql 스트림에서 업그레이드하려면 이후 스트림으로 전환에 설명된 절차를 수행한 다음 PostgreSQL 데이터를 마이그레이션합니다.

RHEL 내의 다른 PostgreSQL 버전 간 마이그레이션과 PostgreSQL 의 Red Hat Software Collections 버전에서 RHEL로 마이그레이션하려면 Dump 및 restore upgrade 를 사용합니다.

다음 절차에서는 빠른 업그레이드 방법을 사용하여 RHEL 7 시스템 버전에서 PostgreSQL 9.2 의 RHEL 8 버전으로의 마이그레이션을 설명합니다.

사전 요구 사항

  • 업그레이드를 수행하기 전에 PostgreSQL 데이터베이스에 저장된 모든 데이터를 백업합니다. 기본적으로 모든 데이터는 RHEL 7 및 RHEL 8 시스템의 /var/lib/pgsql/data/ 디렉터리에 저장됩니다.

절차

  1. RHEL 8 시스템에서 마이그레이션할 스트림(버전)을 활성화합니다.

    # yum module enable postgresql:stream

    stream 을 선택한 PostgreSQL 서버 버전으로 교체합니다.

    PostgreSQL 10 을 제공하는 기본 스트림을 사용하려면 이 단계를 생략할 수 있습니다.

  2. RHEL 8 시스템에서 postgresql-server 및 postgresql- upgrade 패키지를 설치합니다.

    # yum install postgresql-server postgresql-upgrade

    선택적으로 RHEL 7에서 PostgreSQL 서버 모듈을 사용한 경우 PostgreSQL 9.2(postgresql -upgrade 패키지로 설치됨) 및 PostgreSQL 의 대상 버전(postgresql- server 패키지로 설치됨)과 두 가지 버전의 RHEL 8 시스템에도 설치합니다. 타사 PostgreSQL 서버 모듈을 컴파일해야 하는 경우 postgresql- devel 및 postgresql-upgrade-devel 패키지에 대해 모두 빌드합니다.

  3. 다음 항목을 확인합니다.

    • 기본 설정: RHEL 8 시스템에서 서버가 기본 /var/lib/pgsql/data 디렉터리를 사용하고 데이터베이스가 올바르게 초기화 및 활성화되었는지 확인합니다. 또한 데이터 파일은 /usr/lib/systemd/system/postgresql.service 파일에 언급된 것과 동일한 경로에 저장해야 합니다.
    • PostgreSQL 서버: 시스템에서 여러 PostgreSQL 서버를 실행할 수 있습니다. 이러한 모든 서버의 데이터 디렉터리가 독립적으로 처리되었는지 확인합니다.
    • PostgreSQL 서버 모듈: RHEL 7에서 사용한 PostgreSQL 서버 모듈도 RHEL 8 시스템에 설치되어 있는지 확인합니다. 플러그인은 /usr/lib64/pgsql/ 디렉토리 (또는 32비트 시스템의 /usr/lib/pgsql/ 디렉토리에 있음)에 설치됩니다.
  4. postgresql 서비스가 데이터를 복사할 때 소스 및 대상 시스템에서 실행되지 않는지 확인합니다.

    # systemctl stop postgresql.service
  5. 소스 위치의 데이터베이스 파일을 RHEL 8 시스템의 /var/lib/pgsql/data/ 디렉터리로 복사합니다.
  6. PostgreSQL 사용자로 다음 명령을 실행하여 업그레이드 프로세스를 수행합니다.

    # postgresql-setup --upgrade

    그러면 백그라운드에서 pg_upgrade 프로세스가 시작됩니다.

    실패하는 경우 postgresql-setup 은 정보적인 오류 메시지를 제공합니다.

  7. /var/lib/pgsql/data-old 의 이전 구성을 새 클러스터로 복사합니다.

    빠른 업그레이드는 최신 데이터 스택에서 이전 구성을 재사용하지 않으며 구성이 처음부터 생성됩니다. 이전 구성과 새 구성을 수동으로 결합하려면 데이터 디렉터리에서 *.conf 파일을 사용합니다.

  8. PostgreSQL 서버를 시작합니다.

    # systemctl start postgresql.service
  9. 새 데이터베이스 클러스터를 분석합니다.

    • PostgreSQL 13 이하의 경우:

      su postgres -c '~/analyze_new_cluster.sh'
    • PostgreSQL 15 의 경우:

      su postgres -c 'vacuumdb --all --analyze-in-stages'
  10. 부팅 시 새 PostgreSQL 서버가 자동으로 시작되도록 하려면 다음을 실행합니다.

    # systemctl enable postgresql.service

7.4.6.3. 업그레이드 덤프 및 복원

덤프 및 복원 업그레이드를 사용하는 경우 모든 데이터베이스의 콘텐츠를 SQL 파일 덤프 파일에 덤프해야 합니다.

덤프 및 복원 업그레이드는 빠른 업그레이드 방법보다 느리고 생성된 SQL 파일에 수동 수정이 필요할 수 있습니다.

다음에서 데이터를 마이그레이션하는 데 이 방법을 사용할 수 있습니다.

  • Red Hat Enterprise Linux 7 시스템 버전 PostgreSQL 9.2
  • 이전 Red Hat Enterprise Linux 8 버전의 PostgreSQL
  • Red Hat Software Collections의 이전 또는 동일한 PostgreSQL 버전:

    • PostgreSQL 9.2 (더 이상 지원되지 않음)
    • PostgreSQL 9.4 (더 이상 지원되지 않음)
    • PostgreSQL 9.6 (더 이상 지원되지 않음)
    • PostgreSQL 10
    • PostgreSQL 12
    • PostgreSQL 13

RHEL 7 및 RHEL 8 시스템에서 PostgreSQL 데이터는 기본적으로 /var/lib/pgsql/data/ 디렉터리에 저장됩니다. Red Hat Software Collections 버전의 PostgreSQL 의 경우 기본 데이터 디렉터리는 /var/opt/rh/collection_name/lib/pgsql/data/data/입니다(/ opt/rh/postgresql 92/root/var/lib/pgsql/data/ 디렉터리를 사용하는 postgresql 92 제외).

RHEL 8에서 이전 postgresql 스트림에서 업그레이드하려면 이후 스트림으로 전환에 설명된 절차를 수행한 다음 PostgreSQL 데이터를 마이그레이션합니다.

덤프를 수행하고 업그레이드를 복원하려면 사용자를 root 로 변경합니다.

다음 절차에서는 RHEL 7 시스템 버전의 PostgreSQL 9.2 에서 RHEL 8 버전의 PostgreSQL 으로 마이그레이션하는 방법을 설명합니다.

절차

  1. RHEL 7 시스템에서 PostgreSQL 9.2 서버를 시작합니다.

    # systemctl start postgresql.service
  2. RHEL 7 시스템에서 모든 데이터베이스 콘텐츠를 pgdump_file.sql 파일에 덤프합니다.

    su - postgres -c "pg_dumpall > ~/pgdump_file.sql"
  3. 데이터베이스가 올바르게 덤프되었는지 확인합니다.

    su - postgres -c 'less "$HOME/pgdump_file.sql"'

    결과적으로 덤프된 sql 파일의 경로가 /var/lib/pgsql/pgdump_file.sql 이 표시됩니다.

  4. RHEL 8 시스템에서 마이그레이션할 스트림(버전)을 활성화합니다.

    # yum module enable postgresql:stream

    stream 을 선택한 PostgreSQL 서버 버전으로 교체합니다.

    PostgreSQL 10 을 제공하는 기본 스트림을 사용하려면 이 단계를 생략할 수 있습니다.

  5. RHEL 8 시스템에서 postgresql-server 패키지를 설치합니다.

    # yum install postgresql-server

    RHEL 7에서 PostgreSQL 서버 모듈을 사용하는 경우 선택적으로 RHEL 8 시스템에 설치합니다. 타사 PostgreSQL 서버 모듈을 컴파일해야 하는 경우 postgresql-devel 패키지에 대해 빌드합니다.

  6. RHEL 8 시스템에서 새 PostgreSQL 서버의 데이터 디렉터리를 초기화합니다.

    # postgresql-setup --initdb
  7. RHEL 8 시스템에서 pgdump_file.sqlPostgreSQL 홈 디렉터리에 복사하고 파일이 올바르게 복사되었는지 확인합니다.

    su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'
  8. RHEL 7 시스템에서 구성 파일을 복사합니다.

    su - postgres -c 'ls -1 $PGDATA/*.conf'

    복사할 구성 파일은 다음과 같습니다.

    • /var/lib/pgsql/data/pg_hba.conf
    • /var/lib/pgsql/data/pg_ident.conf
    • /var/lib/pgsql/data/postgresql.conf
  9. RHEL 8 시스템에서 새 PostgreSQL 서버를 시작합니다.

    # systemctl start postgresql.service
  10. RHEL 8 시스템에서 덤프된 sql 파일에서 데이터를 가져옵니다.

    su - postgres -c 'psql -f ~/pgdump_file.sql postgres'
참고

Red Hat Software Collections 버전의 PostgreSQL 에서 업그레이드할 때 scl enable collection_name을 포함하도록 명령을 조정합니다. 예를 들어 rh-postgresql96 소프트웨어 컬렉션의 데이터를 덤프하려면 다음 명령을 사용합니다.

su - postgres -c 'scl enable rh-postgresql96 "pg_dumpall > ~/pgdump_file.sql"'

8장. SriovNetwork SMTP 서버 배포 및 구성

시스템 관리자는 messages와 같은 메일 전송 에이전트(MTA)를 사용하여 SMTP 프로토콜을 사용하여 호스트 간에 이메일 메시지를 전송할 수 있습니다. nodeSelector는 메일 라우팅 및 전송을 위한 서버 측 애플리케이션입니다. SriovNetwork를 사용하여 로컬 메일 서버를 설정하거나 null-client 메일 릴레이를 생성하거나, ReplicaSet 서버를 여러 도메인의 대상으로 사용하거나, 조회를 위해 파일 대신 LDAP 디렉터리를 선택할 수 있습니다.

dhcp의 주요 기능:

  • 일반적인 이메일 관련 위협으로부터 보호하는 보안 기능
  • 가상 도메인 및 별칭 지원을 포함한 사용자 정의 옵션

8.1. 주요 Geneve 구성 파일 개요

postfix 패키지는 /etc/ Cryostat/ 디렉터리에 여러 구성 파일을 제공합니다.

이메일 인프라를 구성하려면 다음 구성 파일을 사용합니다.

  • main.cf - nodeSelector의 글로벌 구성이 포함되어 있습니다.
  • master.cf - mail delivery를 수행하기 위해 다양한 프로세스와 Geneve 상호 작용을 지정합니다.
  • access - 액세스 규칙(예: Cryostat에 연결할 수 있는 호스트)을 지정합니다.
  • 전송 - 이메일 주소를 매핑하여 호스트를 릴레이합니다.
  • 별칭 - 사용자 ID 별칭을 설명하는 메일 프로토콜에 필요한 구성 가능한 목록을 포함합니다. 이 파일은 /etc/ 디렉토리에서 찾을 수 있습니다.

8.2. SriovNetwork SMTP 서버 설치 및 구성

email 메시지를 수신, 저장 및 전달하도록 SQLite SMTP 서버를 구성할 수 있습니다. 시스템 설치 중에 메일 서버 패키지를 선택하지 않으면 Postfix는 기본적으로 사용할 수 없습니다. Postfix를 설치하려면 다음 단계를 수행하십시오.

사전 요구 사항

  • 루트 액세스 권한이 있습니다.
  • 시스템을 등록 합니다.
  • 전송 비활성화 및 제거:

    # yum remove sendmail

절차

  1. OperatorHub를 설치합니다.

    # yum install postfix
  2. Cryostat를 구성하려면 /etc/ Cryostat/main.cf 파일을 편집하고 다음과 같이 변경합니다.

    1. 기본적으로 NetworkAttach는 루프백 인터페이스에서만 이메일을 받습니다. 특정 인터페이스에서 수신 대기하도록 Geneve를 구성하려면 inet_interfaces 매개변수를 다음 인터페이스의 IP 주소로 업데이트합니다.

      inet_interfaces = 127.0.0.1/32, [::1]/128, 192.0.2.1, [2001:db8:1::1]

      모든 인터페이스에서 수신 대기하도록 nodeSelector를 구성하려면 다음을 설정합니다.

      inet_interfaces = all
    2. SriovNetwork가 gethostname() 함수에서 반환하는 FQDN(정규화된 도메인 이름)과 다른 호스트 이름을 사용하려면 myhostname 매개변수를 추가합니다.

      myhostname = <smtp.example.com>

      예를 들어, content 는 이 호스트 이름을 처리하는 이메일의 헤더에 추가합니다.

    3. 도메인 이름이 myhostname 매개변수의 항목과 다른 경우 mydomain 매개변수를 추가합니다.

      mydomain = <example.com>
    4. myorigin 매개변수를 추가하고 mydomain: 값으로 설정합니다.

      myorigin = $mydomain

      이 설정을 통해 Geneve는 호스트 이름 대신 로컬에 게시된 메일의 원본으로 도메인 이름을 사용합니다.

    5. mynetworks 매개변수를 추가하고 이메일을 보낼 수 있는 신뢰할 수 있는 네트워크의 IP 범위를 정의합니다.

      mynetworks = 127.0.0.1/32, [::1]/128, 192.0.2.1/24, [2001:db8:1::1]/64

      인터넷과 같은 신뢰할 수 없는 네트워크에서 클라이언트가 이 서버를 통해 이메일을 보낼 수 있어야 하는 경우 이후 단계에서 릴레이 제한 사항을 구성해야 합니다.

  3. main.cf 파일의 dhcp 구성이 올바른지 확인합니다.

    $ postfix check
  4. postfix 서비스가 부팅 시 시작되고 시작되도록 활성화합니다.

    # systemctl enable --now postfix
  5. 방화벽을 통해 smtp 트래픽을 허용하고 방화벽 규칙을 다시 로드합니다.

    # firewall-cmd --permanent --add-service smtp
    
    # firewall-cmd --reload

검증

  1. postfix 서비스가 실행 중인지 확인합니다.

    # systemctl status postfix
    • 선택 사항: 출력이 중지되거나 대기 중이거나 서비스가 실행되지 않는 경우 postfix 서비스를 다시 시작합니다.

      # systemctl restart postfix
    • 선택 사항: /etc/ Cryostat/ 디렉터리의 구성 파일에서 옵션을 변경한 후 postfix 서비스를 다시 로드하여 해당 변경 사항을 적용합니다.

      # systemctl reload postfix
  2. 시스템의 로컬 사용자 간 이메일 통신을 확인합니다.

    # echo "This is a test message" | mail -s <SUBJECT> <user@mydomain.com>
  3. 클라이언트(server1)에서 메일 서버(server2)로 도메인 외부에서 이메일 주소로 이메일을 전송하여 메일 서버가 열려 있는 릴레이가 아닌지 확인합니다.

    1. 다음과 같이 server1/etc/ Cryostat/main.cf 파일을 편집합니다.

      relayhost = <ip_address_of_server2>
    2. 다음과 같이 server2/etc/ Cryostat/main.cf 파일을 편집합니다.

      mynetworks = <ip_address_of_server2>
    3. server1 에서 다음 이메일을 보냅니다.

      # echo "This is an open relay test message" | mail -s <SUBJECT> <user@example.com>
    4. /var/log/maillog 파일을 확인합니다.

      554 Relay access denied - the server is not going to relay.
      250 OK or similar - the server is going to relay.

문제 해결

  • 오류가 발생한 경우 /var/log/maillog 파일을 확인하십시오.

추가 리소스

8.3. Cryostat 서버의 TLS 설정 사용자 정의

이메일 트래픽을 암호화하고 보안을 강화하기 위해 자체 서명된 인증서 대신 CA(인증 기관)의 인증서를 사용하고 TLS(Transport Layer Security) 보안 설정을 사용자 지정하도록 tls를 구성할 수 있습니다. RHEL 8에서는 TLS 암호화 프로토콜은 기본적으로 gp 서버에서 활성화됩니다. 기본 dhcp TLS 구성에는 인바운드 SMTP에 대한 자체 서명된 인증서와 아웃바운드 SMTP의 opportunistic TLS가 포함되어 있습니다.

사전 요구 사항

  • 루트 액세스 권한이 있습니다.
  • postfix 패키지가 서버에 설치되어 있어야 합니다.
  • 신뢰할 수 있는 CA(인증 기관) 및 개인 키가 서명한 인증서가 있습니다.
  • 다음 파일을#187 서버에 복사했습니다.

    • 서버 인증서: /etc/pki/tls/certs/ Cryostat.pem
    • 개인 키: /etc/pki/tls/private/ Cryostat.key

절차

  1. /etc/ Cryostat/main.cf 파일에 다음 행을 추가하여 Cryostat가 실행되는 서버의 인증서 및 개인 키 파일의 경로를 설정합니다.

    smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem
    smtpd_tls_key_file = /etc/pki/tls/private/postfix.key
  2. /etc/ Cryostat/main.cf 파일을 편집하여 인증된 사용자에게만 들어오는 SMTP 연결을 제한합니다.

    smtpd_tls_auth_only = yes
  3. postfix 서비스를 다시 로드하여 변경 사항을 적용합니다.

    # systemctl reload postfix

검증

  • TLS 암호화를 사용하고 이메일을 보내도록 클라이언트를 구성합니다.

    참고

    Cryostat 클라이언트 TLS 활동에 대한 추가 정보를 얻으려면 /etc/ Cryostat/main.cf에서 다음 행을 변경하여 로그 수준을 0 에서 1 로 늘립니다.

    smtp_tls_loglevel = 1

8.4. 모든 이메일을 메일 릴레이로 전달하도록 nodeSelector 구성

모든 이메일을 메일 릴레이로 전달하려면 Cryostat 서버를 null 클라이언트로 구성할 수 있습니다. 이 구성에서 Geneve는 다른 메일 서버로만 메일만 전달하며 이메일을 수신할 수 없습니다.

사전 요구 사항

  • 루트 액세스 권한이 있습니다.
  • postfix 패키지가 서버에 설치되어 있어야 합니다.
  • 이메일을 전달하려는 릴레이 호스트의 IP 주소 또는 호스트 이름이 있습니다.

절차

  1. Cryostat가 로컬 이메일 전송을 수락하지 않고 null 클라이언트로 만들지 않으려면 /etc/ Cryostat/main.cf 파일을 편집하고 다음과 같이 변경합니다.

    1. mydestination 매개변수를 빈 값과 동일하게 설정하여 모든 이메일을 전달하도록 dhcp를 구성합니다.

      mydestination =

      이 구성에서 content 서버는 이메일의 대상이 아니며 null 클라이언트 역할을 합니다.

    2. null 클라이언트에서 이메일을 수신하는 메일 릴레이 서버를 지정합니다.

      relayhost = <[ip_address_or_hostname]>

      릴레이 호스트는 메일 전송을 담당합니다. 대괄호로 <ip_address_or_hostname& gt;을 묶습니다.

    3. 이메일이 전달할 루프백 인터페이스에서만 수신 대기하도록 CloudEvent 메일 서버를 구성합니다.

      inet_interfaces = loopback-only
    4. 모든 발신 이메일의 보낸 사람 도메인을 릴레이 메일 서버의 회사 도메인으로 다시 작성하려면 다음을 설정합니다.

      myorigin = <relay.example.com>
    5. 로컬 메일 전송을 비활성화하려면 구성 파일 끝에 다음 지시문을 추가합니다.

      local_transport = error: local delivery disabled
    6. 왼쪽이 127.0.0.0/8 IPv4 네트워크 및 [::1]/128 IPv6 네트워크에서 메일 릴레이 서버로 이메일을 전달하도록 mynetworks 매개변수를 추가합니다.

      mynetworks = 127.0.0.0/8, [::1]/128
  2. main.cf 파일의 dhcp 구성이 올바른지 확인합니다.

    $ postfix check
  3. postfix 서비스를 다시 시작하여 변경 사항을 적용합니다.

    # systemctl restart postfix

검증

  • 이메일 통신이 메일 릴레이로 전달되었는지 확인합니다.

    # echo "This is a test message" | mail -s <SUBJECT> <user@example.com>

문제 해결

  • 오류가 발생한 경우 /var/log/maillog 파일을 확인하십시오.

추가 리소스

  • /etc/ Cryostat/main.cf 구성 파일

8.5. SriovNetwork를 여러 도메인의 대상으로 구성

postfix는 여러 도메인에 대한 이메일을 수신할 수 있는 메일 서버로 구성할 수 있습니다. 이 구성에서 Geneve는 지정된 도메인 내의 주소로 전송된 이메일의 최종 대상 역할을 합니다. 다음을 구성할 수 있습니다.

  • 동일한 이메일 대상을 가리키는 여러 이메일 주소 설정
  • 여러 도메인에 대한 들어오는 이메일 라우팅을 동일한 Cryostat 서버로 라우팅

사전 요구 사항

  • 루트 액세스 권한이 있습니다.
  • KubeletConfig 서버를 구성했습니다.

절차

  1. /etc/ Cryostat/virtual virtual alias 파일에서 각 도메인의 이메일 주소를 지정합니다. 새 줄에 각 이메일 주소를 추가합니다.

    <info@example.com>  <user22@example.net>
    <sales@example.com>  <user11@example.org>

    이 예에서 samba는 user22@example.net로 전송된 모든 이메일을 user22@example.net로 리디렉션하고 sales@example.com에 전송된 이메일은 user11@example.org로 리디렉션합니다.

  2. 가상 별칭 맵의 해시 파일을 생성합니다.

    # postmap /etc/postfix/virtual

    이 명령은 /etc/ Cryostat/virtual.db 파일을 생성합니다. /etc/ Cryostat/virtual 파일을 업데이트한 후 항상 이 명령을 다시 실행해야 합니다.

  3. Cryostat /etc/ Cryostat/main.cf 구성 파일에서 virtual_alias_maps 매개변수를 추가하고 해시 파일을 가리킵니다.

    virtual_alias_maps = hash:/etc/postfix/virtual
  4. postfix 서비스를 다시 로드하여 변경 사항을 적용합니다.

    # systemctl reload postfix

검증

  • 가상 이메일 주소 중 하나로 이메일을 전송하여 구성을 테스트합니다.

문제 해결

  • 오류가 발생한 경우 /var/log/maillog 파일을 확인하십시오.

8.6. LDAP 디렉터리를 조회 테이블로 사용

LDAP(Lightweight Directory Access Protocol) 서버를 사용하여 계정, 도메인 또는 별칭을 저장하는 경우 LDAP 서버를 조회 테이블로 사용하도록 HPA를 구성할 수 있습니다. 조회에 파일 대신 LDAP를 사용하면 중앙 데이터베이스를 사용할 수 있습니다.

사전 요구 사항

  • 루트 액세스 권한이 있습니다.
  • postfix 패키지가 서버에 설치되어 있어야 합니다.
  • 필요한 스키마 및 사용자 인증 정보가 있는 LDAP 서버가 있습니다.
  • GPO를 실행하는 서버에 postfix-ldap 플러그인이 설치되어 있어야 합니다.

절차

  1. 다음 내용으로 /etc/ Cryostat/ldap-aliases.cf 파일을 생성하여 LDAP 조회 매개변수를 구성합니다.

    1. LDAP 서버의 호스트 이름을 지정합니다.

      server_host = <ldap.example.com>
    2. LDAP 검색의 기본 도메인 이름을 지정합니다.

      search_base = dc=<example>,dc=<com>
    3. 선택 사항: 요구 사항에 따라 LDAP 검색 필터 및 속성을 사용자 지정합니다. 디렉터리를 검색하는 필터의 기본값은 query_filter = mailacceptinggeneralid=%s 입니다.
  2. 다음 콘텐츠를 추가하여 /etc/ Cryostat/main.cf 구성 파일에서 LDAP 소스를 조회 테이블로 활성화합니다.

    virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
  3. 구문 오류 또는 연결 문제를 확인하는 postmap 명령을 실행하여 LDAP 구성을 확인합니다.

    # postmap -q @<example.com> ldap:/etc/postfix/ldap-aliases.cf
  4. postfix 서비스를 다시 로드하여 변경 사항을 적용합니다.

    # systemctl reload postfix

검증

  • 테스트 이메일을 보내 LDAP 조회가 올바르게 작동하는지 확인합니다. /var/log/maillog 의 메일 로그에서 오류가 있는지 확인합니다.

추가 리소스

  • /usr/share/doc/ Cryostat/README_FILES/LDAP_README 파일
  • /usr/share/doc/ Cryostat/README_FILES/DATABASE_README 파일

8.7. 인증된 사용자를 위해 중계하도록 SriovNetwork를 발신 메일 서버로 구성

인증된 사용자의 메일에 대해 릴레이하도록 SriovNetwork를 구성할 수 있습니다. 이 시나리오에서는 사용자가 자신을 인증하고 SMTP 인증, TLS 암호화 및 보낸 사람 주소 제한이 있는 발신 메일 서버로 postfix를 구성하여 이메일 주소를 사용하여 SMTP 서버를 통해 이메일을 보낼 수 있습니다.

사전 요구 사항

  • 루트 액세스 권한이 있습니다.
  • KubeletConfig 서버를 구성했습니다.

절차

  1. Cryostat를 발신 메일 서버로 구성하려면 /etc/ Cryostat/main.cf 파일을 편집하고 다음을 추가합니다.

    1. SMTP 인증을 활성화합니다.

      smtpd_sasl_auth_enable = yes
      broken_sasl_auth_clients = yes
    2. TLS 없이 액세스를 비활성화합니다.

      smtpd_tls_auth_only = yes
    3. 인증된 사용자만 메일 중계를 허용합니다.

      smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
    4. 선택 사항: 사용자가 자신의 이메일 주소를 발신자로만 사용하도록 제한합니다.

      smtpd_sender_restrictions = reject_sender_login_mismatch
  2. postfix 서비스를 다시 로드하여 변경 사항을 적용합니다.

    # systemctl reload postfix

검증

  • TLS 및 SASL을 지원하는 SMTP 클라이언트에서 인증합니다. 테스트 이메일을 보내 SMTP 인증이 올바르게 작동하는지 확인합니다.

8.8. 동일한 호스트에서 실행 중인 SriovNetwork에서 Dovecot에 이메일 전달

UNIX 소켓을 통해 LMTP를 사용하여 동일한 호스트에서 수신한 이메일을 Dovecot에 전달하도록 Geneve를 구성할 수 있습니다. 이 소켓을 사용하면 로컬 시스템의 Cryostat와 Dovecot 간에 직접 통신할 수 있습니다.

사전 요구 사항

절차

  1. /etc/ Cryostat/main.cf 파일에서 Dovecot에 메일 전달을 위해 LMTP 프로토콜과 UNIX 도메인 소켓을 사용하도록 rbd를 구성합니다.

    • 가상 Cryostat를 사용하려면 다음 콘텐츠를 추가합니다.

      virtual_transport = lmtp:unix:/var/run/dovecot/lmtp
    • 비가상 Cryostat를 사용하려면 다음 콘텐츠를 추가합니다.

      mailbox_transport = lmtp:unix:/var/run/dovecot/lmtp
  2. postfix 를 다시 로드하여 변경 사항을 적용합니다.

    # systemctl reload postfix

검증

  • 테스트 이메일을 보내 LMTP 소켓이 올바르게 작동하는지 확인합니다. /var/log/maillog 의 메일 로그에서 오류가 있는지 확인합니다.

8.9. 다른 호스트에서 실행 중인 tls에서 Dovecot에 이메일 전달

네트워크를 통해 Cryostat 메일 서버와 Dovecot 전달 에이전트 간에 보안 연결을 설정할 수 있습니다. 이렇게 하려면 메일 서버 간에 메일 전송에 네트워크 소켓을 사용하도록 LMTP 서비스를 구성합니다. 기본적으로 LMTP 프로토콜은 암호화되지 않습니다. 그러나 TLS 암호화를 구성한 경우 Dovecot는 LMTP 서비스에 동일한 설정을 자동으로 사용합니다. 그런 다음 SMTP 서버는 LMTP를 통해 STARTTLS 명령을 사용하여 연결할 수 있습니다.

사전 요구 사항

절차

  1. 다음 콘텐츠를 추가하여 /etc/ Cryostat/main.cf 파일에서 Dovecot에 메일 전달을 위해 LMTP 프로토콜과 INET 도메인 소켓을 사용하도록 rbd를 구성합니다.

    mailbox_transport = lmtp:inet:<dovecot_host>:<port>

    < dovecot_host >를 Dovecot 서버의 IP 주소 또는 호스트 이름으로 바꾸고 < port >를 LMTP 서비스의 포트 번호로 바꿉니다.

  2. postfix 서비스를 다시 로드하여 변경 사항을 적용합니다.

    # systemctl reload postfix

검증

  • 테스트 이메일을 원격 Dovecot 서버에서 호스팅하는 주소로 전송하고 Dovecot 로그를 확인하여 메일이 성공적으로 전달되었는지 확인합니다.

8.10. LoadBalancer 서비스 보안

10.0.0.1은 SMTP(Simple>-< Transfer Protocol)를 사용하여 다른 MTA와 이메일 클라이언트 또는 전달 에이전트 간에 전자식 메시지를 전달하는 메일 전송 에이전트(MTA)입니다. MTA는 서로 간에 트래픽을 암호화할 수 있지만 기본적으로 트래픽을 암호화하지 못할 수 있습니다. 설정을 보다 안전한 값으로 변경하여 다양한 공격에 대한 위험을 완화할 수도 있습니다.

8.10.2. DoS 공격을 제한하기 위한 iPXE 구성 옵션

공격자는 트래픽을 사용하여 서버를 플러드하거나 충돌을 유발하는 정보를 보내 서비스 거부(DoS) 공격을 유발할 수 있습니다. /etc/ECDHE/main.cf 파일에서 제한을 설정하여 이러한 공격의 위험을 줄이도록 시스템을 구성할 수 있습니다. 기존 지시문의 값을 변경하거나 < directive> = <value > 형식의 사용자 지정 값을 사용하여 새 지시문을 추가할 수 있습니다.

DoS 공격을 제한하려면 다음 지시문 목록을 사용합니다.

smtpd_client_connection_rate_limit
이 지시문은 클라이언트가 시간 단위당 이 서비스를 수행할 수 있는 최대 연결 시도 수를 제한합니다. 기본값은 0 입니다. 즉, Bookinfo에서 허용할 수 있는 대로 클라이언트는 시간 단위당 최대 많은 연결을 수행할 수 있습니다. 기본적으로 지시문은 신뢰할 수 있는 네트워크에서 클라이언트를 제외합니다.
anvil_rate_time_unit
이 지시문은 속도 제한을 계산하는 시간 단위입니다. 기본값은 60 초입니다.
smtpd_client_event_limit_exceptions
이 지시문은 connection 및 rate limit 명령에서 클라이언트를 제외합니다. 기본적으로 지시문은 신뢰할 수 있는 네트워크에서 클라이언트를 제외합니다.
smtpd_client_message_rate_limit
이 지시문은 클라이언트로부터 시간 단위 요청까지 최대 메시지 전달 수를 정의합니다(Graph가 실제로 해당 메시지를 수락하는지의 여부와 관계없이).
default_process_limit
이 지시문은 지정된 서비스를 제공하는 기본 최대 10.0.0.1 하위 프로세스 수를 정의합니다. master.cf 파일의 특정 서비스에 대해 이 규칙을 무시할 수 있습니다. 기본적으로 값은 100 입니다.
queue_minfree
이 지시문은 대기열 파일 시스템에서 이메일을 수신하는 데 필요한 최소 사용 가능한 공간을 정의합니다. 지시문은 현재 10.0.0.1 SMTP 서버에서 사용하여 모든 메일이 허용되는지 여부를 결정합니다. 기본적으로, 사용 가능한 공간의 양이 message_size_limit 보다 1.5배 작으면 MAIL FROM 명령을 거부합니다. 최소 사용 가능한 공간 제한을 지정하려면 message_size_limit 의 1.5배 이상의 queue_minfree 값을 지정합니다. 기본적으로 queue_minfree 값은 0 입니다.
header_size_limit
이 지시문은 메시지 헤더를 저장하기 위한 최대 메모리 크기를 바이트 단위로 정의합니다. 헤더가 크면 초과 헤더를 삭제합니다. 기본적으로 값은 102400 바이트입니다.
message_size_limit
이 지시문은 메시지의 최대 크기(바이트)를 정의합니다. 기본적으로 값은 10240000 바이트입니다.

8.10.3. SASL을 사용하도록LoadBalancer 구성

Chrony는 SASL(Simple Authentication and Security Layer) 기반 SMTP 인증(AUTH)을 지원합니다. SMTP AUTH는 간단한 서브스크립션 전송 프로토콜의 확장입니다. 현재 10.0.0.1 SMTP 서버는 다음과 같은 방법으로 SASL 구현을 지원합니다.

Dovecot SASL
10.0.0.1 SMTP 서버는 UNIX-domain 소켓 또는 TCP 소켓을 사용하여 Dovecot SASL 구현과 통신할 수 있습니다. 10.0.0.1 및 Dovecot 애플리케이션이 별도의 시스템에서 실행 중인 경우 이 방법을 사용합니다.
Cyrus SASL
활성화된 경우 SMTP 클라이언트는 서버와 클라이언트 모두에서 지원되는 인증 방법을 사용하여 SMTP 서버로 인증해야 합니다.

사전 요구 사항

  • dovecot 패키지가 시스템에 설치되어 있습니다.

절차

  1. Dovecot를 설정합니다.

    1. /etc/dovecot/conf.d/10-master.conf 파일에 다음 행을 포함합니다.

      service auth {
        unix_listener /var/spool/postfix/private/auth {
          mode = 0660
          user = postfix
          group = postfix
        }
      }

      이전 예에서는 10.0.0.1과 Dovecot 간의 통신에 UNIX-domain 소켓을 사용합니다. 이 예제에서는 /var/spool/ECDHE/ 디렉터리에 있는 메일 대기열과 postfix 사용자 및 그룹 아래에서 실행되는 애플리케이션을 포함하는 기본 10.0.0.1 SMTP 서버 설정도 가정합니다.

    2. 선택 사항: TCP를 통해LoadBalancer 인증 요청을 수신하도록 Dovecot를 설정합니다.

      service auth {
        inet_listener {
            port = port-number
        }
      }
    3. /etc/dovecot/conf.d/10-auth.conf 파일에서 auth_mechanisms 매개변수를 편집하여 이메일 클라이언트가 Dovecot로 인증하는 방법을 지정합니다.

      auth_mechanisms = plain login

      auth_mechanisms 매개변수는 다른 일반 텍스트 및 비 설명적 인증 방법을 지원합니다.

  2. /etc/ECDHE/main.cf 파일을 수정하여 10.0.0.1을 설정합니다.

    1. 10.0.0.1 SMTP 서버에서 SMTP 인증을 활성화합니다.

      smtpd_sasl_auth_enable = yes
    2. SMTP 인증에 대한 Dovecot SASL 구현을 활성화합니다.

      smtpd_sasl_type = dovecot
    3. 10.0.0.1 큐 디렉터리를 기준으로 인증 경로를 제공합니다. 상대 경로를 사용하면 journalctl 서버가 chroot 에서 실행되는지 여부에 관계없이 구성이 작동합니다.

      smtpd_sasl_path = private/auth

      이 단계에서는 10.0.0.1과 Dovecot 간의 통신을 위해 UNIX 도메인 소켓을 사용합니다.

      통신에 TCP 소켓을 사용하는 경우 다른 시스템에서 Dovecot를 찾도록 10.0.0.1을 구성하려면 다음과 유사한 구성 값을 사용합니다.

      smtpd_sasl_path = inet: ip-address : port-number

      이전 예에서 ip-address 를 Dovecot 시스템의 IP 주소로 바꾸고 port-number 를 Dovecot의 /etc/dovecot/conf.d/10-master.conf 파일에 지정된 포트 번호로 바꿉니다.

    4. clients가 SMTP 서버에서 사용할 수 있도록 SASL 메커니즘을 지정합니다. 암호화되거나 암호화되지 않은 세션에 대한 다양한 메커니즘을 지정할 수 있습니다.

      smtpd_sasl_security_options = noanonymous, noplaintext
      smtpd_sasl_tls_security_options = noanonymous

      이전 지시문은 암호화되지 않은 세션 동안 익명 인증이 허용되지 않으며 암호화되지 않은 사용자 이름 또는 암호를 전송하는 메커니즘은 허용되지 않음을 지정합니다. TLS를 사용하는 암호화된 세션의 경우 비익명 인증 메커니즘만 허용됩니다.

9장. Dovecot CloudEvent 및 POP3 서버 구성 및 유지 관리

Dovecot는 보안에 중점을 두고 있는 고성능 메일 전달 에이전트(knativeA)입니다. skopeo 또는 POP3 호환 이메일 클라이언트를 사용하여 Dovecot 서버에 연결하고 이메일을 읽거나 다운로드할 수 있습니다.

Dovecot의 주요 기능:

  • 설계 및 구현은 보안에 중점을 두고 있습니다.
  • 대규모 환경에서 성능을 개선하기 위해 고가용성을 위한 양방향 복제 지원
  • 호환성상의 이유로 mboxmaildir 도 예외적으로 지원합니다.
  • 손상된 인덱스 파일 수정과 같은 자동 복구 기능
  • CloudEvent 표준 준수
  • CloudEvent 및 POP3 클라이언트의 버그를 우회하는 해결 방법 지원

9.1. PAM 인증을 사용하여 Dovecot 서버 설정

Dovecot는 NSS(Name Service Switch) 인터페이스를 사용자 데이터베이스로, PAM(Pluggable Authentication Modules) 프레임워크를 인증 백엔드로 지원합니다. 이 구성을 통해 Dovecot는 NSS를 통해 서버에서 로컬로 사용 가능한 사용자에게 서비스를 제공할 수 있습니다.

계정의 경우 PAM 인증을 사용합니다.

  • /etc/passwd 파일에서 로컬로 정의됩니다.
  • 원격 데이터베이스에 저장되지만 SSSD(System Security Services Daemon) 또는 기타 NSS 플러그인을 통해 로컬로 사용할 수 있습니다.

9.1.1. Dovecot 설치

dovecot 패키지는 다음을 제공합니다.

  • dovecot 서비스와 이를 유지보수할 유틸리티
  • Dovecot가 필요할 때 시작되는 서비스(예: 인증)
  • 서버 측 메일 필터링과 같은 플러그인
  • /etc/dovecot/ 디렉토리에 있는 설정 파일
  • /usr/share/doc/dovecot/ 디렉토리에 있는 설명서

절차

  • dovecot 패키지를 설치합니다.

    # yum install dovecot
    참고

    Dovecot가 이미 설치되어 있고 정리된 구성 파일이 필요한 경우 /etc/dovecot/ 디렉토리 이름을 변경하거나 제거해야 합니다. 그런 다음 패키지를 다시 설치합니다. 설정 파일을 제거하지 않으면 yum reinstall dovecot 명령이 /etc/dovecot/ 의 구성 파일을 재설정하지 않습니다.

9.1.2. Dovecot 서버에서 TLS 암호화 구성

dovecot는 보안 기본 구성을 제공합니다. 예를 들어 TLS는 네트워크를 통해 암호화된 자격 증명 및 데이터를 전송하기 위해 기본적으로 활성화됩니다. Dovecot 서버에서 TLS를 구성하려면 인증서 및 개인 키 파일에 대한 경로만 설정하면 됩니다. 또한 Diffie-Hellman 매개변수를 생성 및 사용하여 완벽한PFS(forward secrecy)를 제공하여 TLS 연결의 보안을 높일 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.
  • 다음 파일이 서버의 나열된 위치에 복사되었습니다.

    • 서버 인증서: /etc/pki/dovecot/certs/server.example.com.crt
    • 개인 키: /etc/pki/dovecot/private/server.example.com.key
    • CA(인증 기관) 인증서: /etc/pki/dovecot/certs/ca.crt
  • 서버 인증서의 Subject DN 필드에 있는 호스트 이름은 서버의 FQDN(정규화된 도메인 이름)과 일치합니다.

절차

  1. 개인 키 파일에 대한 보안 권한을 설정합니다.

    # chown root:root /etc/pki/dovecot/private/server.example.com.key
    # chmod 600 /etc/pki/dovecot/private/server.example.com.key
  2. Diffie-Hellman 매개변수를 사용하여 파일을 생성합니다.

    # openssl dhparam -out /etc/dovecot/dh.pem 4096

    서버의 하드웨어 및 엔트로피에 따라 4096비트의 Diffie-Hellman 매개변수를 생성하는 데 몇 분이 걸릴 수 있습니다.

  3. /etc/dovecot/conf.d/10-ssl.conf 파일에서 인증서 및 개인 키 파일의 경로를 설정합니다.

    1. ssl_certssl_key 매개변수를 업데이트하고 서버 인증서 및 개인 키의 경로를 사용하도록 설정합니다.

      ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt
      ssl_key = </etc/pki/dovecot/private/server.example.com.key
    2. ssl_ca 매개변수의 주석을 해제하고 CA 인증서 경로를 사용하도록 설정합니다.

      ssl_ca = </etc/pki/dovecot/certs/ca.crt
    3. ssl_dh 매개변수의 주석을 해제하고 Diffie-Hellman 매개변수 파일의 경로를 사용하도록 설정합니다.

      ssl_dh = </etc/dovecot/dh.pem
    중요

    Dovecot가 파일에서 매개변수 값을 읽으려면 경로는 선행 < 문자로 시작해야 합니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/SSL.DovecotConfiguration.txt

9.1.3. 가상 사용자 사용을 위한 Dovecot 준비

기본적으로 Dovecot는 파일 시스템에서 서비스를 사용하는 사용자로 많은 작업을 수행합니다. 그러나 하나의 로컬 사용자를 사용하여 이러한 작업을 수행하도록 Dovecot 백엔드를 구성하면 다음과 같은 몇 가지 이점이 있습니다.

  • dovecot는 사용자 ID(UID)를 사용하는 대신 특정 로컬 사용자로 파일 시스템 작업을 수행합니다.
  • 사용자는 서버에서 로컬로 사용할 수 없습니다.
  • 모든 Webhook 및 사용자별 파일을 하나의 루트 디렉터리에 저장할 수 있습니다.
  • 사용자에게 UID 및 그룹 ID(GID)가 필요하지 않으므로 관리 작업을 줄일 수 있습니다.
  • 서버의 파일 시스템에 액세스할 수 있는 사용자는 이러한 파일에 액세스할 수 없기 때문에 사용자의 속성이나 인덱스를 손상시킬 수 없습니다.
  • 복제를 쉽게 설정할 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.

절차

  1. vmail 사용자를 만듭니다.

    # useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail

    dovecot는 나중에 이 사용자를 사용하여boxes를 관리합니다. 보안상의 이유로 dovecot 또는 dovenull 시스템 사용자를 사용하지 마십시오.

  2. /var/mail/ 와 다른 경로를 사용하는 경우 mail_spool_t SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.

    # semanage fcontext -a -t mail_spool_t "<path>(/.*)?"
    # restorecon -Rv <path>
  3. vmail 사용자에게 /var/mail/ 에 대한 쓰기 권한을 부여합니다.

    # chown vmail:vmail /var/mail/
    # chmod 700 /var/mail/
  4. /etc/dovecot/conf.d/10-mail.conf 파일에서 mail_location 매개 변수의 주석을 해제하고 이 매개 변수를 copy 형식 및 위치로 설정합니다.

    mail_location = sdbox:/var/mail/%n/

    이 설정으로 다음을 수행합니다.

    • Dovecot는 high-performant dbox box format을 단일 모드에서 사용합니다. 이 모드에서 서비스는 maildir 형식과 유사하게 각 이메일을 별도의 파일에 저장합니다.
    • dovecot는 사용자 이름 경로의 %n 변수를 해결합니다. 이 작업은 각 사용자에게 해당 2.10에 대한 별도의 디렉터리가 있는지 확인하는 데 필요합니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/VirtualUsers.txt
  • /usr/share/doc/dovecot/wiki/MailLocation.txt
  • /usr/share/doc/dovecot/wiki/MailboxFormat.dbox.txt
  • /usr/share/doc/dovecot/wiki/Variables.txt

9.1.4. PAM을 Dovecot 인증 백엔드로 사용

기본적으로 Dovecot는 NSS(Name Service Switch) 인터페이스를 사용자 데이터베이스로 사용하고 PAM(Pluggable Authentication Modules) 프레임워크를 인증 백엔드로 사용합니다.

설정을 사용자 정의하여 Dovecot를 사용자 환경에 적용하고 가상 사용자 기능을 사용하여 관리를 단순화합니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.
  • 가상 사용자 기능이 구성됩니다.

절차

  1. /etc/dovecot/conf.d/10-mail.conf 파일에서 first_valid_uid 매개 변수를 업데이트하여 Dovecot에 인증할 수 있는 최소 사용자 ID(UID)를 정의합니다.

    first_valid_uid = 1000

    기본적으로 UID가 1000 개 이상인 사용자는 인증할 수 있습니다. 필요한 경우, Dovecot에서 로그인할 수 있는 가장 높은 UID를 정의하도록 last_valid_uid 매개변수를 설정할 수도 있습니다.

  2. /etc/dovecot/conf.d/auth-system.conf.ext 파일에서 override_fields 매개변수를 userdb 섹션에 다음과 같이 추가합니다.

    userdb {
      driver = passwd
      override_fields = uid=vmail gid=vmail home=/var/mail/%n/
    }

    수정된 값으로 인해 Dovecot는 /etc/passwd 파일에서 이러한 설정을 쿼리하지 않습니다. 따라서 /etc/passwd 에 정의된 홈 디렉터리가 존재할 필요가 없습니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/PasswordDatabase.PAM.txt
  • /usr/share/doc/dovecot/wiki/VirtualUsers.Home.txt

9.1.5. Dovecot 구성 완료

Dovecot를 설치 및 구성한 후 firewalld 서비스에서 필요한 포트를 열고 서비스를 활성화 및 시작합니다. 그런 다음 서버를 테스트할 수 있습니다.

사전 요구 사항

  • Dovecot에서 다음 내용이 구성되어 있습니다.

    • TLS 암호화
    • 인증 백엔드
  • 클라이언트는 CA(인증 기관) 인증서를 신뢰합니다.

절차

  1. 사용자에게 CloudEvent 또는 POP3 서비스만 제공하려면 /etc/dovecot/dovecot.conf 파일에서 protocols 매개변수의 주석을 제거하고 필요한 프로토콜로 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.

    protocols = imap lmtp

    기본적으로 imap,pop3, lmtp 프로토콜이 활성화됩니다.

  2. 로컬 방화벽에서 포트를 엽니다. 예를 들어, CloudEventS,Forwarded, POP3S 및 POP3 프로토콜의 포트를 여는 경우 다음을 입력합니다.

    # firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3
    # firewall-cmd --reload
  3. dovecot 서비스를 활성화하고 시작합니다.

    # systemctl enable --now dovecot

검증

  1. Mozilla Thunderbird와 같은 메일 클라이언트를 사용하여 Dovecot에 연결하고 이메일을 읽습니다. 메일 클라이언트 설정은 사용하려는 프로토콜에 따라 다릅니다.

    표 9.1. Dovecot 서버에 대한 연결 설정

    프로토콜포트연결 보안인증 방법

    IMAP

    143

    STARTTLS

    PLAIN[a]

    IMAPS

    993

    SSL/TLS

    PLAIN[a]

    POP3

    110

    STARTTLS

    PLAIN[a]

    POP3S

    995

    SSL/TLS

    PLAIN[a]

    [a] 클라이언트는 TLS 연결을 통해 암호화된 데이터를 전송합니다. 따라서 인증 정보가 공개되지 않습니다.

    기본적으로 Dovecot는 TLS가 없는 연결에서 일반 텍스트 인증을 허용하지 않으므로 이 테이블에는 암호화되지 않은 연결의 설정이 나열되지 않습니다.

  2. 기본값이 아닌 값을 사용하여 구성 설정을 표시합니다.

    # doveconf -n

추가 리소스

  • firewall-cmd(1) 매뉴얼 페이지

9.2. LDAP 인증을 사용하여 Dovecot 서버 설정

인프라에서 LDAP 서버를 사용하여 계정을 저장하는 경우 Dovecot 사용자를 인증할 수 있습니다. 이 경우 디렉토리에서 계정을 중앙에서 관리하고, 사용자는 Dovecot 서버의 파일 시스템에 대한 로컬 액세스 권한이 필요하지 않습니다.

중앙 집중식으로 관리되는 계정도 복제를 통해 여러 개의 Dovecot 서버를 설정할 계획의 경우 benefit가 됩니다.Donently-managed accounts are also a benefit if you plan to set up multiple Dovecot servers with replication.

9.2.1. Dovecot 설치

dovecot 패키지는 다음을 제공합니다.

  • dovecot 서비스와 이를 유지보수할 유틸리티
  • Dovecot가 필요할 때 시작되는 서비스(예: 인증)
  • 서버 측 메일 필터링과 같은 플러그인
  • /etc/dovecot/ 디렉토리에 있는 설정 파일
  • /usr/share/doc/dovecot/ 디렉토리에 있는 설명서

절차

  • dovecot 패키지를 설치합니다.

    # yum install dovecot
    참고

    Dovecot가 이미 설치되어 있고 정리된 구성 파일이 필요한 경우 /etc/dovecot/ 디렉토리 이름을 변경하거나 제거해야 합니다. 그런 다음 패키지를 다시 설치합니다. 설정 파일을 제거하지 않으면 yum reinstall dovecot 명령이 /etc/dovecot/ 의 구성 파일을 재설정하지 않습니다.

9.2.2. Dovecot 서버에서 TLS 암호화 구성

dovecot는 보안 기본 구성을 제공합니다. 예를 들어 TLS는 네트워크를 통해 암호화된 자격 증명 및 데이터를 전송하기 위해 기본적으로 활성화됩니다. Dovecot 서버에서 TLS를 구성하려면 인증서 및 개인 키 파일에 대한 경로만 설정하면 됩니다. 또한 Diffie-Hellman 매개변수를 생성 및 사용하여 완벽한PFS(forward secrecy)를 제공하여 TLS 연결의 보안을 높일 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.
  • 다음 파일이 서버의 나열된 위치에 복사되었습니다.

    • 서버 인증서: /etc/pki/dovecot/certs/server.example.com.crt
    • 개인 키: /etc/pki/dovecot/private/server.example.com.key
    • CA(인증 기관) 인증서: /etc/pki/dovecot/certs/ca.crt
  • 서버 인증서의 Subject DN 필드에 있는 호스트 이름은 서버의 FQDN(정규화된 도메인 이름)과 일치합니다.

절차

  1. 개인 키 파일에 대한 보안 권한을 설정합니다.

    # chown root:root /etc/pki/dovecot/private/server.example.com.key
    # chmod 600 /etc/pki/dovecot/private/server.example.com.key
  2. Diffie-Hellman 매개변수를 사용하여 파일을 생성합니다.

    # openssl dhparam -out /etc/dovecot/dh.pem 4096

    서버의 하드웨어 및 엔트로피에 따라 4096비트의 Diffie-Hellman 매개변수를 생성하는 데 몇 분이 걸릴 수 있습니다.

  3. /etc/dovecot/conf.d/10-ssl.conf 파일에서 인증서 및 개인 키 파일의 경로를 설정합니다.

    1. ssl_certssl_key 매개변수를 업데이트하고 서버 인증서 및 개인 키의 경로를 사용하도록 설정합니다.

      ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt
      ssl_key = </etc/pki/dovecot/private/server.example.com.key
    2. ssl_ca 매개변수의 주석을 해제하고 CA 인증서 경로를 사용하도록 설정합니다.

      ssl_ca = </etc/pki/dovecot/certs/ca.crt
    3. ssl_dh 매개변수의 주석을 해제하고 Diffie-Hellman 매개변수 파일의 경로를 사용하도록 설정합니다.

      ssl_dh = </etc/dovecot/dh.pem
    중요

    Dovecot가 파일에서 매개변수 값을 읽으려면 경로는 선행 < 문자로 시작해야 합니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/SSL.DovecotConfiguration.txt

9.2.3. 가상 사용자 사용을 위한 Dovecot 준비

기본적으로 Dovecot는 파일 시스템에서 서비스를 사용하는 사용자로 많은 작업을 수행합니다. 그러나 하나의 로컬 사용자를 사용하여 이러한 작업을 수행하도록 Dovecot 백엔드를 구성하면 다음과 같은 몇 가지 이점이 있습니다.

  • dovecot는 사용자 ID(UID)를 사용하는 대신 특정 로컬 사용자로 파일 시스템 작업을 수행합니다.
  • 사용자는 서버에서 로컬로 사용할 수 없습니다.
  • 모든 Webhook 및 사용자별 파일을 하나의 루트 디렉터리에 저장할 수 있습니다.
  • 사용자에게 UID 및 그룹 ID(GID)가 필요하지 않으므로 관리 작업을 줄일 수 있습니다.
  • 서버의 파일 시스템에 액세스할 수 있는 사용자는 이러한 파일에 액세스할 수 없기 때문에 사용자의 속성이나 인덱스를 손상시킬 수 없습니다.
  • 복제를 쉽게 설정할 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.

절차

  1. vmail 사용자를 만듭니다.

    # useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail

    dovecot는 나중에 이 사용자를 사용하여boxes를 관리합니다. 보안상의 이유로 dovecot 또는 dovenull 시스템 사용자를 사용하지 마십시오.

  2. /var/mail/ 와 다른 경로를 사용하는 경우 mail_spool_t SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.

    # semanage fcontext -a -t mail_spool_t "<path>(/.*)?"
    # restorecon -Rv <path>
  3. vmail 사용자에게 /var/mail/ 에 대한 쓰기 권한을 부여합니다.

    # chown vmail:vmail /var/mail/
    # chmod 700 /var/mail/
  4. /etc/dovecot/conf.d/10-mail.conf 파일에서 mail_location 매개 변수의 주석을 해제하고 이 매개 변수를 copy 형식 및 위치로 설정합니다.

    mail_location = sdbox:/var/mail/%n/

    이 설정으로 다음을 수행합니다.

    • Dovecot는 high-performant dbox box format을 단일 모드에서 사용합니다. 이 모드에서 서비스는 maildir 형식과 유사하게 각 이메일을 별도의 파일에 저장합니다.
    • dovecot는 사용자 이름 경로의 %n 변수를 해결합니다. 이 작업은 각 사용자에게 해당 2.10에 대한 별도의 디렉터리가 있는지 확인하는 데 필요합니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/VirtualUsers.txt
  • /usr/share/doc/dovecot/wiki/MailLocation.txt
  • /usr/share/doc/dovecot/wiki/MailboxFormat.dbox.txt
  • /usr/share/doc/dovecot/wiki/Variables.txt

9.2.4. LDAP를 Dovecot 인증 백엔드로 사용

LDAP 디렉터리의 사용자는 일반적으로 디렉터리 서비스에 자신을 인증할 수 있습니다. dovecot는 이 서비스를 사용하여 Manila 및 POP3 서비스에 로그인할 때 사용자를 인증할 수 있습니다. 이 인증 방법은 다음과 같은 다양한 이점을 제공합니다.

  • 관리자는 디렉터리에서 사용자를 중앙에서 관리할 수 있습니다.
  • LDAP 계정에는 특별한 속성이 필요하지 않습니다. LDAP 서버에만 인증할 수 있어야 합니다. 결과적으로 이 방법은 LDAP 서버에서 사용되는 암호 스토리지 스키마와는 독립적입니다.
  • NSS(Name Service Switch) 인터페이스와PAM(Pluggable Authentication Modules) 프레임워크를 통해 서버에서 로컬에서 사용할 수 없습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.
  • 가상 사용자 기능이 구성됩니다.
  • LDAP 서버에 대한 연결은 TLS 암호화를 지원합니다.
  • Dovecot 서버의 RHEL은 LDAP 서버의 CA(인증 기관) 인증서를 신뢰합니다.
  • 사용자가 LDAP 디렉터리의 다른 트리에 저장된 경우 디렉터리를 검색하는 데 Dovecot 전용 LDAP 계정이 있습니다. 이 계정에는 다른 사용자의 고유 이름(DN)을 검색할 수 있는 권한이 필요합니다.

절차

  1. /etc/dovecot/conf.d/10-auth.conf 파일에서 인증 백엔드를 구성합니다.

    1. 주석 처리에 auth-*.conf.ext 인증 백엔드 구성 파일에 대한 설명이 포함되어 있습니다. 예를 들면 다음과 같습니다.

      #!include auth-system.conf.ext
    2. 다음 줄의 주석을 해제하여 LDAP 인증을 활성화합니다.

      !include auth-ldap.conf.ext
  2. /etc/dovecot/conf.d/auth-ldap.conf.ext 파일을 편집하고 다음과 같이 override_fields 매개변수를 userdb 섹션에 추가합니다.

    userdb {
      driver = ldap
      args = /etc/dovecot/dovecot-ldap.conf.ext
      override_fields = uid=vmail gid=vmail home=/var/mail/%n/
    }

    수정된 값으로 인해 Dovecot는 LDAP 서버에서 이러한 설정을 쿼리하지 않습니다. 따라서 이러한 속성도 존재할 필요가 없습니다.

  3. 다음 설정으로 /etc/dovecot/dovecot-ldap.conf.ext 파일을 만듭니다.

    1. LDAP 구조에 따라 다음 중 하나를 구성합니다.

      • 사용자가 LDAP 디렉터리의 다른 트리에 저장된 경우 동적 DN 조회를 구성합니다.

        dn = cn=dovecot_LDAP,dc=example,dc=com
        dnpass = password
        pass_filter = (&(objectClass=posixAccount)(uid=%n))

        dovecot는 지정된 DN, password 및 filter를 사용하여 디렉터리에서 인증 사용자의 DN을 검색합니다. 이 검색에서 Dovecot는 필터의 %n 을 사용자 이름으로 교체합니다. LDAP 검색에서는 하나의 결과만 반환해야 합니다.

      • 모든 사용자가 특정 항목에 저장된 경우 DN 템플릿을 구성합니다.

        auth_bind_userdn = cn=%n,ou=People,dc=example,dc=com
    2. LDAP 서버에 인증 바인딩을 활성화하여 Dovecot 사용자를 확인합니다.

      auth_bind = yes
    3. URL을 LDAP 서버로 설정합니다.

      uris = ldaps://LDAP-srv.example.com

      보안상의 이유로 LDAP 프로토콜을 통해 LDAPS 또는ECDHE TLS 명령을 사용하여 암호화된 연결만 사용하십시오. 후자의 경우 설정에 tls = yes 를 추가합니다.

      작업 인증서 검증을 위해 LDAP 서버의 호스트 이름이 TLS 인증서에 사용된 호스트 이름과 일치해야 합니다.

    4. LDAP 서버의 TLS 인증서 확인을 활성화합니다.

      tls_require_cert = hard
    5. 사용자 검색을 시작할 DN으로 기본 DN을 설정합니다.

      base = ou=People,dc=example,dc=com
    6. 검색 범위를 설정합니다.

      scope = onelevel

      dovecot는 지정된 기본 DN에서만 onelevel 범위로, 하위 트리에서 하위 트리 범위를 사용하여 검색합니다.

  4. /etc/dovecot/dovecot-ldap.conf.ext 파일에 보안 권한을 설정합니다.

    # chown root:root /etc/dovecot/dovecot-ldap.conf.ext
    # chmod 600 /etc/dovecot/dovecot-ldap.conf.ext

추가 리소스

  • /usr/share/doc/dovecot/example-config/dovecot-ldap.conf.ext
  • /usr/share/doc/dovecot/wiki/UserDatabase.Static.txt
  • /usr/share/doc/dovecot/wiki/AuthDatabase.LDAP.txt
  • /usr/share/doc/dovecot/wiki/AuthDatabase.LDAP.AuthBinds.txt
  • /usr/share/doc/dovecot/wiki/AuthDatabase.LDAP.PasswordLookups.txt

9.2.5. Dovecot 구성 완료

Dovecot를 설치 및 구성한 후 firewalld 서비스에서 필요한 포트를 열고 서비스를 활성화 및 시작합니다. 그런 다음 서버를 테스트할 수 있습니다.

사전 요구 사항

  • Dovecot에서 다음 내용이 구성되어 있습니다.

    • TLS 암호화
    • 인증 백엔드
  • 클라이언트는 CA(인증 기관) 인증서를 신뢰합니다.

절차

  1. 사용자에게 CloudEvent 또는 POP3 서비스만 제공하려면 /etc/dovecot/dovecot.conf 파일에서 protocols 매개변수의 주석을 제거하고 필요한 프로토콜로 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.

    protocols = imap lmtp

    기본적으로 imap,pop3, lmtp 프로토콜이 활성화됩니다.

  2. 로컬 방화벽에서 포트를 엽니다. 예를 들어, CloudEventS,Forwarded, POP3S 및 POP3 프로토콜의 포트를 여는 경우 다음을 입력합니다.

    # firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3
    # firewall-cmd --reload
  3. dovecot 서비스를 활성화하고 시작합니다.

    # systemctl enable --now dovecot

검증

  1. Mozilla Thunderbird와 같은 메일 클라이언트를 사용하여 Dovecot에 연결하고 이메일을 읽습니다. 메일 클라이언트 설정은 사용하려는 프로토콜에 따라 다릅니다.

    표 9.2. Dovecot 서버에 대한 연결 설정

    프로토콜포트연결 보안인증 방법

    IMAP

    143

    STARTTLS

    PLAIN[a]

    IMAPS

    993

    SSL/TLS

    PLAIN[a]

    POP3

    110

    STARTTLS

    PLAIN[a]

    POP3S

    995

    SSL/TLS

    PLAIN[a]

    [a] 클라이언트는 TLS 연결을 통해 암호화된 데이터를 전송합니다. 따라서 인증 정보가 공개되지 않습니다.

    기본적으로 Dovecot는 TLS가 없는 연결에서 일반 텍스트 인증을 허용하지 않으므로 이 테이블에는 암호화되지 않은 연결의 설정이 나열되지 않습니다.

  2. 기본값이 아닌 값을 사용하여 구성 설정을 표시합니다.

    # doveconf -n

추가 리소스

  • firewall-cmd(1) 매뉴얼 페이지

9.3. MariaDB SQL 인증을 사용하여 Dovecot 서버 설정

사용자 및 암호를 MariaDB SQL 서버에 저장하는 경우 Dovecot를 사용자 데이터베이스 및 인증 백엔드로 사용하도록 구성할 수 있습니다. 이 구성을 사용하면 데이터베이스에서 계정을 중앙에서 관리하고 사용자는 Dovecot 서버의 파일 시스템에 대한 로컬 액세스 권한이 없습니다.

중앙 집중식 관리 계정을 사용하면 복제를 통해 여러 개의 Dovecot 서버를 설정하여 kdump를 고가용성으로 만들 계획도 누릴 수 있습니다.

9.3.1. Dovecot 설치

dovecot 패키지는 다음을 제공합니다.

  • dovecot 서비스와 이를 유지보수할 유틸리티
  • Dovecot가 필요할 때 시작되는 서비스(예: 인증)
  • 서버 측 메일 필터링과 같은 플러그인
  • /etc/dovecot/ 디렉토리에 있는 설정 파일
  • /usr/share/doc/dovecot/ 디렉토리에 있는 설명서

절차

  • dovecot 패키지를 설치합니다.

    # yum install dovecot
    참고

    Dovecot가 이미 설치되어 있고 정리된 구성 파일이 필요한 경우 /etc/dovecot/ 디렉토리 이름을 변경하거나 제거해야 합니다. 그런 다음 패키지를 다시 설치합니다. 설정 파일을 제거하지 않으면 yum reinstall dovecot 명령이 /etc/dovecot/ 의 구성 파일을 재설정하지 않습니다.

9.3.2. Dovecot 서버에서 TLS 암호화 구성

dovecot는 보안 기본 구성을 제공합니다. 예를 들어 TLS는 네트워크를 통해 암호화된 자격 증명 및 데이터를 전송하기 위해 기본적으로 활성화됩니다. Dovecot 서버에서 TLS를 구성하려면 인증서 및 개인 키 파일에 대한 경로만 설정하면 됩니다. 또한 Diffie-Hellman 매개변수를 생성 및 사용하여 완벽한PFS(forward secrecy)를 제공하여 TLS 연결의 보안을 높일 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.
  • 다음 파일이 서버의 나열된 위치에 복사되었습니다.

    • 서버 인증서: /etc/pki/dovecot/certs/server.example.com.crt
    • 개인 키: /etc/pki/dovecot/private/server.example.com.key
    • CA(인증 기관) 인증서: /etc/pki/dovecot/certs/ca.crt
  • 서버 인증서의 Subject DN 필드에 있는 호스트 이름은 서버의 FQDN(정규화된 도메인 이름)과 일치합니다.

절차

  1. 개인 키 파일에 대한 보안 권한을 설정합니다.

    # chown root:root /etc/pki/dovecot/private/server.example.com.key
    # chmod 600 /etc/pki/dovecot/private/server.example.com.key
  2. Diffie-Hellman 매개변수를 사용하여 파일을 생성합니다.

    # openssl dhparam -out /etc/dovecot/dh.pem 4096

    서버의 하드웨어 및 엔트로피에 따라 4096비트의 Diffie-Hellman 매개변수를 생성하는 데 몇 분이 걸릴 수 있습니다.

  3. /etc/dovecot/conf.d/10-ssl.conf 파일에서 인증서 및 개인 키 파일의 경로를 설정합니다.

    1. ssl_certssl_key 매개변수를 업데이트하고 서버 인증서 및 개인 키의 경로를 사용하도록 설정합니다.

      ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt
      ssl_key = </etc/pki/dovecot/private/server.example.com.key
    2. ssl_ca 매개변수의 주석을 해제하고 CA 인증서 경로를 사용하도록 설정합니다.

      ssl_ca = </etc/pki/dovecot/certs/ca.crt
    3. ssl_dh 매개변수의 주석을 해제하고 Diffie-Hellman 매개변수 파일의 경로를 사용하도록 설정합니다.

      ssl_dh = </etc/dovecot/dh.pem
    중요

    Dovecot가 파일에서 매개변수 값을 읽으려면 경로는 선행 < 문자로 시작해야 합니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/SSL.DovecotConfiguration.txt

9.3.3. 가상 사용자 사용을 위한 Dovecot 준비

기본적으로 Dovecot는 파일 시스템에서 서비스를 사용하는 사용자로 많은 작업을 수행합니다. 그러나 하나의 로컬 사용자를 사용하여 이러한 작업을 수행하도록 Dovecot 백엔드를 구성하면 다음과 같은 몇 가지 이점이 있습니다.

  • dovecot는 사용자 ID(UID)를 사용하는 대신 특정 로컬 사용자로 파일 시스템 작업을 수행합니다.
  • 사용자는 서버에서 로컬로 사용할 수 없습니다.
  • 모든 Webhook 및 사용자별 파일을 하나의 루트 디렉터리에 저장할 수 있습니다.
  • 사용자에게 UID 및 그룹 ID(GID)가 필요하지 않으므로 관리 작업을 줄일 수 있습니다.
  • 서버의 파일 시스템에 액세스할 수 있는 사용자는 이러한 파일에 액세스할 수 없기 때문에 사용자의 속성이나 인덱스를 손상시킬 수 없습니다.
  • 복제를 쉽게 설정할 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.

절차

  1. vmail 사용자를 만듭니다.

    # useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail

    dovecot는 나중에 이 사용자를 사용하여boxes를 관리합니다. 보안상의 이유로 dovecot 또는 dovenull 시스템 사용자를 사용하지 마십시오.

  2. /var/mail/ 와 다른 경로를 사용하는 경우 mail_spool_t SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.

    # semanage fcontext -a -t mail_spool_t "<path>(/.*)?"
    # restorecon -Rv <path>
  3. vmail 사용자에게 /var/mail/ 에 대한 쓰기 권한을 부여합니다.

    # chown vmail:vmail /var/mail/
    # chmod 700 /var/mail/
  4. /etc/dovecot/conf.d/10-mail.conf 파일에서 mail_location 매개 변수의 주석을 해제하고 이 매개 변수를 copy 형식 및 위치로 설정합니다.

    mail_location = sdbox:/var/mail/%n/

    이 설정으로 다음을 수행합니다.

    • Dovecot는 high-performant dbox box format을 단일 모드에서 사용합니다. 이 모드에서 서비스는 maildir 형식과 유사하게 각 이메일을 별도의 파일에 저장합니다.
    • dovecot는 사용자 이름 경로의 %n 변수를 해결합니다. 이 작업은 각 사용자에게 해당 2.10에 대한 별도의 디렉터리가 있는지 확인하는 데 필요합니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/VirtualUsers.txt
  • /usr/share/doc/dovecot/wiki/MailLocation.txt
  • /usr/share/doc/dovecot/wiki/MailboxFormat.dbox.txt
  • /usr/share/doc/dovecot/wiki/Variables.txt

9.3.4. MariaDB SQL 데이터베이스를 Dovecot 인증 백엔드로 사용

dovecot는 MariaDB 데이터베이스에서 계정과 암호를 읽고 해당 사용자를 사용하여 Manila 또는 POP3 서비스에 로그인할 때 사용자를 인증할 수 있습니다. 이 인증 방법의 장점은 다음과 같습니다.

  • 관리자는 데이터베이스에서 사용자를 중앙에서 관리할 수 있습니다.
  • 사용자는 서버에서 로컬로 액세스할 수 없습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.
  • 가상 사용자 기능이 구성됩니다.
  • MariaDB 서버에 대한 연결은 TLS 암호화를 지원합니다.
  • dovecotDB 데이터베이스는 MariaDB에 있으며 users 테이블에는 적어도 usernamepassword 열이 포함됩니다.
  • 암호 열에는 Dovecot에서 지원하는 스키마로 암호화된 암호가 포함되어 있습니다.
  • 암호는 동일한 스키마를 사용하거나 {pw-storage-scheme} 접두사가 있습니다.
  • dovecot MariaDB 사용자는 dovecotDB 데이터베이스의 users 테이블에 대한 읽기 권한이 있습니다.
  • MariaDB 서버의 TLS 인증서를 발행한 인증 기관(CA) 인증서는 /etc/pki/tls/certs/ca.crt 파일의 Dovecot 서버에 저장됩니다.

절차

  1. dovecot-mysql 패키지를 설치합니다.

    # yum install dovecot-mysql
  2. /etc/dovecot/conf.d/10-auth.conf 파일에서 인증 백엔드를 구성합니다.

    1. 주석 처리에 auth-*.conf.ext 인증 백엔드 구성 파일에 대한 설명이 포함되어 있습니다. 예를 들면 다음과 같습니다.

      #!include auth-system.conf.ext
    2. 다음 줄의 주석을 해제하여 SQL 인증을 활성화합니다.

      !include auth-sql.conf.ext
  3. /etc/dovecot/conf.d/auth-sql.conf.ext 파일을 편집하고 다음과 같이 override_fields 매개변수를 userdb 섹션에 추가합니다.

    userdb {
      driver = sql
      args = /etc/dovecot/dovecot-sql.conf.ext
      override_fields = uid=vmail gid=vmail home=/var/mail/%n/
    }

    고정 값으로 인해 Dovecot는 SQL Server에서 이러한 설정을 쿼리하지 않습니다.

  4. 다음 설정으로 /etc/dovecot/dovecot-sql.conf.ext 파일을 만듭니다.

    driver = mysql
    connect = host=mariadb_srv.example.com dbname=dovecotDB user=dovecot password=dovecotPW ssl_ca=/etc/pki/tls/certs/ca.crt
    default_pass_scheme = SHA512-CRYPT
    user_query = SELECT username FROM users WHERE username='%u';
    password_query = SELECT username AS user, password FROM users WHERE username='%u';
    iterate_query = SELECT username FROM users;

    데이터베이스 서버에 TLS 암호화를 사용하려면 ssl_ca 옵션을 MariaDB 서버 인증서를 발행한 CA 인증서의 경로로 설정합니다. 작업 인증서 검증을 위해 MariaDB 서버의 호스트 이름이 TLS 인증서에 사용된 호스트 이름과 일치해야 합니다.

    데이터베이스의 암호 값에 {pw-storage-scheme} 접두사가 포함된 경우 default_pass_scheme 설정을 생략할 수 있습니다.

    파일의 쿼리는 다음과 같이 설정해야 합니다.

    • user_query 매개변수의 경우 쿼리에서 Dovecot 사용자의 사용자 이름을 반환해야 합니다. 또한 쿼리는 하나의 결과만 반환해야 합니다.
    • password_query 매개변수의 경우 쿼리에서 사용자 이름과 암호를 반환해야 하며 Dovecot는 사용자암호 변수에 이러한 값을 사용해야 합니다. 따라서 데이터베이스에서 다른 열 이름을 사용하는 경우 AS SQL 명령을 사용하여 결과의 열의 이름을 바꿉니다.
    • iterate_query 매개변수의 경우 쿼리에서 모든 사용자 목록을 반환해야 합니다.
  5. /etc/dovecot/dovecot-sql.conf.ext 파일에 대한 보안 권한을 설정합니다.

    # chown root:root /etc/dovecot/dovecot-sql.conf.ext
    # chmod 600 /etc/dovecot/dovecot-sql.conf.ext

추가 리소스

  • /usr/share/doc/dovecot/example-config/dovecot-sql.conf.ext
  • /usr/share/doc/dovecot/wiki/Authentication.PasswordSchemes.txt

9.3.5. Dovecot 구성 완료

Dovecot를 설치 및 구성한 후 firewalld 서비스에서 필요한 포트를 열고 서비스를 활성화 및 시작합니다. 그런 다음 서버를 테스트할 수 있습니다.

사전 요구 사항

  • Dovecot에서 다음 내용이 구성되어 있습니다.

    • TLS 암호화
    • 인증 백엔드
  • 클라이언트는 CA(인증 기관) 인증서를 신뢰합니다.

절차

  1. 사용자에게 CloudEvent 또는 POP3 서비스만 제공하려면 /etc/dovecot/dovecot.conf 파일에서 protocols 매개변수의 주석을 제거하고 필요한 프로토콜로 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.

    protocols = imap lmtp

    기본적으로 imap,pop3, lmtp 프로토콜이 활성화됩니다.

  2. 로컬 방화벽에서 포트를 엽니다. 예를 들어, CloudEventS,Forwarded, POP3S 및 POP3 프로토콜의 포트를 여는 경우 다음을 입력합니다.

    # firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3
    # firewall-cmd --reload
  3. dovecot 서비스를 활성화하고 시작합니다.

    # systemctl enable --now dovecot

검증

  1. Mozilla Thunderbird와 같은 메일 클라이언트를 사용하여 Dovecot에 연결하고 이메일을 읽습니다. 메일 클라이언트 설정은 사용하려는 프로토콜에 따라 다릅니다.

    표 9.3. Dovecot 서버에 대한 연결 설정

    프로토콜포트연결 보안인증 방법

    IMAP

    143

    STARTTLS

    PLAIN[a]

    IMAPS

    993

    SSL/TLS

    PLAIN[a]

    POP3

    110

    STARTTLS

    PLAIN[a]

    POP3S

    995

    SSL/TLS

    PLAIN[a]

    [a] 클라이언트는 TLS 연결을 통해 암호화된 데이터를 전송합니다. 따라서 인증 정보가 공개되지 않습니다.

    기본적으로 Dovecot는 TLS가 없는 연결에서 일반 텍스트 인증을 허용하지 않으므로 이 테이블에는 암호화되지 않은 연결의 설정이 나열되지 않습니다.

  2. 기본값이 아닌 값을 사용하여 구성 설정을 표시합니다.

    # doveconf -n

추가 리소스

  • firewall-cmd(1) 매뉴얼 페이지

9.4. 두 개의 Dovecot 서버 간 복제 구성

양방향 복제를 사용하면 Dovecot 서버를 고가용성으로 만들 수 있으며, Bookinfo 및 POP3 클라이언트가 두 서버의 kdump에 액세스할 수 있습니다. Dovecot는 각box의 인덱스 로그의 변경 사항을 추적하고 안전한 방식으로 충돌을 해결합니다.

두 복제 파트너 모두에서 이 절차를 수행합니다.

참고

복제는 서버 쌍 간에만 작동합니다. 결과적으로 대규모 클러스터에서는 여러 개의 독립적인 백엔드 쌍이 필요합니다.

사전 요구 사항

  • 두 서버 모두 동일한 인증 백엔드를 사용합니다. LDAP 또는 SQL을 사용하여 계정을 중앙에서 유지하는 것이 좋습니다.
  • Dovecot 사용자 데이터베이스 구성은 사용자 목록을 지원합니다. doveadm user '*' 명령을 사용하여 이를 확인합니다.
  • dovecot는 사용자 ID(UID) 대신 vmail 사용자로 파일 시스템의 kdump에 액세스합니다.

절차

  1. /etc/dovecot/conf.d/10-replication.conf 파일을 만들고 여기에 다음 단계를 수행합니다.

    1. notifyreplication 플러그인을 활성화합니다.

      mail_plugins = $mail_plugins notify replication
    2. 서비스 복제 기 섹션을 추가합니다.

      service replicator {
        process_min_avail = 1
      
        unix_listener replicator-doveadm {
          mode = 0600
          user = vmail
        }
      }

      이러한 설정으로 Dovecot는 dovecot 서비스가 시작될 때 하나 이상의 replicator 프로세스를 시작합니다. 또한 이 섹션에서는 replicator-doveadm 소켓의 설정을 정의합니다.

    3. 서비스 집계 기 섹션을 추가하여 replication-notify-fifo 파이프 및 replication-notify 소켓을 구성합니다.

      service aggregator {
        fifo_listener replication-notify-fifo {
          user = vmail
        }
        unix_listener replication-notify {
          user = vmail
        }
      }
    4. 서비스 doveadm 섹션을 추가하여 복제 서비스의 포트를 정의합니다.

      service doveadm {
        inet_listener {
          port = 12345
        }
      }
    5. doveadm 복제 서비스의 암호를 설정합니다.

      doveadm_password = replication_password

      두 서버에서 암호는 동일해야 합니다.

    6. 복제 파트너를 구성합니다.

      plugin {
        mail_replica = tcp:server2.example.com:12345
      }
    7. 선택 사항: 최대 병렬 dsync 프로세스 수를 정의합니다.

      replication_max_conns = 20

      replication_max_conns 의 기본값은 10 입니다.

  2. /etc/dovecot/conf.d/10-replication.conf 파일에 보안 권한을 설정합니다.

    # chown root:root /etc/dovecot/conf.d/10-replication.conf
    # chmod 600 /etc/dovecot/conf.d/10-replication.conf
  3. nis_enabled SELinux 부울을 활성화하여 Dove adm 복제 포트를 열 수 있습니다.

    setsebool -P nis_enabled on
  4. 복제 파트너만 복제 포트에 액세스할 수 있도록 firewalld 규칙을 구성합니다. 예를 들면 다음과 같습니다.

    # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.0.2.1/32" port protocol="tcp" port="12345" accept"
    # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv6" source address="2001:db8:2::1/128" port protocol="tcp" port="12345" accept"
    # firewall-cmd --reload

    IPv6 주소에 대한 서브넷 마스크 / 32 및 IPv6 주소의 서브넷 마스크는 지정된 주소에 대한 액세스를 제한합니다.

  5. 다른 복제 파트너에서도 이 절차를 수행하십시오.
  6. 다시 로드 Dovecot:

    # systemctl reload dovecot

검증

  1. 한 서버의 Webhook에서 작업을 수행한 다음 Dovecot가 변경 사항을 다른 서버에 복제했는지 확인합니다.
  2. 복제자 상태를 표시합니다.

    # doveadm replicator status
    Queued 'sync' requests        0
    Queued 'high' requests        0
    Queued 'low' requests         0
    Queued 'failed' requests      0
    Queued 'full resync' requests 30
    Waiting 'failed' requests     0
    Total number of known users   75
  3. 특정 사용자의 복제본 상태를 표시합니다.

    # doveadm replicator status example_user
    username        priority  fast sync  full sync  success sync  failed
    example_user    none      02:05:28   04:19:07   02:05:28      -

추가 리소스

  • dsync(1) man page
  • /usr/share/doc/dovecot/wiki/Replication.txt

9.5. 사용자 구독이 CloudEventVerifyboxes에 자동으로 가입

일반적으로, CloudEvent 서버 관리자는 Dovecot가 SentTrash 와 같은 특정 Webhook를 자동으로 생성하고 사용자를 구독하려고 합니다. 구성 파일에서 이 값을 설정할 수 있습니다.

또한, 특수한 속성을 정의할 수 있습니다. gRPC 클라이언트는 종종 이메일 전송과 같은 특별한 목적으로 kdump를 정의하는 것을 지원합니다. 사용자가 올바른 Webhook를 수동으로 선택하고 설정해야 하는 것을 방지하기 위해 CloudEvent 서버는 Bookinfo LIST 명령에서 특수 사용 특성을 보낼 수 있습니다. 그러면 클라이언트가 이 특성을 사용하여 전송된 이메일에 대한 kdump를 식별하고 설정할 수 있습니다.

사전 요구 사항

  • dovecot가 구성되어 있습니다.

절차

  1. /etc/dovecot/conf.d/15-mailboxes.conf 파일에서 받은 편지함 네임스페이스 섹션을 업데이트합니다.

    1. 사용자가 사용할 수 있어야 하는 각각의 특수한 HSM에 auto = subscribe 설정을 추가합니다. 예를 들면 다음과 같습니다.

      namespace inbox {
        ...
        mailbox Drafts {
          special_use = \Drafts
          auto = subscribe
        }
      
        mailbox Junk {
          special_use = \Junk
          auto = subscribe
        }
      
        mailbox Trash {
          special_use = \Trash
          auto = subscribe
        }
      
        mailbox Sent {
          special_use = \Sent
          auto = subscribe
        }
        ...
      }

      메일 클라이언트가 더 특수한 사용의 Webhook를 지원하는 경우 유사한 항목을 추가할 수 있습니다. special_use 매개변수는 Dovecot가 클라이언트에게 특수 사용 속성에 전송하는 값을 정의합니다.

    2. 선택 사항: 특수한 용도가 없는 다른 Webhook를 정의하려는 경우 사용자의 받은 편지함에서 속성 섹션을 추가합니다. 예를 들면 다음과 같습니다.

      namespace inbox {
        ...
        mailbox "Important Emails" {
          auto = <value>
        }
        ...
      }

      auto 매개변수를 다음 값 중 하나로 설정할 수 있습니다.

      • subscribe: 자동으로 속성을 만들고 사용자를 구독합니다.Automatically creates the user to it and subscribes the user.
      • create: 사용자를 구독하지 않고 자동으로 속성을 만듭니다.Automatically creates the handle without subscribing the user to it.
      • no (기본값): Dovecot가 box를 생성하지도 않고 사용자를 구독하지 않습니다.
  2. 다시 로드 Dovecot:

    # systemctl reload dovecot

검증

  • CloudEvent 클라이언트를 사용하고 사용자 name에 액세스할 수 있습니다.

    auto = subscribe 설정이 있는 boxes가 자동으로 표시됩니다. 클라이언트가 특수한 사용 위치 및 정의된 목적을 지원하는 경우 클라이언트는 이를 자동으로 사용합니다.

추가 리소스

9.6. LMTP 소켓 및 LMTPS 리스너 구성

10.0.0.1과 같은 SMTP 서버는 Dovecot에 이메일을 전송하도록 LSTP(Local mail Transfer Protocol)를 사용합니다. SMTP 서버가 실행되는 경우:

  • Dovecot와 동일한 호스트에서 LMTP 소켓을 사용하십시오.
  • 다른 호스트에서 LMTP 서비스를 사용하십시오.

    기본적으로 LMTP 프로토콜은 암호화되지 않습니다. 그러나 TLS 암호화를 구성한 경우 Dovecot는 LMTP 서비스에 동일한 설정을 자동으로 사용합니다. 그런 다음 SMTP 서버는 LMTPS 프로토콜 또는 LMTP를 통해 10.0.0.1 TLS 명령을 사용하여 연결할 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.
  • LMTP 서비스를 구성하려면 Dovecot에서 TLS 암호화가 구성됩니다.

절차

  1. LMTP 프로토콜이 활성화되어 있는지 확인합니다.

    # doveconf -a | egrep "^protocols"
    protocols = imap pop3 lmtp

    출력에 lmtp 가 포함된 경우 프로토콜이 활성화됩니다.

  2. lmtp 프로토콜이 비활성화된 경우 /etc/dovecot/dovecot.conf 파일을 편집하고 protocol 매개변수의 값에 lmtp 를 추가합니다.

    protocols = ... lmtp
  3. LMTP 소켓 또는 서비스가 필요한지 여부에 따라 /etc/dovecot/conf.d/10-master.conf 파일의 lmtp 섹션에서 다음 사항을 변경합니다.

    • LMTP 소켓: 기본적으로 Dovecot는 /var/run/dovecot/lmtp 소켓을 자동으로 생성합니다.

      선택 사항: 소유권 및 권한을 사용자 지정합니다.

      service lmtp {
        ...
        unix_listener lmtp {
          mode = 0600
          user = postfix
          group = postfix
        }
        ...
      }
    • LMTP 서비스: inet_listener 하위 섹션을 추가합니다.

      service lmtp {
        ...
        inet_listener lmtp {
          port = 24
        }
        ...
      }
  4. SMTP 서버만 LMTP 포트에 액세스할 수 있도록 firewalld 규칙을 구성합니다. 예를 들면 다음과 같습니다.

    # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.0.2.1/32" port protocol="tcp" port="24" accept"
    # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv6" source address="2001:db8:2::1/128" port protocol="tcp" port="24" accept"
    # firewall-cmd --reload

    IPv6 주소에 대한 서브넷 마스크 / 32 및 IPv6 주소의 서브넷 마스크는 지정된 주소에 대한 액세스를 제한합니다.

  5. 다시 로드 Dovecot:

    # systemctl reload dovecot

검증

  1. LMTP 소켓을 구성한 경우 Dovecot가 소켓을 생성하고 권한이 올바른지 확인합니다.

    # ls -l /var/run/dovecot/lmtp
    srw-------. 1 postfix postfix 0 Nov 22 17:17 /var/run/dovecot/lmtp
  2. LMTP 소켓 또는 서비스를 사용하여 Dovecot에 이메일을 제출하도록 SMTP 서버를 구성합니다.

    LMTP 서비스를 사용하는 경우 SMTP 서버가 LMTPS 프로토콜을 사용하는지 확인하거나 encrypted connection 을 사용하도록 CloudEventTLS 명령을 보냅니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/LMTP.txt

9.7. Dovecot에서 CloudEvent 또는 POP3 서비스 비활성화

기본적으로 Dovecot는 CloudEvent 및 POP3 서비스를 제공합니다. 그 중 하나만 필요한 경우 다른 하나를 비활성화하여 공격을 위해 표면을 줄일 수 있습니다.

사전 요구 사항

  • dovecot가 설치되어 있어야 합니다.

절차

  1. /etc/dovecot/dovecot.conf 파일에서 protocols 매개변수의 주석을 제거하고 필요한 프로토콜을 사용하도록 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.

    protocols = imap lmtp

    기본적으로 imap,pop3, lmtp 프로토콜이 활성화됩니다.

  2. 다시 로드 Dovecot:

    # systemctl reload dovecot
  3. 로컬 방화벽에 더 이상 필요하지 않은 포트를 닫습니다. 예를 들어, POP3S 및 POP3 프로토콜의 포트를 종료하려면 다음을 입력합니다.

    # firewall-cmd --remove-service=pop3s --remove-service=pop3
    # firewall-cmd --reload

검증

  • dovecot 프로세스에서 열린 LISTEN 모드에서 모든 포트를 표시합니다.

    # ss -tulp | grep dovecot
    tcp  LISTEN 0  100  0.0.0.0:993  0.0.0.0:*  users:(("dovecot",pid=1405,fd=44))
    tcp  LISTEN 0  100  0.0.0.0:143  0.0.0.0:*  users:(("dovecot",pid=1405,fd=42))
    tcp  LISTEN 0  100     [::]:993     [::]:*  users:(("dovecot",pid=1405,fd=45))
    tcp  LISTEN 0  100     [::]:143     [::]:*  users:(("dovecot",pid=1405,fd=43))

    이 예에서 Dovecot는 TCP 포트 993 (IMAPS) 및 143 (IMAP)에서만 수신 대기합니다.

    소켓을 사용하는 대신 포트에서 수신 대기하도록 서비스를 구성하는 경우 Dovecot는 LMTP 프로토콜의 포트만 엽니다.

추가 리소스

  • firewall-cmd(1) 매뉴얼 페이지

9.8. Dove servers에서 Sieve를 사용하여 서버 측 이메일 필터링 활성화

관리 프로토콜을 사용하여 Sieve 스크립트를 서버에 업로드할 수 있습니다. Sieve 스크립트는 서버가 수신되는 이메일에서 검증하고 수행해야 하는 규칙과 작업을 정의합니다. 예를 들어, 사용자는 Sieve를 사용하여 특정 발신자의 이메일을 전달할 수 있으며 관리자는 글로벌 필터를 생성하여 스팸 필터에 의해 플래그가 지정된 이메일을 별도의 CloudEvent 폴더로 이동할 수 있습니다.

ManageSieve 플러그인은 Sieve 스크립트 및 ManageSieve 프로토콜에 대한 지원을 Dove server에 추가합니다.

주의

TLS 연결을 통해 ManageSieve 프로토콜 사용을 지원하는 클라이언트만 사용합니다. 이 프로토콜의 TLS를 비활성화하면 클라이언트가 네트워크를 통해 일반 텍스트로 자격 증명을 보냅니다.

사전 요구 사항

  • Dovecot가 구성되었으며, usevecot를 제공합니다.
  • TLS 암호화는 Dovecot에서 구성됩니다.
  • 메일 클라이언트는 TLS 연결을 통해 ManageSieve 프로토콜을 지원합니다.

절차

  1. dovecot-pigeon absent 패키지를 설치합니다.

    # yum install dovecot-pigeonhole
  2. /etc/dovecot/conf.d/20-managesieve.conf 에서 다음 줄의 주석을 제거하여 sieve 프로토콜을 활성화합니다.

    protocols = $protocols sieve

    이 설정은 이미 활성화된 다른 프로토콜 외에 Sieve를 활성화합니다.

  3. firewalld 에서 ManageSieve 포트를 엽니다.

    # firewall-cmd --permanent --add-service=managesieve
    # firewall-cmd --reload
  4. 다시 로드 Dovecot:

    # systemctl reload dovecot

검증

  1. 클라이언트를 사용하고 Sieve 스크립트를 업로드합니다. 다음 연결 설정을 사용합니다.

    • 포트: 4190
    • 연결 보안: SSL/TLS
    • 인증 방법: PLAIN
  2. Sieve 스크립트가 업로드된 사용자에게 이메일을 보냅니다. 이메일이 스크립트의 규칙과 일치하는 경우 서버가 정의된 작업을 수행하는지 확인합니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/Pigeonhole.Sieve.Plugins.IMAPSieve.txt
  • /usr/share/doc/dovecot/wiki/Pigeonhole.Sieve.Troubleshooting.txt
  • firewall-cmd(1) 매뉴얼 페이지

9.9. Dovecot에서 구성 파일을 처리하는 방법

dovecot 패키지는 기본 설정 파일 /etc/dovecot/dovecot.conf/etc/dovecot/conf.d/ 디렉터리에 여러 구성 파일을 제공합니다. Dovecot는 파일을 결합하여 서비스를 시작할 때 구성을 빌드합니다.

여러 구성 파일의 주요 장점은 그룹화 설정을 수행하고 가독성을 높이는 것입니다. 단일 구성 파일을 선호하는 경우 /etc/dovecot/dovecot.conf 의 모든 설정을 유지 관리하고 해당 파일에서 include _try 문을 모두 제거할 수 있습니다.

추가 리소스

  • /usr/share/doc/dovecot/wiki/ConfigFile.txt
  • /usr/share/doc/dovecot/wiki/Variables.txt

10장. 인쇄 설정

CUPS(Common UNIX Printing System)는 Red Hat Enterprise Linux에서 인쇄를 관리합니다. 사용자는 호스트의 CUPS에 프린터를 구성하여 출력하도록 합니다. 또한 CUPS에서 프린터를 공유하여 호스트를 출력 서버로 사용할 수 있습니다.

CUPS는 다음과 같은 출력을 지원합니다.

  • Air#187™ 및 IPP Everywhere™ 프린터
  • 기존PPD(PPD) 기반 드라이버를 사용하는 네트워크 및 로컬 USB 프린터

10.1. CUPS 설치 및 구성

CUPS를 사용하여 로컬 호스트에서 출력할 수 있습니다. 이 호스트를 사용하여 네트워크에서 프린터를 공유하고 인쇄 서버 역할을 할 수도 있습니다.

절차

  1. cups 패키지를 설치합니다.

    # yum install cups
  2. CUPS를 출력 서버로 구성하는 경우 /etc/cups/cupsd.conf 파일을 편집하고 다음과 같이 변경합니다.

    1. CUPS를 원격으로 구성하거나 이 호스트를 출력 서버로 사용하려면 서비스에서 수신 대기하는 IP 주소와 포트를 구성합니다.

      Listen 192.0.2.1:631
      Listen [2001:db8:1::1]:631

      기본적으로 CUPS는 localhost 인터페이스(127.0.0.1::1)에서만 수신 대기합니다. 대괄호로 IPv6 주소를 지정합니다.

      중요

      인터넷과 같이 신뢰할 수 없는 네트워크에서 액세스를 허용하는 인터페이스에서 수신 대기하도록 CUPS를 구성하지 마십시오.

    2. < Location /> 지시문에서 각 IP 범위를 허용하여 서비스에 액세스할 수 있는 IP 범위를 구성합니다.

      <Location />
        Allow from 192.0.2.0/24
        Allow from [2001:db8:1::1]/32
        Order allow,deny
      </Location>
    3. &lt ;Location /admin& gt; 지시문에서 CUPS 관리 서비스에 액세스할 수 있는 IP 주소와 범위를 구성합니다.

      <Location /admin>
        Allow from 192.0.2.15/32
        Allow from [2001:db8:1::22]/128
        Order allow,deny
      </Location>

      이러한 설정을 사용하면 IP 주소 192.0.2.152001:db8:1::22 가 있는 호스트만 관리 서비스에 액세스할 수 있습니다.

    4. 선택 사항: 웹 인터페이스에서 구성 및 로그 파일에 액세스할 수 있는 IP 주소 및 범위를 구성합니다.

      <Location /admin/conf>
        Allow from 192.0.2.15/32
        Allow from [2001:db8:1::22]/128
        ...
      </Location>
      
      <Location /admin/log>
        Allow from 192.0.2.15/32
        Allow from [2001:db8:1::22]/128
        ...
      </Location>
  3. firewalld 서비스를 실행하고 CUPS에 대한 원격 액세스를 구성하려면 firewalld 에서 CUPS 포트를 엽니다.

    # firewall-cmd --permanent --add-port=631/tcp
    # firewall-cmd --reload

    여러 인터페이스가 있는 호스트에서 CUPS를 실행하는 경우 필요한 네트워크에 대한 액세스를 제한하는 것이 좋습니다.

  4. cups 서비스를 활성화하고 시작합니다.

    # systemctl enable --now cups

검증

  • 브라우저를 사용하고 http:// <hostname> :631 에 액세스합니다. 웹 인터페이스에 연결할 수 있는 경우 CUPS가 작동합니다.

    관리 탭과 같은 특정 기능에는 인증 및 HTTPS 연결이 필요합니다. 기본적으로 CUPS는 HTTPS 액세스를 위해 자체 서명된 인증서를 사용하므로 인증 시 연결이 안전하지 않습니다.

10.2. CUPS 서버에서 TLS 암호화 구성

CUPS는 TLS 암호화 연결을 지원하며 기본적으로 이 서비스는 인증이 필요한 모든 요청에 대해 암호화된 연결을 적용합니다. 인증서가 구성되지 않은 경우 CUPS는 개인 키와 자체 서명 인증서를 생성합니다. 이는 로컬 호스트 자체에서 CUPS에 액세스하는 경우에만 충분합니다. 네트워크를 통한 보안 연결의 경우 CA(인증 기관)에서 서명한 서버 인증서를 사용합니다.

주의

암호화 또는 자체 서명된 인증서가 없으면 MITTM(Man-in-the-middle) 공격은 다음과 같이 공개할 수 있습니다.

  • 웹 인터페이스를 사용하여 CUPS를 구성할 때 관리자의 인증 정보
  • 네트워크를 통해 인쇄 작업을 보낼 때 기밀 데이터

사전 요구 사항

  • CUPS가 구성되어 있습니다.
  • 개인 키 를 생성하고 CA에서 이에 대한 서버 인증서를 발급했습니다.
  • 서버 인증서의 유효성을 확인하는 데 중간 인증서가 필요한 경우 중간 인증서를 서버 인증서에 연결합니다.
  • CUPS는 서비스에서 키를 읽을 때 암호를 입력할 수 있는 옵션을 제공하지 않으므로 개인 키는 암호로 보호되지 않습니다.
  • 인증서의 Canonical Name (CN) 또는 Subject Alternative Name (SAN) 필드는 다음 중 하나와 일치합니다.

    • CUPS 서버의 FQDN(정규화된 도메인 이름)
    • DNS가 서버의 IP 주소로 확인되는 별칭
  • 개인 키 및 서버 인증서 파일은 Privacy Enhanced Mail (PEM) 형식을 사용합니다.
  • 클라이언트는 CA 인증서를 신뢰합니다.

절차

  1. /etc/cups/cups-files.conf 파일을 편집하고 다음 설정을 추가하여 자체 서명된 인증서 자동 생성을 비활성화합니다.

    CreateSelfSignedCerts no
  2. 자체 서명된 인증서 및 개인 키를 제거합니다.

    # rm /etc/cups/ssl/<hostname>.crt /etc/cups/ssl/<hostname>.key
  3. 선택 사항: 서버의 FQDN을 표시합니다.

    # hostname -f
    server.example.com
  4. 선택 사항: 인증서의 CN 및 SAN 필드를 표시합니다.

    # openssl x509 -text -in /etc/cups/ssl/server.example.com.crt
    Certificate:
      Data:
        ...
        Subject: CN = server.example.com
        ...
        X509v3 extensions:
          ...
          X509v3 Subject Alternative Name:
            DNS:server.example.com
      ...
  5. 서버 인증서의 CN 또는 SAN 필드에 서버의 FQDN과 다른 별칭이 포함된 경우 ServerAlias 매개변수를 /etc/cups/cupsd.conf 파일에 추가합니다.

    ServerAlias alternative_name.example.com

    이 경우 절차의 나머지 부분에서 FQDN 대신 대체 이름을 사용합니다.

  6. 개인 키와 서버 인증서를 /etc/cups/ssl/ 디렉터리에 저장합니다. 예를 들면 다음과 같습니다.

    # mv /root/server.key /etc/cups/ssl/server.example.com.key
    # mv /root/server.crt /etc/cups/ssl/server.example.com.crt
    중요

    CUPS를 사용하려면 개인 키 &lt ;fqdn > .key 및 서버 인증서 파일 &lt ;fqdn > .crt 를 지정해야 합니다. 별칭을 사용하는 경우 <alias> .key 및 <alias > .crt 파일의 이름을 지정해야 합니다.

  7. root 사용자만 이 파일을 읽을 수 있는 개인 키에 대한 보안 권한을 설정합니다.

    # chown root:root /etc/cups/ssl/server.example.com.key
    # chmod 600 /etc/cups/ssl/server.example.com.key

    인증서는 보안 연결을 설정하기 전에 클라이언트와 서버 간의 통신의 일부이므로 모든 클라이언트는 인증 없이 인증서를 검색할 수 있습니다. 따라서 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.

  8. SELinux 컨텍스트를 복원하십시오.

    # restorecon -Rv /etc/cups/ssl/
  9. 기본적으로 CUPS는 작업에 인증이 필요한 경우에만 암호화된 연결을 적용합니다(예: 웹 인터페이스의 /admin 페이지에서 관리 작업을 수행할 때).

    전체 CUPS 서버에 암호화를 적용하려면 /etc/cups/cupsd.conf 파일의 모든 < Location > 지시문에 Encryption 을 추가합니다. 예를 들면 다음과 같습니다.

    <Location />
      ...
      Encryption Required
    </Location>
  10. CUPS를 다시 시작합니다.

    # systemctl restart cups

검증

  1. 브라우저를 사용하고 https:// <hostname> :631 /admin/ 에 액세스합니다. 연결에 성공하면 CUPS에서 TLS 암호화를 올바르게 구성했습니다.
  2. 전체 서버에 암호화가 필요한 경우 http:// <hostname > :631/ 에 액세스합니다. CUPS는 Upgrade Required 오류를 반환합니다.

문제 해결

  • cups 서비스의 systemd 저널 항목을 표시합니다.

    # journalctl -u cups

    저널에 연결을 암호화할 수 없는 Unable이 포함된 경우 다음을 수행합니다. HTTPS 프로토콜을 사용하여 웹 인터페이스에 연결하지 못한 후 파일을 읽는 동안 오류가 발생했습니다. 개인 키 및 서버 인증서 파일의 이름을 확인합니다.

10.3. 웹 인터페이스에서 CUPS 서버를 관리할 수 있는 관리 권한 부여

기본적으로 sys,rootwheel 그룹의 멤버는 웹 인터페이스에서 관리 작업을 수행할 수 있습니다. 그러나 다른 서비스도 이러한 그룹을 사용합니다. 예를 들어 wheel 그룹의 멤버는 기본적으로 sudo 를 사용하여 root 권한으로 명령을 실행할 수 있습니다. CUPS 관리자가 다른 서비스에서 예기치 않은 권한을 얻지 않도록 하려면 CUPS 관리자 전용 그룹을 사용합니다.

사전 요구 사항

  • CUPS가 구성되어 있습니다.
  • 사용하려는 클라이언트의 IP 주소에는 웹 인터페이스의 관리 영역에 액세스할 수 있는 권한이 있습니다.

절차

  1. CUPS 관리자 그룹을 생성합니다.

    # groupadd cups-admins
  2. 웹 인터페이스에서 서비스를 관리해야 하는 사용자를 cups-admins 그룹에 추가합니다.

    # usermod -a -G cups-admins <username>
  3. /etc/cups/cups-files.conf 파일에서 SystemGroup 매개변수 값을 업데이트하고 cups-admin 그룹을 추가합니다.

    SystemGroup sys root wheel cups-admins

    cups-admin 그룹만 관리 액세스 권한이 있는 경우 매개 변수에서 다른 그룹 이름을 제거합니다.

  4. CUPS를 다시 시작합니다.

    # systemctl restart cups

검증

  1. 브라우저를 사용하고 https:// <hostname_or_ip_address > :631/admin/ 에 액세스합니다.

    참고

    HTTPS 프로토콜을 사용하는 경우에만 웹 UI의 관리 영역에 액세스할 수 있습니다.

  2. 관리 작업 수행을 시작합니다. 예를 들어 프린터 추가 를 클릭합니다.
  3. 웹 인터페이스에서 사용자 이름과 암호를 입력하라는 메시지를 표시합니다. 계속하려면 cups-admins 그룹의 멤버인 사용자의 자격 증명을 사용하여 인증합니다.

    인증이 성공하면 이 사용자는 관리 작업을 수행할 수 있습니다.

10.4. 프린터 드라이버가 있는 패키지 개요

RHEL(Red Hat Enterprise Linux)은 CUPS용 프린터 드라이버를 사용하여 다른 패키지를 제공합니다. 다음은 이러한 패키지에 대한 일반적인 개요와 드라이버를 포함하는 공급업체에 대한 개요입니다.

표 10.1. 드라이버 패키지 목록

패키지 이름프린터용 드라이버

cups

Zebra, Dymo

c2esp

Kodak

foomatic

대만, Canon, Epson, Gestson, Gestetner, HP, Infotec, Kyocera, Lanier, Lexmark, NRG, Ricoh, Cryostat, Savin, Sharp, Toshiba, Xerox 및 기타

gutenprint-cups

대만, Canon, Epson, Fujitsu, HP, Infotec, Kyocera, Lanier, NRG, Oki, Minolta, Ricoh, Cryostat, Savin, Xerox 및 기타

hplip

HP

pnm2ppa

HP

splix

retries, Xerox 및 기타

일부 패키지에는 동일한 프린터 공급 업체 또는 모델에 대한 드라이버가 포함되어 있지만 기능이 다를 수 있습니다.

필수 패키지를 설치한 후 CUPS 웹 인터페이스에서 드라이버 목록을 표시하거나 lpinfo -m 명령을 사용하여 표시할 수 있습니다.

10.5. 프린터가 드라이버 없는 인쇄를 지원하는지 여부 확인

CUPS는 드라이버 없는 인쇄를 지원하므로 프린터 모델에 대한 하드웨어별 소프트웨어를 제공하지 않고 출력할 수 있습니다. 이를 위해 프린터는 고객에게 해당 기능에 대해 알리고 다음 표준 중 하나를 사용해야 합니다.

  • AirPrint™
  • IPP Everywhere™
  • Mopria®
  • Wi-Fi 직접 인쇄 서비스

ipptool 유틸리티를 사용하여 프린터가 드라이버 없는 인쇄를 지원하는지 확인할 수 있습니다.

사전 요구 사항

  • 프린터 또는 원격 인쇄 서버는 IPP(Internet Printing Protocol)를 지원합니다.
  • 호스트는 프린터 또는 원격 인쇄 서버의 IPP 포트에 연결할 수 있습니다. 기본 IPP 포트는 631입니다.

절차

  • ipp-versions-supporteddocument-format-supported 속성을 쿼리하고 get- Cryostat-attributes 테스트가 전달되었는지 확인합니다.

    • 원격 프린터의 경우 다음을 입력합니다.

      # ipptool -tv ipp://<ip_address_or_hostname>:631/ipp/print get-printer-attributes.test | grep -E "ipp-versions-supported|document-format-supported|get-printer-attributes"
      Get printer attributes using get-printer-attributes      [PASS]
          ipp-versions-supported (1setOf keyword) = ...
          document-format-supported (1setOf mimeMediaType) = ...
    • 원격 인쇄 서버의 대기열의 경우 다음을 입력합니다.

      # ipptool -tv ipp://<ip_address_or_hostname>:631/printers/<queue_name> get-printer-attributes.test | grep -E "ipp-versions-supported|document-format-supported|get-printer-attributes"
      Get printer attributes using get-printer-attributes      [PASS]
          ipp-versions-supported (1setOf keyword) = ...
          document-format-supported (1setOf mimeMediaType) = ...

    드라이버 없는 인쇄가 작동하는지 확인하려면 출력에서 확인합니다.

    • get- Cryostat-attributes 테스트에서 PASS 를 반환합니다.
    • 프린터에서 지원하는 IPP 버전은 2.0 이상입니다.
    • 형식 목록에는 다음 중 하나가 포함됩니다.

      • application/pdf
      • 이미지/urf
      • image/pwg-raster
    • 색상 프린터의 경우 출력에는 언급된 형식 중 하나를 포함하며, 또한 image/jpeg.

10.6. 웹 인터페이스를 사용하여 CUPS에 프린터 추가

사용자가 CUPS를 통해 인쇄하려면 먼저 프린터를 추가해야 합니다. 예를 들어 USB를 통해 CUPS 호스트에 직접 연결된 네트워크 프린터와 프린터를 모두 사용할 수 있습니다.

CUPS 드라이버 없는 기능을 사용하거나 PPD(PPD) 파일을 사용하여 프린터를 추가할 수 있습니다.

참고

CUPS는 드라이버 없는 인쇄를 선호하며 드라이버 사용은 더 이상 사용되지 않습니다.

RHEL(Red Hat Enterprise Linux)은 mDNS 응답자를 쿼리하여 요청을 확인하는 이름 서비스 스위치 멀티캐스트 DNS 플러그인(nss-mdns)을 제공하지 않습니다. 결과적으로 mDNS를 사용하여 로컬 드라이버 없는 프린터에 대한 자동 검색 및 설치는 RHEL에서 사용할 수 없습니다. 이 문제를 해결하려면 단일 프린터를 수동으로 설치하거나 cups-browsed 를 사용하여 원격 인쇄 서버에서 사용할 수 있는 많은 양의 인쇄 대기열을 자동으로 설치합니다.

절차

  1. 브라우저를 사용하고 https:// <hostname> :631 /admin/ 에 액세스합니다.

    HTTPS 프로토콜을 사용하여 웹 인터페이스에 연결해야 합니다. 그렇지 않으면 CUPS를 사용하면 보안상의 이유로 이후 단계에서 인증할 수 없습니다.

  2. 프린터 추가를 클릭합니다.
  3. 아직 인증되지 않은 경우 CUPS에서 관리자의 자격 증명을 입력하라는 메시지를 표시합니다. 권한이 부여된 사용자의 사용자 이름과 암호를 입력합니다.
  4. 드라이버 없는 인쇄를 사용하지 않고 추가할 프린터가 자동으로 감지되면 해당 프린터를 선택하고 Continue 를 클릭합니다.
  5. 프린터가 감지되지 않은 경우:

    1. 프린터에서 지원하는 프로토콜을 선택합니다.

      cups에서 인쇄 프로토콜 선택

      프린터에서 드라이버 없는 인쇄를 지원하고 이 기능을 사용하려면 ipp 또는 ipps 프로토콜을 선택합니다.

    2. Continue 를 클릭합니다.
    3. 프린터 또는 원격 인쇄 서버의 대기열에 대한 URL을 입력합니다.

      cups 프린터 URL 추가
    4. Continue 를 클릭합니다.
  6. 이름 및 설명 및 위치를 입력합니다. CUPS를 출력 서버로 사용하고 다른 클라이언트가 이 프린터에서 CUPS를 통해 출력할 수 있어야 하는 경우 이 프린터 공유 도 선택합니다.

    cups 프린터 세부 정보 추가
  7. Make 목록에서 프린터 제조업체를 선택합니다. 프린터 제조업체가 목록에 없는 경우 일반 을 선택하거나 프린터에 대한 PPD 파일을 업로드합니다.

    cups에서 프린터 만들기 추가
  8. Continue 를 클릭합니다.
  9. 프린터 모델을 선택합니다.

    • 프린터가 드라이버 없는 인쇄를 지원하는 경우 IPP Everywhere 를 선택합니다. 이전에 프린터별 드라이버를 로컬에 설치한 경우 목록에 < Cryostat _name > - IPP Everywhere 와 같은 항목도 포함될 수 있습니다.
    • 프린터에서 드라이버 없는 인쇄를 지원하지 않는 경우 모델을 선택하거나 프린터에 대한 PPD 파일을 업로드합니다.
    cups 프린터 모델 추가
  10. Add Cryostat를 클릭합니다.
  11. 프린터 옵션 설정 페이지의 설정 및 탭은 드라이버와 프린터에서 지원하는 기능에 따라 달라집니다. 이 페이지를 사용하여 문서 크기와 같은 기본 옵션을 설정합니다.

    cups에서 프린터 기본값 추가
  12. 기본 옵션 설정을 클릭합니다.

검증

  1. 웹 인터페이스에서 Cryo stat 탭을 엽니다.
  2. 프린터 이름을 클릭합니다.
  3. 유지 관리 목록에서 테스트 출력 페이지를 선택합니다.

    cups 인쇄 테스트 페이지

문제 해결

10.7. lpadmin 유틸리티를 사용하여 CUPS에 프린터 추가

사용자가 CUPS를 통해 인쇄하려면 먼저 프린터를 추가해야 합니다. 예를 들어 USB를 통해 CUPS 호스트에 직접 연결된 네트워크 프린터와 프린터를 모두 사용할 수 있습니다.

CUPS 드라이버 없는 기능을 사용하거나 PPD(PPD) 파일을 사용하여 프린터를 추가할 수 있습니다.

참고

CUPS는 드라이버 없는 인쇄를 선호하며 드라이버 사용은 더 이상 사용되지 않습니다.

RHEL(Red Hat Enterprise Linux)은 mDNS 응답자를 쿼리하여 요청을 확인하는 이름 서비스 스위치 멀티캐스트 DNS 플러그인(nss-mdns)을 제공하지 않습니다. 결과적으로 mDNS를 사용하여 로컬 드라이버 없는 프린터에 대한 자동 검색 및 설치는 RHEL에서 사용할 수 없습니다. 이 문제를 해결하려면 단일 프린터를 수동으로 설치하거나 cups-browsed 를 사용하여 원격 인쇄 서버에서 사용할 수 있는 많은 양의 인쇄 대기열을 자동으로 설치합니다.

사전 요구 사항

절차

  • 프린터를 CUPS에 추가합니다.

    • 드라이버 없는 지원이 포함된 프린터를 추가하려면 다음을 입력합니다.

      # lpadmin -p Demo-printer -E -v ipp://192.0.2.200/ipp/print -m everywhere

      모든 위치에 있는 -m 옵션이 프린터에서 작동하지 않는 경우 -m driverless: <uri >를 사용해 보십시오(예: -m driverless:ipp://192.0.2.200/print ).

    • 드라이버 없는 지원이 포함된 원격 인쇄 서버의 큐를 추가하려면 다음을 입력합니다.

      # lpadmin -p Demo-printer -E -v ipp://192.0.2.201/printers/example-queue -m everywhere

      -m everywhere 옵션이 프린터에 대해 작동하지 않는 경우 -m driverless: <uri >를 시도합니다. 예를 들면 -m driverless:ipp://192.0.2.200/example-queue.

    • 파일에서 드라이버가 있는 프린터를 추가하려면 다음을 입력합니다.

      # lpadmin -p Demo-printer -E -v socket://192.0.2.200/ -P /root/example.ppd
    • 파일에 드라이버가 있는 원격 인쇄 서버의 큐를 추가하려면 다음을 입력합니다.

      # lpadmin -p Demo-printer -E -v ipp://192.0.2.201/printers/example-queue -P /root/example.ppd
    • 로컬 드라이버 데이터베이스에 드라이버가 있는 프린터를 추가하려면 다음을 수행합니다.

      1. 데이터베이스의 드라이버를 나열합니다.

        # lpinfo -m
        ...
        drv:///sample.drv/generpcl.ppd Generic PCL Laser Printer
        ...
      2. 데이터베이스의 드라이버에 URI가 있는 프린터를 추가합니다.

        # lpadmin -p Demo-printer -E -v socket://192.0.2.200/ -m drv:///sample.drv/generpcl.ppd

    이러한 명령은 다음 옵션을 사용합니다.

    • -p <printer_name>: CUPS에서 프린터 이름을 설정합니다.
    • -E: 프린터 및 CUPS에서 해당 작업에 대한 작업을 수락할 수 있습니다. p 뒤에 이 옵션을 지정해야 합니다. 자세한 내용은 도움말 페이지에서 옵션의 설명을 참조하십시오.
    • -v <uri>: URI를 프린터 또는 원격 인쇄 서버 대기열로 설정합니다.
    • -m <driver_uri>: 로컬 드라이버 데이터베이스에서 얻은 제공된 드라이버 URI를 기반으로 PPD 파일을 설정합니다.
    • -P <PPD_file>: PPD 파일의 경로를 설정합니다.

검증

  1. 사용 가능한 프린터를 표시합니다.

    # lpstat -p
    printer Demo-printer is idle. enabled since Fri 23 Jun 2023 09:36:40 AM CEST
  2. 테스트 페이지를 인쇄합니다.

    # lp -d Demo-printer /usr/share/cups/data/default-testpage.pdf

10.8. 웹 인터페이스를 사용하여 CUPS 프린터에서 유지 관리 및 관리 작업 수행

프린터 관리자는 인쇄 서버에서 다른 작업을 수행해야 하는 경우가 있습니다. 예를 들면 다음과 같습니다.

  • 기술자가 프린터를 복구하는 동안 프린터를 일시적으로 일시 정지하는 것과 같은 유지 관리 작업
  • 프린터의 기본 설정 변경과 같은 관리 작업

CUPS 웹 인터페이스를 사용하여 이러한 작업을 수행할 수 있습니다.

사전 요구 사항

절차

  1. 브라우저를 사용하고 https:// <hostname> :631 / Cryostats/ 에 액세스합니다.

    HTTPS 프로토콜을 사용하여 웹 인터페이스에 연결해야 합니다. 그렇지 않으면 CUPS를 사용하면 보안상의 이유로 이후 단계에서 인증할 수 없습니다.

  2. 구성할 프린터 이름을 클릭합니다.
  3. 유지 관리 또는 관리 작업을 수행할지 여부에 따라 해당 목록에서 필요한 작업을 선택합니다.

    cups 프린터 작업
  4. 아직 인증되지 않은 경우 CUPS에서 관리자의 자격 증명을 입력하라는 메시지를 표시합니다. 권한이 부여된 사용자의 사용자 이름과 암호를 입력합니다.
  5. 작업을 수행합니다.

10.9. Samba를 사용하여 Kerberos 인증이 있는 Windows 인쇄 서버에 인쇄

samba-krb5-printing wrapper를 사용하면 RHEL(Red Hat Enterprise Linux)에 로그인한 Active Directory(AD) 사용자는 Kerberos를 사용하여 Active Directory(AD)에 인증한 다음 출력 작업을 Windows 인쇄 서버로 전달하는 로컬 CUPS 인쇄 서버로 출력할 수 있습니다.

이 구성의 이점은 RHEL의 CUPS 관리자가 고정된 사용자 이름과 암호를 구성에 저장할 필요가 없다는 것입니다. CUPS는 출력 작업을 전송하는 사용자의 Kerberos 티켓을 사용하여 AD로 인증됩니다.

참고

Red Hat은 로컬 시스템에서 CUPS에 출력 작업만 제출하고 Samba 인쇄 서버에서 프린터를 다시 공유하지 않도록 지원합니다.

사전 요구 사항

  • 로컬 CUPS 인스턴스에 추가할 프린터는 AD 출력 서버에서 공유됩니다.
  • AD에 RHEL 호스트를 멤버로 가입했습니다.
  • CUPS가 RHEL에 설치되고 cups 서비스가 실행 중입니다.
  • 프린터의 PPD(PPD) 파일은 /usr/share/cups/model/ 디렉터리에 저장됩니다.

절차

  1. samba-krb5-printing,samba-client, krb5-workstation 패키지를 설치합니다.

    # yum install samba-krb5-printing samba-client krb5-workstation
  2. 선택 사항: 도메인 관리자로 인증하고 Windows 인쇄 서버에서 공유되는 프린터 목록을 표시합니다.

    # smbclient -L win_print_srv.ad.example.com -U administrator@AD_KERBEROS_REALM --use-kerberos=required
    
    	Sharename       Type      Comment
    	---------       ----      -------
    	...
    	Example         Printer   Example
    	...
  3. 선택 사항: 프린터 PPD 이름을 식별하는 CUPS 모델 목록을 표시합니다.

    lpinfo -m
    ...
    samsung.ppd Samsung M267x 287x Series PXL
    ...

    다음 단계에서 프린터를 추가할 때 PPD 파일의 이름이 필요합니다.

  4. 프린터를 CUPS에 추가합니다.

    # lpadmin -p "example_printer" -v smb://win_print_srv.ad.example.com/Example -m samsung.ppd -o auth-info-required=negotiate -E

    명령에서는 다음 옵션을 사용합니다.

    • -P printer_name 은 CUPS에서 프린터 이름을 설정합니다.
    • -V URI_to_Windows_ Cryostat 는 URI를 Windows 프린터로 설정합니다. smb://host_name/printer_share_name 형식을 사용합니다.
    • -m PPD_file 은 프린터가 사용하는 PPD 파일을 설정합니다.
    • -O auth-info-required=negotiate 는 출력 작업을 원격 서버로 전달할 때 Kerberos 인증을 사용하도록 CUPS를 구성합니다.
    • - e 프린터 및 CUPS는 프린터에 대한 작업을 허용합니다.

검증

  1. AD 도메인 사용자로 RHEL 호스트에 로그인합니다.
  2. AD 도메인 사용자로 인증합니다.

    # kinit domain_user_name@AD_KERBEROS_REALM
  3. 로컬 CUPS 출력 서버에 추가한 프린터로 파일을 출력합니다.

    # lp -d example_printer file

10.10. cups-browsed를 사용하여 원격 인쇄 서버의 프린터를 로컬로 통합

cups-browsed 서비스는 DNS 서비스 검색(DNS-SD) 및 CUPS 검색 기능을 사용하여 로컬 CUPS 서비스에서 공유 원격 프린터의 모든 또는 필터링된 하위 집합을 자동으로 사용할 수 있도록 합니다.

예를 들어 관리자는 워크스테이션에서 이 기능을 사용하여 애플리케이션의 인쇄 대화 상자에서 사용할 수 있는 신뢰할 수 있는 인쇄 서버의 프린터만 만들 수 있습니다. 인쇄 서버가 많은 수의 프린터를 공유하는 경우 나열된 프린터 수를 줄이기 위해 특정 기준에 따라 검색되는 프린터를 필터링하도록 cups-browsed 를 구성할 수도 있습니다.

참고

애플리케이션의 출력 대화 상자에서 DNS-SD와 같은 다른 메커니즘을 사용하여 원격 프린터를 나열하는 경우 cups-browsed 는 영향을 미치지 않습니다. cups-browsed 서비스는 사용자가 수동으로 목록에 없는 프린터에 액세스하는 것을 방지하지 않습니다.

사전 요구 사항

  • CUPS 서비스는 로컬 호스트에 구성됩니다.
  • 원격 CUPS 출력 서버가 존재하며 다음 조건이 이 서버에 적용됩니다.

    • 서버는 클라이언트에서 액세스할 수 있는 인터페이스에서 수신 대기합니다.
    • /etc/cups/cups.conf 파일의 서버의 < Location / > 지시문의 Allow from 매개 변수는 클라이언트의 IP 주소에서 액세스할 수 있습니다.
    • 서버는 프린터를 공유합니다.
    • 방화벽 규칙을 사용하면 클라이언트에서 서버의 CUPS 포트로 액세스할 수 있습니다.

절차

  1. /etc/cups/cups-browsed.conf 파일을 편집하고 다음과 같이 변경합니다.

    1. 폴링하려는 각 원격 CUPS 서버에 대해 BrowsePoll 매개변수를 추가합니다.

      BrowsePoll remote_cups_server.example.com
      BrowsePoll 192.0.2.100:1631

      원격 CUPS 서버가 631과 다른 포트에서 수신 대기하는 경우 호스트 이름 또는 IP 주소에 : <port>를 추가합니다.

    2. 선택 사항: 로컬 CUPS 서비스에 표시되는 프린터를 제한하도록 필터를 구성합니다. 예를 들어 이름에 sales_ 가 포함된 큐를 필터링하려면 다음을 추가합니다.

      BrowseFilter name sales_

      다른 필드 이름으로 필터링하고 필터를 무효화하고 정확한 값과 일치시킬 수 있습니다. 자세한 내용은 cups-browsed.conf(5) 도움말 페이지의 매개변수 설명 및 예제를 참조하십시오.

    3. 선택 사항: 폴링 간격 및 타임아웃을 변경하여 검색 주기 수를 제한합니다.

      BrowseInterval 1200
      BrowseTimeout 6000

      동일한 비율로 BrowseIntervalBrowseTimeout 을 모두 늘리면 프린터가 검색 목록에서 사라지는 상황을 방지합니다. 즉, BrowseInterval 의 값을 5 또는 더 높은 정수로 곱하고, BrowseTimeout 에 대해 이 결과 값을 사용합니다.

      기본적으로 cups-browsed 는 60초마다 원격 서버를 폴링하고 시간 초과는 300초입니다. 그러나 큐가 많은 인쇄 서버에서 이러한 기본값은 많은 리소스가 필요할 수 있습니다.

  2. cups-browsed 서비스를 활성화하고 시작합니다.

    # systemctl enable --now cups-browsed

검증

  • 사용 가능한 프린터를 나열합니다.

    # lpstat -v
    device for Demo-printer: implicitclass://Demo-printer/
    ...

    프린터 출력에 암시적 클래스 가 포함된 경우cups-browsed 는 CUPS에서 프린터를 관리합니다.

추가 리소스

  • cups-browsed.conf(5) 도움말 페이지

10.11. systemd 저널의 CUPS 로그에 액세스

기본적으로 CUPS는 로그 메시지를 systemd 저널에 저장합니다. 여기에는 다음이 포함됩니다.

  • 오류 메시지
  • 로그 항목 액세스
  • 페이지 로그 항목

절차

  • 로그 항목을 표시합니다.

    • 모든 로그 항목을 표시하려면 다음을 입력합니다.

      # journalctl -u cups
    • 특정 출력 작업의 로그 항목을 표시하려면 다음을 입력합니다.

      # journalctl -u cups JID=<print_job_id>
    • 특정 기간 내에 로그 항목을 표시하려면 다음을 입력합니다.

      # journalectl -u cups --since=<YYYY-MM-DD> --until=<YYYY-MM-DD>

      YYYY 를 연도로 바꾸고, MM 을 월로, DD 를 하루로 바꿉니다.

추가 리소스

  • journalctl(1) 도움말 페이지

10.12. systemd 저널 대신 파일에 로그를 저장하도록 CUPS 구성

기본적으로 CUPS는 로그 메시지를 systemd 저널에 저장합니다. 또는 로그 메시지를 파일에 저장하도록 CUPS를 구성할 수 있습니다.

절차

  1. /etc/cups/cups-files.conf 파일을 편집하고 AccessLog,ErrorLogPageLog 매개변수를 이러한 로그 파일을 저장하려는 경로로 설정합니다.

    AccessLog /var/log/cups/access_log
    ErrorLog /var/log/cups/error_log
    PageLog /var/log/cups/page_log
  2. /var/log/cups/ 이외의 디렉터리에 로그를 저장하도록 CUPS를 구성하는 경우 이 디렉터리에 cupsd_log_t SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.

    # semanage fcontext -a -t cupsd_log_t "/var/log/printing(/.*)?"
    # restorecon -Rv /var/log/printing/
  3. cups 서비스를 다시 시작하십시오.

    # systemctl restart cups

검증

  1. 로그 파일을 표시합니다.

    # cat /var/log/cups/access_log
    # cat /var/log/cups/error_log
    # cat /var/log/cups/page_log
  2. /var/log/cups/ 가 아닌 다른 디렉터리에 로그를 저장하도록 CUPS를 구성한 경우 로그 디렉터리의 SELinux 컨텍스트가 cupsd_log_t:인지 확인합니다.

    # ls -ldZ /var/log/printing/
    drwxr-xr-x. 2 lp sys unconfined_u:object_r:cupsd_log_t:s0 6 Jun 20 15:55 /var/log/printing/

10.13. CUPS 문서에 액세스

CUPS는 CUPS 서버에 설치된 서비스 문서에 대한 브라우저 기반 액세스를 제공합니다. 이 문서에는 다음이 포함됩니다.

  • 명령줄 프린터 관리 및 회계와 같은 관리 문서
  • 도움말 페이지
  • 관리 API와 같은 프로그래밍 문서
  • 참고 자료
  • 사양

사전 요구 사항

절차

  1. 브라우저를 사용하고 http:// <hostname_or_ip_address > :631/help/ : 에 액세스합니다.

    cups 도움말
  2. 온라인 도움말 문서에서 항목을 확장하고 읽을 문서를 선택합니다.

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.