다양한 유형의 서버 배포
웹 서버 및 역방향 프록시, 네트워크 파일 서비스, 데이터베이스 서버, 메일 전송 에이전트 및 프린터 설정 및 구성
초록
Red Hat 문서에 관한 피드백 제공
문서 개선을 위한 의견에 감사드립니다. 어떻게 개선할 수 있는지 알려주십시오.
Jira를 통해 피드백 제출 (등록 필요)
- Jira 웹 사이트에 로그인합니다.
- 상단 탐색 모음에서 생성 을 클릭합니다.
- 요약 필드에 설명 제목을 입력합니다.
- 설명 필드에 개선을 위한 제안을 입력합니다. 문서의 관련 부분에 대한 링크를 포함합니다.
- 대화 상자 하단에서 생성 을 클릭합니다.
1장. Apache HTTP 웹 서버 설정
1.1. Apache HTTP 웹 서버 개요
웹 서버는 웹을 통해 클라이언트에 콘텐츠를 제공하는 네트워크 서비스입니다. 이는 일반적으로 웹 페이지를 의미하지만 다른 모든 문서도 될 수 있습니다. 웹 서버는 하이퍼텍스트 전송 프로토콜 (HTTP)을 사용하므로 HTTP 서버라고도 합니다.
Apache HTTP Server인 httpd
는 Apache 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 개인키를 식별할 수 있으며, 선택적으로SSLCertificateKeyFile
및SSLCertificateFile
지시문으로 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
기타 주요 변경 사항은 다음과 같습니다.
다음 모듈이 제거되었습니다.
-
mod_file_cache
mod_nss
mod_ssl
을 대체로 사용합니다.mod_nss
에서 마이그레이션 하는 방법에 대한 자세한 내용은 1.14절. “Apache 웹 서버 구성에서 사용하기 위해 NSS 데이터베이스에서 개인 키 및 인증서 내보내기”에서 참조하십시오.-
mod_perl
-
-
RHEL 8의 Apache HTTP Server에서 사용하는 DBM 인증 데이터베이스의 기본 유형이
SDBM
에서db5
로 변경되었습니다. -
Apache HTTP Server의
mod_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
는 시작 후 구성 파일을 읽습니다. 아래 표에 있는 구성 파일 위치 목록을 확인할 수 있습니다.
경로 | 설명 |
---|---|
| 기본 구성 파일입니다. |
| 기본 구성 파일에 포함된 구성 파일의 보조 디렉토리입니다. |
| 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 이름 기반 가상 호스트 구성을 참조하십시오.
절차
httpd
패키지를 설치합니다.# yum install httpd
firewalld
를 사용하는 경우 로컬 방화벽에서 TCP 포트80
을 엽니다.# firewall-cmd --permanent --add-port=80/tcp # firewall-cmd --reload
httpd
서비스를 활성화하고 시작합니다.# systemctl enable --now httpd
선택 사항: 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을 해당 파일에 입력하여 로드할 수 있습니다.
추가 리소스
- Apache Manual: Apache HTTP 서버 설명서 설치.
-
시스템의
httpd.service(8)
도움말 페이지를 참조하십시오.
1.7. Apache 이름 기반 가상 호스트 구성
이름 기반 가상 호스트를 사용하면 Apache가 서버의 IP 주소로 해석되는 다양한 도메인에 다양한 콘텐츠를 제공할 수 있습니다.
별도의 문서 루트 디렉터리를 사용하여 example.com
및 example.net
도메인 모두에 가상 호스트를 설정할 수 있습니다. 두 가상 호스트는 모두 정적 HTML 콘텐츠를 제공합니다.
사전 요구 사항
클라이언트 및 웹 서버는
example.com
및example.net
도메인을 웹 서버의 IP 주소로 확인합니다.이러한 항목을 DNS 서버에 수동으로 추가해야 합니다.
절차
httpd
패키지를 설치합니다.# yum install httpd
/etc/httpd/conf/httpd.conf
파일을 편집합니다.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는
ServerName
및ServerAlias
매개 변수에 설정된 도메인과 일치하지 않는 요청에도 구성에 있는 첫 번째 가상 호스트를 사용합니다. 여기에는 서버의 IP 주소로 전송된 요청도 포함됩니다.
-
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>
두 가상 호스트 모두에 대한 문서 루트를 생성합니다.
# mkdir /var/www/example.com/ # mkdir /var/www/example.net/
/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
패키지를 설치해야 합니다.firewalld
를 사용하는 경우 로컬 방화벽에서 포트80
을 엽니다.# firewall-cmd --permanent --add-port=80/tcp # firewall-cmd --reload
httpd
서비스를 활성화하고 시작합니다.# systemctl enable --now httpd
검증
각 가상 호스트의 문서 루트에 다른 예제 파일을 생성합니다.
# echo "vHost example.com" > /var/www/example.com/index.html # echo "vHost example.net" > /var/www/example.net/index.html
-
브라우저를 사용하고
http://example.com
에 연결합니다. 웹 서버는example.com
가상 호스트의 예제 파일을 보여줍니다. -
브라우저를 사용하고
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
모듈을 대체합니다.
사전 요구 사항
-
httpd
및gssproxy
패키지가 설치됩니다. -
Apache 웹 서버가 설정되고
httpd
서비스가 실행 중입니다.
1.8.1. IdM 환경에서 GSS-Proxy 설정
다음 절차에서는 Apache HTTP 웹 서버에서 Kerberos 인증을 수행하기 위해 GSS-Proxy
를 설정하는 방법을 설명합니다.
절차
서비스 주체를 생성하여 HTTP/<SERVER_NAME>@realm 주체의
keytab
파일에 대한 액세스를 활성화합니다.# ipa service-add HTTP/<SERVER_NAME>
/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
사용자는 그렇지 않습니다.다음 콘텐츠를 사용하여
/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
gssproxy
서비스를 재시작하고 활성화합니다.# systemctl restart gssproxy.service # systemctl enable gssproxy.service
추가 리소스
-
시스템의
gssproxy(8)
도움말 페이지 -
시스템의
gssproxy-mech(8)
도움말 페이지 -
gssproxy.conf(5)
시스템의 도움말 페이지
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 주소로 확인합니다.
절차
mod_ssl
패키지를 설치합니다.# yum install mod_ssl
/etc/httpd/conf.d/ssl.conf
파일을 편집하고 다음 설정을<VirtualHost _default_:443>
지시문에 추가합니다.서버 이름을 설정합니다.
ServerName example.com
서버 이름은 인증서의 Common Name
필드에 설정된 항목과 일치해야 합니다.
선택 사항: 인증서에 SAN(
Subject Alt Names
) 필드에 추가 호스트 이름이 포함된 경우 이러한 호스트 이름에도 TLS 암호화를 제공하도록mod_ssl
을 구성할 수 있습니다. 이를 구성하려면 해당 이름으로ServerAliases
매개변수를 추가합니다.ServerAlias www.example.com server.example.com
개인 키, 서버 인증서 및 CA 인증서에 대한 경로를 설정합니다.
SSLCertificateKeyFile "/etc/pki/tls/private/example.com.key" SSLCertificateFile "/etc/pki/tls/certs/example.com.crt" SSLCACertificateFile "/etc/pki/tls/certs/ca.crt"
보안상의 이유로
root
사용자만 개인 키 파일에 액세스할 수 있도록 구성합니다.# chown root:root /etc/pki/tls/private/example.com.key # chmod 600 /etc/pki/tls/private/example.com.key
주의권한이 없는 사용자가 개인 키에 액세스한 경우 인증서를 취소하고 새 개인 키를 만들고 새 인증서를 요청합니다. 그렇지 않으면 TLS 연결이 더 이상 안전하지 않습니다.
firewalld
를 사용하는 경우 로컬 방화벽에서 포트443
을 엽니다.# firewall-cmd --permanent --add-port=443/tcp # firewall-cmd --reload
httpd
서비스를 다시 시작합니다.# systemctl restart httpd
참고개인 키 파일을 암호로 보호한 경우
httpd
서비스가 시작될 때마다 이 암호를 입력해야 합니다.
검증
-
브라우저를 사용하고
https://example.com
에 연결합니다.
1.9.2. Apache HTTP Server에서 지원되는 TLS 프로토콜 버전 설정
기본적으로 RHEL의 Apache HTTP Server는 최신 브라우저와 호환되는 안전한 기본값을 정의하는 시스템 전체 암호화 정책을 사용합니다. 예를 들어 DEFAULT
정책은 apache에서 TLSv1.2
및 TLSv1.3
프로토콜 버전만 사용하도록 정의합니다.
Apache HTTP Server에서 지원하는 TLS 프로토콜 버전을 수동으로 구성할 수 있습니다. 환경에서 특정 TLS 프로토콜 버전만 활성화해야 하는 경우 절차를 따르십시오. 예를 들면 다음과 같습니다.
-
환경에 해당 클라이언트가 클라이언트가 취약한
TLS1
(TLSv1.0) 또는TLS1.1
프로토콜을 사용할 수도 있어야 하는 경우 -
Apache가
TLSv1.2
또는TLSv1.3
프로토콜만 지원하도록 구성하려는 경우
사전 요구 사항
- TLS 암호화는 Apache HTTP 서버에 TLS 암호화 추가에 설명된 대로 서버에서 활성화됩니다.
절차
/etc/httpd/conf/httpd.conf
파일을 편집하고 다음 설정을 TLS 프로토콜 버전을 설정하려는<VirtualHost>
지시문에 추가합니다. 예를 들어TLSv1.3
프로토콜만 활성화하려면 다음을 수행합니다.SSLProtocol -All TLSv1.3
httpd
서비스를 다시 시작합니다.# systemctl restart httpd
검증
다음 명령을 사용하여 서버가
TLSv1.3
을 지원하는지 확인합니다:# openssl s_client -connect example.com:443 -tls1_3
다음 명령을 사용하여 서버가
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
- 선택 사항: 다른 TLS 프로토콜 버전에 대해 명령을 반복합니다.
추가 리소스
-
시스템의
update-crypto-policies(8)
도움말 페이지 - 시스템 전체 암호화 정책 사용.
-
SSLProtocol
매개변수에 대한 자세한 내용은 Apache 설명서의mod_ssl
설명서를 참조하십시오. Apache HTTP 서버 설명서 설치.
1.9.3. Apache HTTP Server에서 지원되는 암호 설정
기본적으로 Apache HTTP 서버는 최근 브라우저와 호환되는 안전한 기본값을 정의하는 시스템 전체 암호화 정책을 사용합니다. 시스템 전체에서 허용하는 암호 목록은 /etc/crypto-policies/back-ends/openssl.config
파일을 참조하십시오.
Apache HTTP Server에서 지원하는 암호를 수동으로 구성할 수 있습니다. 환경에 특정 암호가 필요한 경우 절차를 따르십시오.
사전 요구 사항
- TLS 암호화는 Apache HTTP 서버에 TLS 암호화 추가에 설명된 대로 서버에서 활성화됩니다.
절차
/etc/httpd/conf/httpd.conf
파일을 편집하고SSLCipherSuite
매개변수를 TLS 암호를 설정하려는<VirtualHost>
지시문에 추가합니다.SSLCipherSuite "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!SHA1:!SHA256"
이 예제에서는
EECDH+AESGCM
,EDH+AESGCM
,AES256+EECDH
및AES256+EDH
암호만 활성화하며SHA1
및SHA256
메시지 인증 코드(MAC)를 사용하는 모든 암호를 비활성화합니다.httpd
서비스를 다시 시작합니다.# systemctl restart httpd
검증
Apache HTTP Server에서 지원하는 암호 목록을 표시하려면 다음을 수행합니다.
nmap
패키지를 설치합니다.# yum install nmap
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 ...
추가 리소스
-
시스템의
update-crypto-policies(8)
도움말 페이지 - 시스템 전체 암호화 정책 사용.
- SSLCipherSuite
1.10. TLS 클라이언트 인증서 인증 구성
관리자는 클라이언트 인증서 인증을 통해 인증서를 사용하여 인증한 사용자만 웹 서버의 리소스에 액세스할 수 있도록 허용할 수 있습니다. /var/www/html/Example/
디렉터리에 대한 클라이언트 인증서 인증을 구성할 수 있습니다.
Apache HTTP Server에서 TLS 1.3 프로토콜을 사용하는 경우 특정 클라이언트에 추가 구성이 필요합니다. 예를 들어 Firefox에서 about:config
메뉴의 security.tls.enable_post_handshake_auth
매개 변수를 true
로 설정합니다.
사전 요구 사항
- TLS 암호화는 Apache HTTP 서버에 TLS 암호화 추가에 설명된 대로 서버에서 활성화됩니다.
절차
/etc/httpd/conf/httpd.conf
파일을 편집하고 다음 설정을 클라이언트 인증을 구성하려는<VirtualHost>
지시문에 추가합니다.<Directory "/var/www/html/Example/"> SSLVerifyClient require </Directory>
SSLverifyClient require
를 설정해야 클라이언트가/var/www/html/Example/
디렉터리의 콘텐츠에 액세스하기 전에 서버가 클라이언트 인증서의 유효성을 검사해야 합니다.httpd
서비스를 다시 시작합니다.# systemctl restart httpd
검증
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
이 오류는 웹 서버에 클라이언트 인증서 인증이 필요함을 나타냅니다.
클라이언트 개인 키 및 인증서와 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_security
및 mod_security_crs
패키지를 설치하십시오. mod_security_crs
패키지는 ModSecurity 웹 기반 애플리케이션 방화벽(WAF) 모듈에 대한 코어 규칙 세트(CRS)를 제공합니다.
절차
mod_security
,mod_security_crs
,httpd
패키지를 설치합니다.# yum install -y mod_security mod_security_crs httpd
httpd
서버를 시작합니다.# systemctl restart httpd
검증
Apache HTTP 서버에서 ModSecurity 웹 기반 애플리케이션 방화벽이 활성화되어 있는지 확인합니다.
# httpd -M | grep security security2_module (shared)
/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가 설치 및 활성화되어 있습니다.
절차
선택한 텍스트 편집기에서
/etc/httpd/conf.d/mod_security.conf
파일을 엽니다. 예를 들면 다음과 같습니다.# vi /etc/httpd/conf.d/mod_security.conf
SecRuleEngine On
으로 시작하는 행 뒤에 다음 예제 규칙을 추가합니다.SecRule ARGS:data "@contains evil" "deny,status:403,msg:'param data contains evil data',id:1"
이전 규칙은
data
매개변수에사악한
문자열이 포함된 경우 사용자에게 리소스 사용을 금지합니다.- 변경 사항을 저장하고 편집기를 종료합니다.
httpd
서버를 다시 시작합니다.# systemctl restart httpd
검증
테스트.html
페이지를 만듭니다.# echo "mod_security test" > /var/www/html/test.html
httpd
서버를 다시 시작합니다.# systemctl restart httpd
HTTP 요청의
GET
변수에 악성 데이터가 없는test.html
을 요청합니다.$ curl http://localhost/test.html?data=good mod_security test
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>
/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가 설치되어 실행 중입니다.
절차
httpd-manual
패키지를 설치합니다.# yum install httpd-manual
선택 사항: 기본적으로 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>
httpd
서비스를 다시 시작합니다.# systemctl restart httpd
검증
-
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
패키지가 설치되어 있습니다.
절차
/etc/httpd/conf.modules.d/
디렉터리의 구성 파일에서 모듈 이름을 검색합니다.# grep mod_ssl.so /etc/httpd/conf.modules.d/*
모듈 이름을 찾은 구성 파일을 편집하고 모듈의
LoadModule
지시문의 주석을 제거합니다.LoadModule ssl_module modules/mod_ssl.so
예를 들어 RHEL 패키지가 모듈을 제공하지 않기 때문에 모듈을 찾을 수 없는 경우 다음 지시문을 사용하여
/etc/httpd/conf.modules.d/30-example.conf
와 같은 구성 파일을 만듭니다.LoadModule ssl_module modules/<custom_module>.so
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 데이터베이스에 저장됩니다.
절차
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
다음 단계에서 인증서의 닉네임이 필요합니다.
개인 키를 추출하려면 일시적으로 PKCS #12 파일로 키를 내보내야 합니다.
개인 키와 연결된 인증서의 닉네임을 사용하여 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 파일에 암호를 설정해야 합니다. 다음 단계에서 이 암호가 필요합니다.
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
임시 PKCS #12 파일을 삭제합니다.
# rm /etc/pki/tls/private/export.p12
root
사용자만 이 파일에 액세스할 수 있도록/etc/pki/tls/private/server.key
에 대한 권한을 설정합니다.# chown root:root /etc/pki/tls/private/server.key # chmod 0600 /etc/pki/tls/private/server.key
NSS 데이터베이스에서 서버 인증서의 닉네임을 사용하여 CA 인증서를 내보냅니다.
# certutil -d /etc/httpd/alias/ -L -n "Example Server Certificate" -a -o /etc/pki/tls/certs/server.crt
root
사용자만 이 파일에 액세스할 수 있도록/etc/pki/tls/certs/server.crt
에 대한 권한을 설정합니다.# chown root:root /etc/pki/tls/certs/server.crt # chmod 0600 /etc/pki/tls/certs/server.crt
NSS 데이터베이스에서 CA 인증서의 닉네임을 사용하여 CA 인증서를 내보냅니다.
#
certutil -d /etc/httpd/alias/ -L -n "Example CA" -a -o /etc/pki/tls/certs/ca.crt
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)
,pkcs12(1ssl)
도움말 페이지
1.15. 추가 리소스
-
httpd(8)
-
httpd.service(8)
-
httpd.conf(5)
-
apachectl(8)
- Apache httpd 작업에 GSS-Proxy 사용.
- PKCS #11을 통해 암호화 하드웨어를 사용하도록 애플리케이션 구성.
2장. NGINX 설정 및 구성
NGINX는 다음과 같이 사용할 수 있는 고성능 모듈식 서버입니다.
- 웹 서버
- 역방향 프록시
- 로드 밸런서
2.1. NGINX 설치 및 준비
Red Hat은 애플리케이션 스트림을 사용하여 다양한 버전의 NGINX를 제공합니다. 다음을 수행할 수 있습니다.
- 스트림 선택 및 NGINX를 설치
- 방화벽에서 필요한 포트를 열기
-
nginx
서비스 활성화 및 시작
기본 구성을 사용하여 NGINX는 포트 80
의 웹 서버로 실행되며 /usr/share/nginx/html/
디렉터리에서 콘텐츠를 제공합니다.
사전 요구 사항
- RHEL 8이 설치되어 있습니다.
- 호스트가 Red Hat 고객 포털에 가입되어 있습니다.
-
firewalld
서비스가 활성화 및 시작됨
절차
사용 가능한 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
기본값과 다른 스트림을 설치하려면 스트림을 선택합니다.
# yum module enable nginx:stream_version
nginx
패키지를 설치합니다.# yum install nginx
NGINX가 방화벽에 서비스를 제공해야 하는 포트를 엽니다. 예를 들어
firewalld
에서 HTTP(포트 80) 및 HTTPS(포트 443)의 기본 포트를 열려면 다음을 입력합니다.# firewall-cmd --permanent --add-port={80/tcp,443/tcp} # firewall-cmd --reload
시스템이 부팅될 때
nginx
서비스가 자동으로 시작되도록 활성화합니다.# systemctl enable nginx
선택 사항:
nginx
서비스를 시작합니다.# systemctl start nginx
기본 구성을 사용하지 않으려면 서비스를 시작하기 전에 이 단계를 건너뛰고 그에 따라 NGINX를 구성합니다.
PHP 모듈에는 특정 NGINX 버전이 필요합니다. 호환되지 않는 버전을 사용하면 최신 NGNIX 스트림으로 업그레이드할 때 충돌이 발생할 수 있습니다. PHP 7.2 스트림 및 NGNIX 1.24 스트림을 사용할 때 NGINX를 설치하기 전에 최신 PHP 스트림 7.4를 활성화하여 이 문제를 해결할 수 있습니다.
검증
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
NGINX가 서비스를 제공해야 하는 포트가 firewalld에 열려 있는지 확인합니다.
# firewall-cmd --list-ports 80/tcp 443/tcp
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.com
및example.net
도메인을 웹 서버의 IP 주소로 확인합니다.이러한 항목을 DNS 서버에 수동으로 추가해야 합니다.
프로세스
/etc/nginx/nginx.conf
파일을 편집합니다.기본적으로
/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
블록의 웹 콘텐츠 경로를 설정합니다.
-
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
지시문은 이 도메인에 대한 별도의 오류 로그 파일을 정의합니다.
-
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; }
두 도메인의 root 디렉터리를 생성합니다.
# mkdir -p /var/www/example.com/ # mkdir -p /var/www/example.net/
두 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
패키지를 설치해야 합니다.두 도메인의 로그 디렉터리를 생성합니다.
# mkdir /var/log/nginx/example.com/ # mkdir /var/log/nginx/example.net/
nginx
서비스를 다시 시작합니다.# systemctl restart nginx
검증
각 가상 호스트의 문서 루트에 다른 예제 파일을 생성합니다.
# 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
-
브라우저를 사용하고
http://example.com
에 연결합니다. 웹 서버는/var/www/example.com/index.html
파일의 예제 콘텐츠를 표시합니다. -
브라우저를 사용하고
http://example.net
에 연결합니다. 웹 서버는/var/www/example.net/index.html
파일의 예제 콘텐츠를 표시합니다. -
브라우저를 사용하고
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
은 로컬 방화벽에서 열려 있습니다.
절차
/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; }
보안상의 이유로
root
사용자만 개인 키 파일에 액세스할 수 있도록 구성합니다.# chown root:root /etc/pki/tls/private/example.com.key # chmod 600 /etc/pki/tls/private/example.com.key
주의권한이 없는 사용자가 개인 키에 액세스한 경우 인증서를 취소하고 새 개인 키를 만들고 새 인증서를 요청합니다. 그렇지 않으면 TLS 연결이 더 이상 안전하지 않습니다.
nginx
서비스를 다시 시작합니다.# systemctl restart nginx
검증
-
브라우저를 사용하고
https://example.com
에 연결
추가 리소스
2.4. NGINX를 HTTP 트래픽의 역방향 프록시로 구성
HTTP 트래픽의 역방향 프록시로 작동하도록 NGINX 웹 서버를 구성할 수 있습니다. 예를 들어 이 기능을 사용하여 요청을 원격 서버의 특정 하위 디렉터리에 전달할 수 있습니다. 클라이언트 화면에서 클라이언트는 액세스하는 호스트에서 콘텐츠를 로드합니다. 그러나 NGINX는 원격 서버에서 실제 콘텐츠를 로드하여 클라이언트로 전달합니다.
이 절차에서는 웹 서버의 /example
디렉터리로 트래픽을 URL https://example.com
으로 전달하는 방법을 설명합니다.
사전 요구 사항
- NGINX는 NGINX 설치 및 준비에 설명된 대로 설치됩니다.
- 선택 사항: TLS 암호화는 역방향 프록시에서 활성화됩니다.
절차
/etc/nginx/nginx.conf
파일을 편집하고 역방향 프록시를 제공해야 하는server
블록에 다음 설정을 추가합니다.location /example { proxy_pass https://example.com; }
location
블록은 NGINX가/example
디렉터리의 모든 요청을https://example.com
으로 전달하도록 정의합니다.SELinux가 NGINX가 트래픽을 전달할 수 있도록
httpd_can_network_connect
SELinux 부울 매개변수를1
로 설정합니다.# setsebool -P httpd_can_network_connect 1
nginx
서비스를 다시 시작합니다.# systemctl restart nginx
검증
-
브라우저를 사용하여
http://host_name/example
에 연결하면https://example.com
내용이 표시됩니다.
2.5. NGINX를 HTTP 로드 밸런서로 구성
NGINX 역방향 프록시 기능을 사용하여 트래픽을 로드 밸런싱할 수 있습니다. 이 절차에서는 NGINX를 활성 연결 수가 가장 적은 다른 서버에 요청을 보내는 HTTP 로드 밸런서 장치로 구성하는 방법을 설명합니다. 두 서버를 모두 사용할 수 없는 경우 절차에서는 폴백 이유로 세 번째 호스트도 정의합니다.
사전 요구 사항
- NGINX는 NGINX 설치 및 준비에 설명된 대로 설치됩니다.
절차
/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
은 무작위로 선택된 서버로 요청을 보냅니다.
nginx
서비스를 다시 시작합니다.# systemctl restart nginx
2.6. 추가 리소스
- 공식 NGINX 설명서는 https://nginx.org/en/docs/ 에서 참조하십시오. Red Hat은 이 문서를 유지 관리하지 않으며 설치한 NGINX 버전에서 작동하지 않을 수 있습니다.
- PKCS #11을 통해 암호화 하드웨어를 사용하도록 애플리케이션 구성.
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가 설치되어 있어야 합니다.
절차
/etc/samba/smb.conf
파일의 사본을 생성합니다.# cp /etc/samba/smb.conf /etc/samba/samba.conf.copy
- 복사한 파일을 편집하고 필요한 사항을 변경합니다.
/etc/samba/samba.conf.copy
파일에서 구성을 확인합니다.# testparm -s /etc/samba/samba.conf.copy
testparm
이 오류를 보고하면 오류를 수정하고 명령을 다시 실행합니다./etc/samba/smb.conf
파일을 새 구성으로 재정의합니다.# mv /etc/samba/samba.conf.copy /etc/samba/smb.conf
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
파일을 종료합니다.
절차
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 매핑 구성을 보고합니다.
-
testparm
이 구성에 잘못된 매개 변수, 값 또는 기타 오류를 보고하면 문제를 수정하고 유틸리티를 다시 실행합니다.
3.3. 독립 실행형 서버로 Samba 설정
Samba를 도메인의 멤버가 아닌 서버로 설정할 수 있습니다. 이 설치 모드에서 Samba는 중앙 DC가 아니라 로컬 데이터베이스로 사용자를 인증합니다. 또한 게스트 액세스를 활성화하여 사용자가 인증 없이 하나 이상의 서비스에 연결할 수 있습니다.
3.3.1. 독립 실행형 서버에 대한 서버 구성 설정
Samba 독립 실행형 서버에 대한 서버 구성을 설정할 수 있습니다.
절차
samba
패키지를 설치합니다.# yum install samba
/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 이름으로 확장합니다. 이를 통해 각 클라이언트에 대한 개별 로그 파일이 활성화됩니다.선택 사항: 파일 또는 프린터 공유를 구성합니다. 다음 내용을 참조하십시오.
/etc/samba/smb.conf
파일을 확인합니다.# testparm
인증이 필요한 공유를 설정하면 사용자 계정을 생성합니다.
자세한 내용은 로컬 사용자 계정 생성 및 활성화를 참조하십시오.
필요한 포트를 열고
firewall-cmd
유틸리티를 사용하여 방화벽 구성을 다시 로드합니다.# firewall-cmd --permanent --add-service=samba # firewall-cmd --reload
smb
서비스를 활성화하고 시작합니다.# systemctl enable --now smb
추가 리소스
-
시스템의 SMB.conf(5)
도움말 페이지
3.3.2. 로컬 사용자 계정 생성 및 활성화
사용자가 공유에 연결할 때 인증할 수 있도록 하려면 운영 체제와 Samba 데이터베이스에서 Samba 호스트에 계정을 만들어야 합니다. Samba는 파일 시스템 개체 및 Samba 계정에서 연결 사용자를 인증하기 위해 운영 체제 계정이 ACL(액세스 제어 목록)의 유효성을 검사해야 합니다.
passdb backend = tdbsam
기본 설정을 사용하는 경우 Samba는 사용자 계정을 /var/lib/samba/private/passdb.tdb
데이터베이스에 저장합니다.
example
이라는 로컬 Samba 사용자를 만들 수 있습니다.
사전 요구 사항
- Samba는 독립 실행형 서버로 설치 및 구성됩니다.
절차
운영 체제 계정을 생성합니다.
# useradd -M -s /sbin/nologin example
이 명령은 홈 디렉터리를 생성하지 않고
example
계정을 추가합니다. 계정이 Samba로 인증하는 데만 사용되는 경우 계정이 로컬에 로그인하지 못하도록/sbin/nologin
명령을 쉘로 할당합니다.활성화하려면 암호를 운영 체제 계정으로 설정합니다.
# passwd example Enter new UNIX password:
password
Retype new UNIX password:password
passwd: password updated successfullySamba는 운영 체제 계정에 설정된 암호를 사용하여 인증하지 않습니다. 그러나 계정을 활성화하려면 암호를 설정해야 합니다. 계정이 비활성화되어 있으면 Samba는 이 사용자가 연결하면 액세스를 거부합니다.
사용자를 Samba 데이터베이스에 추가하고 암호를 계정으로 설정합니다.
# smbpasswd -a example New SMB password:
password
Retype new SMB password:password
Added user example.이 계정을 사용하여 Samba 공유에 연결할 때 인증하려면 이 암호를 사용합니다.
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 매핑 백엔드를 제공합니다. 가장 자주 사용되는 백엔드는 다음과 같습니다.
백엔드 | 사용 사례 |
---|---|
|
|
| AD 도메인만 해당 |
| AD 및 NT4 도메인 |
|
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 속성 이름 | 오브젝트 유형 | 매핑 대상 |
---|---|---|
| 사용자 및 그룹 | 사용자 또는 그룹 이름 (오브젝트에 따라) |
| 사용자 | 사용자 ID(UID) |
| Group | 그룹 ID(GID) |
| 사용자 | 사용자 쉘의 경로 |
| 사용자 | 사용자의 홈 디렉터리 경로 |
| 사용자 | 기본 그룹 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
파일에 있습니다.
절차
/etc/samba/smb.conf
파일에서[global]
섹션을 편집합니다.없는 경우 기본 도메인 (
*
)의 ID 매핑 구성을 추가합니다. 예를 들면 다음과 같습니다.idmap config * : backend = tdb idmap config * : range = 10000-999999
AD 도메인의
ad
ID 매핑 백엔드를 활성화합니다.idmap config DOMAIN : backend = ad
AD 도메인의 사용자와 그룹에 할당된 ID 범위를 설정합니다. 예를 들면 다음과 같습니다.
idmap config DOMAIN : range = 2000000-2999999
중요범위는 이 서버의 다른 도메인 구성과 겹치지 않아야 합니다. 또한 범위는 나중에 할당되는 모든 ID를 포함할 만큼 충분히 커야 합니다. 자세한 내용은 Planning Samba ID 범위를 참조하십시오.
AD에서 속성을 읽을 때 Samba가 RFC 2307 스키마를 사용하도록 설정합니다.
idmap config DOMAIN : schema_mode = rfc2307
Samba가 해당 AD 속성에서 로그인 쉘 및 사용자 홈 디렉터리 경로를 읽을 수 있도록 하려면 다음을 설정합니다.
idmap config DOMAIN : unix_nss_info = yes
또는 모든 사용자에게 적용되는 균일한 도메인 전체 홈 디렉터리 경로 및 로그인 쉘을 설정할 수 있습니다. 예를 들면 다음과 같습니다.
template shell = /bin/bash template homedir = /home/%U
기본적으로 Samba는 사용자 오브젝트의
primaryGroupID
속성을 Linux의 사용자 기본 그룹으로 사용합니다. 또는 대신gidNumber
특성에 설정된 값을 사용하도록 Samba를 구성할 수 있습니다.idmap config DOMAIN : unix_primary_group = yes
/etc/samba/smb.conf
파일을 확인합니다.# testparm
Samba 구성을 다시 로드합니다.
# smbcontrol all reload-config
추가 리소스
- * 기본 도메인
-
시스템의 SMB.conf(5)
및idmap_ad(8)
도움말 페이지 -
시스템의
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를 가진 사용자 또는 그룹을 매핑하지 않습니다.
읽기 전용 백엔드인 rid
는 BUILTIN
그룹과 같은 새 ID를 할당할 수 없습니다. 따라서 *
기본 도메인에 이 백엔드를 사용하지 마십시오.
rid 백엔드 사용의 이점
- 구성된 범위 내에 RID가 있는 모든 도메인 사용자 및 그룹은 도메인 멤버에서 자동으로 사용할 수 있습니다.
- ID, 홈 디렉터리 및 로그인 쉘을 수동으로 할당할 필요가 없습니다.
rid 백엔드 사용의 단점
- 모든 도메인 사용자는 동일한 로그인 쉘 및 홈 디렉터리가 할당됩니다. 그러나 변수를 사용할 수 있습니다.
-
사용자 및 그룹 ID는 모두 동일한 ID 범위 설정으로
rid
백엔드를 사용하는 경우 Samba 도메인 멤버에서만 동일합니다. - 도메인 구성원에서 개별 사용자 또는 그룹을 사용할 수 없는 경우 제외할 수 없습니다. 구성된 범위를 벗어난 사용자 및 그룹만 제외됩니다.
-
winbindd
서비스에서 ID를 계산하는 데 사용하는 공식에 따라 다른 도메인의 오브젝트에 동일한 RID가 있는 경우 다중 도메인 환경에서 중복 ID가 발생할 수 있습니다.
사전 요구 사항
- Samba가 설치되어 있어야 합니다.
-
ID 매핑을 제외한 Samba 구성이
/etc/samba/smb.conf
파일에 있습니다.
절차
/etc/samba/smb.conf
파일에서[global]
섹션을 편집합니다.없는 경우 기본 도메인 (
*
)의 ID 매핑 구성을 추가합니다. 예를 들면 다음과 같습니다.idmap config * : backend = tdb idmap config * : range = 10000-999999
도메인에 대해
rid
ID 매핑 백엔드를 활성화합니다.idmap config DOMAIN : backend = rid
향후 할당될 모든 RID를 포함할 만큼 큰 범위를 설정합니다. 예를 들면 다음과 같습니다.
idmap config DOMAIN : range = 2000000-2999999
Samba는 이 도메인의 RID가 범위에 속하지 않는 사용자와 그룹을 무시합니다.
중요범위는 이 서버의 다른 도메인 구성과 겹치지 않아야 합니다. 또한 범위는 나중에 할당되는 모든 ID를 포함할 만큼 충분히 커야 합니다. 자세한 내용은 Planning Samba ID 범위를 참조하십시오.
매핑된 모든 사용자에게 할당될 쉘 및 홈 디렉터리 경로를 설정합니다. 예를 들면 다음과 같습니다.
template shell = /bin/bash template homedir = /home/%U
/etc/samba/smb.conf
파일을 확인합니다.# testparm
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
파일에 있습니다.
절차
/etc/samba/smb.conf
파일에서[global]
섹션을 편집합니다.*
기본 도메인의autorid
ID 매핑 백엔드를 활성화합니다.idmap config * : backend = autorid
모든 기존 및 향후 객체에 ID를 할당할 수 있을 만큼 큰 범위를 설정합니다. 예를 들면 다음과 같습니다.
idmap config * : range = 10000-999999
Samba는 이 도메인에서 계산된 ID가 범위에 속하지 않는 사용자와 그룹을 무시합니다.
주의범위를 설정하고 Samba가 사용을 시작한 후 범위의 상한값만 늘릴 수 있습니다. 범위에 대한 다른 모든 변경으로 인해 새 ID 할당이 발생할 수 있으므로 파일 소유권이 손실될 수 있습니다.
선택 사항: 범위 크기를 설정합니다. 예를 들면 다음과 같습니다.
idmap config * : rangesize = 200000
Samba는
idmap 구성 * : range
매개변수에 설정된 범위의 모든 ID를 가져올 때까지 각 도메인의 개체에 대해 이 개수의 연속 ID를 할당합니다.참고범위 크기를 설정하는 경우 그에 따라 범위를 조정해야 합니다. 범위는 rangesize의 여러 개여야 합니다.
매핑된 모든 사용자에게 할당될 쉘 및 홈 디렉터리 경로를 설정합니다. 예를 들면 다음과 같습니다.
template shell = /bin/bash template homedir = /home/%U
선택 사항: 도메인에 대한 ID 매핑 구성을 추가합니다. 개별 도메인에 대한 구성이 없는 경우 Samba는 이전에 구성된
*
기본 도메인에서자동
만료 백엔드 설정을 사용하여 ID를 계산합니다.중요범위는 이 서버의 다른 도메인 구성과 겹치지 않아야 합니다. 또한 범위는 나중에 할당되는 모든 ID를 포함할 만큼 충분히 커야 합니다. 자세한 내용은 Planning Samba ID 범위를 참조하십시오.
/etc/samba/smb.conf
파일을 확인합니다.# testparm
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 도메인에 연결할 수 있습니다.
사전 요구 사항
- 호스트는 AD 도메인을 확인할 수 있는 DNS 서버를 사용합니다.
- 호스트의 시간이 AD의 시간과 동기화되고 시간대 설정이 올바르게 됩니다.
절차
AD에 Kerberos 인증을 위한 더 이상 사용되지 않는 RC4 암호화 유형이 필요한 경우 RHEL에서 이러한 암호에 대한 지원을 활성화합니다.
# update-crypto-policies --set DEFAULT:AD-SUPPORT
다음 패키지를 설치합니다.
# yum install realmd oddjob-mkhomedir oddjob samba-winbind-clients \ samba-winbind samba-common-tools samba-winbind-krb5-locator krb5-workstation
도메인 구성원에서 디렉터리 또는 프린터를 공유하려면
samba
패키지를 설치합니다.# yum install samba
기존
/etc/samba/smb.conf
Samba 구성 파일을 백업합니다.# mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
도메인에 가입합니다. 예를 들어
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
서비스를 시작하고 시스템이 부팅될 때 서비스가 시작됩니다.
-
선택 사항:
/etc/samba/smb.conf
파일에서 대체 ID 매핑 백엔드 또는 사용자 지정 ID 매핑 설정을 설정합니다.자세한 내용은 Samba ID 매핑 이해 및 구성을 참조하십시오.
winbind
서비스가 실행 중인지 확인합니다.# systemctl status winbind ... Active: active (running) since Tue 2018-11-06 19:10:40 CET; 15s ago
중요Samba를 활성화하여 도메인 사용자 및 그룹 정보를 쿼리하려면
smb
를 시작하기 전에winbind
서비스를 실행해야 합니다.디렉터리 및 프린터를 공유하는
samba
패키지를 설치한 경우smb
서비스를 활성화하고 시작합니다.# systemctl enable --now smb
-
Active Directory에 대한 로컬 로그인을 인증하는 경우
winbind_krb5_localauth
플러그인을 활성화합니다. MIT Kerberos용 로컬 인증 플러그인 사용을 참조하십시오.
검증
AD 도메인의 AD 관리자 계정과 같은 AD 사용자의 세부 정보를 표시합니다.
# getent passwd "AD\administrator" AD\administrator:*:10000:10000::/home/administrator@AD:/bin/bash
AD 도메인에서 도메인 사용자 그룹의 멤버를 쿼리합니다.
# getent group "AD\Domain Users" AD\domain users:x:10000:user1,user2
선택 사항: 파일 및 디렉터리에 대한 권한을 설정할 때 도메인 사용자 및 그룹을 사용할 수 있는지 확인합니다. 예를 들어
/srv/samba/example.txt
파일의 소유자를AD\administrator
로 설정하고 그룹을AD\Domain Users
로 설정하려면 다음을 수행합니다.# chown "AD\administrator":"AD\Domain Users" /srv/samba/example.txt
Kerberos 인증이 예상대로 작동하는지 확인합니다.
AD 도메인 멤버에서
administrator@AD.EXAMPLE.COM
주체에 대한 티켓을 받습니다.# kinit administrator@AD.EXAMPLE.COM
캐시된 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
사용 가능한 도메인을 표시합니다.
# wbinfo --all-domains BUILTIN SAMBA-SERVER AD
추가 리소스
- 더 이상 사용되지 않는 RC4 암호를 사용하지 않으려면 AD에서 AES 암호화 유형을 활성화할 수 있습니다. 참조
- GPO를 사용하여 Active Directory의 AES 암호화 유형 활성화
-
시스템의
realm(8)
도움말 페이지
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)
도움말 페이지
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 서비스를 다시 시작할 수 있는 root 권한이 있습니다.
절차
필수 패키지를 설치합니다.
[root@ipaserver ~]# yum install ipa-server-trust-ad samba-client
IdM 관리자로 인증합니다.
[root@ipaserver ~]# kinit admin
ipa-adtrust-install
유틸리티를 실행합니다.[root@ipaserver ~]# ipa-adtrust-install
IdM이 통합된 DNS 서버와 함께 설치된 경우 DNS 서비스 레코드가 자동으로 생성됩니다.
통합된 DNS 서버 없이 IdM을 설치한 경우,
ipa-adtrust-install
은 DNS에 수동으로 추가해야 하는 서비스 레코드 목록을 인쇄합니다.스크립트에서
/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
스크립트에서 이전 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
메시지가 표시되면 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]:
SID 생성 작업을 실행하여 기존 사용자의 SID를 생성하라는 메시지가 표시됩니다.
Do you want to run the ipa-sidgen task? [no]:
yes
이는 리소스 집약적인 작업이므로 사용자가 많은 경우 한 번에 이 작업을 실행할 수 있습니다.
선택 사항: 기본적으로 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
ipa
서비스를 다시 시작하십시오.[root@ipaserver ~]# ipactl restart
smbclient
유틸리티를 사용하여 Samba가 IdM 측에서 Kerberos 인증에 응답하는지 확인합니다.[root@ipaserver ~]#
smbclient -L ipaserver.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를 설치하고 구성할 수 있습니다.
사전 요구 사항
- IdM 서버와 클라이언트는 모두 RHEL 8.1 이상에서 실행해야 합니다.
- IdM 도메인은 도메인 멤버에 Samba를 설치하기 위해 IdM 도메인 준비에 설명되어 있습니다.
- IdM에 AD로 신뢰가 구성된 경우 Kerberos에 대해 AES 암호화 유형을 활성화합니다. 예를 들어 GPO(그룹 정책 오브젝트)를 사용하여 AES 암호화 유형을 활성화합니다. 자세한 내용은 GPO를 사용하여 Active Directory에서 AES 암호화 활성화를 참조하십시오.
절차
ipa-client-samba
패키지를 설치합니다.[root@idm_client]# yum install ipa-client-samba
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
기본적으로
ipa-client-samba
는 사용자가 연결할 때 사용자의 홈 디렉토리를 동적으로 공유하는/etc/samba/smb.conf
파일에[homes]
섹션을 자동으로 추가합니다. 이 서버에 홈 디렉터리가 없거나 공유하려는 경우/etc/samba/smb.conf
에서 다음 행을 제거하십시오.[homes] read only = no
디렉토리와 프린터를 공유합니다. 자세한 내용은 다음을 참조하십시오.
로컬 방화벽에서 Samba 클라이언트에 필요한 포트를 엽니다.
[root@idm_client]# firewall-cmd --permanent --add-service=samba-client [root@idm_client]# firewall-cmd --reload
smb
및winbind
서비스를 활성화하고 시작합니다.[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)
도움말 페이지
3.6.3. IdM이 새 도메인을 신뢰하는 경우 ID 매핑 구성 수동 추가
Samba에는 사용자가 리소스에 액세스하는 각 도메인에 대한 ID 매핑 구성이 필요합니다. IdM 클라이언트에서 실행 중인 기존 Samba 서버에서 관리자가 Active Directory(AD) 도메인에 새 신뢰를 추가한 후 ID 매핑 구성을 수동으로 추가해야 합니다.
사전 요구 사항
- IdM 클라이언트에 Samba가 구성되어 있습니다. 이후에 새로운 신뢰가 IdM에 추가되었습니다.
- Kerberos에 대한 DES 및 RC4 암호화 유형은 신뢰할 수 있는 AD 도메인에서 비활성화해야 합니다. 보안상의 이유로 RHEL 8은 이러한 약한 암호화 유형을 지원하지 않습니다.
절차
호스트의 keytab을 사용하여 인증합니다.
[root@idm_client]# kinit -k
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 ----------------------------
다음 단계에서
ipabaseid
및ipaidrangesize
속성의 값이 필요합니다.사용 가능한 가장 높은 ID를 계산하려면 다음 공식을 사용합니다.
maximum_range = ipabaseid + ipaidrangesize - 1
이전 단계의 값을 사용하여
ad.example.com
도메인에 사용 가능한 가장 높은 ID는1918599999
(1918400000 + 200000 - 1)입니다./etc/samba/smb.conf
파일을 편집하고 도메인의 ID 매핑 구성을[global]
섹션에 추가합니다.idmap config AD : range = 1918400000 - 1918599999 idmap config AD : backend = sss
ipabaseid
특성의 값을 가장 낮은 값으로 지정하고 이전 단계의 계산된 값을 가장 높은 범위 값으로 지정합니다.smb
및winbind
서비스를 다시 시작합니다.[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.13. macOS 클라이언트에 대해 Samba 구성
가상 파일
시스템(VFS) Samba 모듈은 Apple 서버 메시지 블록(SMB) 클라이언트와의 향상된 호환성을 제공합니다.
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)에 제공된 문서를 참조하십시오.
절차
/etc/samba/smb.conf
파일을 편집합니다.[ECDHEs]
섹션을 추가하여 Samba에서 출력 백엔드를 활성화합니다.[printers] comment = All Printers path = /var/tmp/ printable = yes create mask = 0600
중요[printers]
공유 이름은 하드 코딩되며 변경할 수 없습니다.CUPS 서버가 다른 호스트 또는 포트에서 실행되는 경우
[ECDHEs]
섹션에 설정을 지정합니다.cups server = printserver.example.com:631
프린터가 많은 경우 유휴 상태의 수를 CUPS에 연결된 프린터 수보다 높은 값으로 설정합니다. 예를 들어 프린터가 100개 있는 경우
[global]
섹션에서 설정합니다.rpcd_spoolss:idle_seconds = 200
이 설정이 환경에서 확장되지 않는 경우
[global]
섹션의 CloudEventd_spoolss
작업자 수도 늘립니다.rpcd_spoolss:num_workers = 10
기본적으로 CloudEvent
d_spoolss는
작업자 5개를 시작합니다.
/etc/samba/smb.conf
파일을 확인합니다.# testparm
필요한 포트를 열고
firewall-cmd
유틸리티를 사용하여 방화벽 구성을 다시 로드합니다.# firewall-cmd --permanent --add-service=samba # firewall-cmd --reload
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가 인쇄 서버로 설정됨
절차
/etc/samba/smb.conf
파일을 편집합니다.[global]
섹션에서 설정을 설정하여 자동 프린터 공유를 비활성화합니다.load printers = no
공유할 각 프린터에 대해 섹션을 추가합니다. 예를 들어 Samba
에서 CUPS 백엔드의
printer로 공유하려면 다음 섹션을 추가합니다.example
라는 프린터를 Example-[Example-Printer] path = /var/tmp/ printable = yes printer name = example
각 프린터에 대해 개별 스풀 디렉토리가 필요하지 않습니다.
[printers]
섹션에 설정한 것과 동일한 스풀 디렉토리를 프린터매개변수에
설정할 수 있습니다.
/etc/samba/smb.conf
파일을 확인합니다.# testparm
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 호스트에서 로컬로 드라이버를 설치하는 설정 애플리케이션을 시작해야 합니다. 특정 상황에서 설치 프로그램은 설치를 실행하는 동안 개별 파일을 운영 체제의 임시 폴더로 추출합니다. 드라이버 파일을 업로드에 사용하려면 다음을 수행합니다.
- 설치 프로그램을 시작합니다.
- 임시 폴더에서 새 위치로 파일을 복사합니다.
- 설치를 취소합니다.
프린터 제조업체에 인쇄 서버 업로드를 지원하는 드라이버를 요청합니다.
클라이언트에 프린터를 위한 32비트 및 64비트 드라이버 제공
32비트 및 64비트 Windows 클라이언트 모두에 대해 프린터용 드라이버를 제공하려면 두 아키텍처에서 정확히 동일한 이름으로 드라이버를 업로드해야 합니다. 예를 들어 Example PostScript라는 32비트 드라이버와
라는 64비트 드라이버를 업로드하는 경우 이름이 일치하지 않습니다. 따라서 프린터에 드라이버 중 하나만 할당할 수 있으며 두 아키텍처에서는 드라이버를 모두 사용할 수 없습니다.
Example PostScript
(v1.0)
3.16.2. 사용자가 드라이버를 업로드하고 사전 구성 가능
프린터 드라이버를 업로드하고 사전 구성할 수 있으려면 사용자 또는 그룹에 SeprintOperatorPrivilege
권한이 부여되어야 합니다. 사용자를 printadmin
그룹에 추가해야 합니다. Red Hat Enterprise Linux는 samba
패키지를 설치할 때 이 그룹을 자동으로 생성합니다. printadmin
그룹에는 1000 미만의 사용 가능한 가장 낮은 동적 시스템 GID가 할당됩니다.
절차
예를 들어,
printadmin 그룹에
권한을 부여하려면 다음을 수행합니다.Se print
OperatorPrivilege# net rpc rights grant "printadmin" SePrintOperatorPrivilege -U "DOMAIN\administrator" Enter DOMAIN\administrator's password: Successfully granted rights.
참고도메인 환경에서 도메인 그룹에
Se printOperatorPrivilege
을 부여합니다. 이를 통해 사용자의 그룹 멤버십을 업데이트하여 권한을 중앙에서 관리할 수 있습니다.SePrintOperatorPrivilege
이 부여된 모든 사용자 및 그룹을 나열하려면 다음을 수행하십시오.# net rpc rights list privileges SePrintOperatorPrivilege -U "DOMAIN\administrator" Enter administrator's password: SePrintOperatorPrivilege: BUILTIN\Administrators DOMAIN\printadmin
3.16.4. 클라이언트가 Samba 출력 서버를 신뢰할 수 있도록 GPO 만들기
보안상의 이유로 최신 Windows 운영 체제는 클라이언트가 신뢰할 수 없는 서버에서 패키지 인식 프린터 드라이버를 다운로드하지 못하도록 합니다. 인쇄 서버가 AD의 멤버인 경우 도메인에 그룹 정책 오브젝트(GPO)를 만들어 Samba 서버를 신뢰할 수 있습니다.
사전 요구 사항
- Samba 인쇄 서버는 AD 도메인의 멤버입니다.
- GPO를 생성하는 데 사용하는 Windows 컴퓨터에는 Windows RSAT(원격 서버 관리 도구)가 설치되어 있어야 합니다. 자세한 내용은 Windows 설명서를 참조하십시오.
절차
-
AD 도메인
Administrator
사용자와 같은 그룹 정책을 편집할 수 있는 계정을 사용하여 Windows 컴퓨터에 로그인합니다. -
Group Policy Management Console
을 엽니다. AD 도메인을 마우스 오른쪽 버튼으로 클릭하고
Create a GPO in this domain(이 도메인에서 GPO 만들기)을 선택하고 여기에 연결합니다
.-
Legacy Printer Driver Policy
와 같은 GPO 이름을 입력하고OK(확인
)를 클릭합니다. 새 GPO가 도메인 항목에 표시됩니다. -
새로 만든 GPO를 마우스 오른쪽 버튼으로 클릭하고
Edit(편집
)를 선택하여그룹 정책 관리 편집기
를 엽니다. 창 오른쪽에서
Point and Print Restriction
을 두 번 클릭하여 정책을 편집합니다.정책을 활성화하고 다음 옵션을 설정합니다.
-
Users(사용자)는 이러한 서버를 가리키고 출력할 수 있으며 Samba 인쇄
서버의 FQDN(정규화된 도메인 이름)을 이 옵션 옆에 있는 필드에 입력합니다. Security Prompts
(보안 프롬프트) 아래에 있는 두 확인란 모두에서Do not show warning or elevation prompt(경고 또는 승격 프롬프트
표시 안 함)를 선택합니다.
-
- OK(확인)를 클릭합니다.
Package Point and Print - Approved servers
를 두 번 클릭하여 정책을 편집합니다.-
정책을 활성화하고
Show
(표시) 버튼을 클릭합니다. Samba 출력 서버의 FQDN을 입력합니다.
-
OK
(확인)를 클릭하여Show Contents
(콘텐츠 표시) 및 정책의 속성 창을 둘 다 닫습니다.
-
정책을 활성화하고
-
그룹 정책 관리 편집기
를 닫습니다. -
그룹 정책 관리 콘솔
을 닫습니다.
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) 또는 Red Hat Enterprise Linux IdM(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 모드에서 지원되는 모드에서 실행됩니다.
절차
RHEL에서 FIPS 모드를 활성화합니다.
# fips-mode-setup --enable
서버를 재부팅합니다.
# reboot
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
매개 변수에서 기본값을 사용하는 방법을 설명합니다.
절차
-
/etc/samba/smb.conf
파일의[global]
섹션에서server max protocol
매개 변수를 제거합니다. Samba 구성 다시 로드
# smbcontrol all reload-config
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가 설치 및 구성되어 있습니다.
절차
/etc/samba/smb.conf
파일을 편집하고server min protocol
매개 변수를 추가하고, 매개 변수를 서버가 지원해야 하는 최소 SMB 프로토콜 버전으로 설정합니다. 예를 들어 최소 SMB 프로토콜 버전을SMB3
로 설정하려면 다음을 추가합니다.server min protocol = SMB3
smb
서비스를 다시 시작하십시오.# systemctl restart smb
추가 리소스
-
시스템의 SMB.conf(5)
도움말 페이지
3.20. 자주 사용되는 Samba 명령줄 유틸리티
이 장에서는 Samba 서버를 사용할 때 자주 사용되는 명령에 대해 설명합니다.
3.20.1. 순 광고 조인 및 net rpc 조인 명령 사용
net
유틸리티의 조인
하위 명령을 사용하여 Samba를 AD 또는 NT4 도메인에 연결할 수 있습니다. 도메인에 가입하려면 /etc/samba/smb.conf
파일을 수동으로 생성하고 PAM과 같은 추가 구성을 선택적으로 업데이트해야 합니다.
도메인 가입을 위해 realm
유틸리티를 사용하는 것이 좋습니다. realm
유틸리티는 관련된 모든 구성 파일을 자동으로 업데이트합니다.
절차
다음 설정으로
/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
-
*
기본 도메인과/etc/samba/smb.conf
파일의[global
] 섹션에 참여할 도메인에 대한 ID 매핑 구성을 추가합니다. /etc/samba/smb.conf
파일을 확인합니다.# testparm
도메인에 도메인 관리자로 가입합니다.
AD 도메인에 가입하려면 다음을 수행합니다.
# net ads join -U "DOMAIN\administrator"
NT4 도메인에 가입하려면 다음을 수행합니다.
# net rpc join -U "DOMAIN\administrator"
winbind 소스를
/etc/nsswitch.conf 파일의
passwd
및그룹
database 항목에 추가합니다.passwd: files
winbind
group: fileswinbind
winbind
서비스를 활성화하고 시작합니다.# systemctl enable --now winbind
선택 사항:
authselect
유틸리티를 사용하여 PAM을 구성합니다.자세한 내용은 시스템의
authselect(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.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
계정을 도메인에 추가합니다.
계정을 추가합니다.
# net user add user password -U "DOMAIN\administrator" User user added
선택 사항: 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에 대해 명령을 실행하면 도메인 사용자가 나열됩니다.
추가 리소스
-
시스템의
rpcclient(1)
도움말 페이지
3.20.6. samba-regedit 애플리케이션 사용
프린터 구성과 같은 특정 설정은 Samba 서버의 레지스트리에 저장됩니다. ncurses 기반 samba-regedit
애플리케이션을 사용하여 Samba 서버의 레지스트리를 편집할 수 있습니다.
사전 요구 사항
-
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
패키지가 설치되어 있습니다.
절차
명령을 사용자로 실행하는 경우
smbpasswd
는 명령을 실행하는 사용자의 Samba 암호를 변경합니다. 예를 들면 다음과 같습니다.[user@server ~]$ smbpasswd New SMB password: password Retype new SMB password: password
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.
추가 리소스
-
시스템의
smbpasswd(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
추가 리소스
-
시스템의
smbtar(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. 추가 리소스
-
시스템의 SMB.conf(5)
도움말 페이지 -
/usr/share/docs/ECDHE-version/
디렉터리에는 Samba 프로젝트에서 제공하는 일반 문서, 예제 스크립트 및 LDAP 스키마 파일이 포함되어 있습니다. - GlusterFS 볼륨에 저장된 디렉터리를 공유하도록 Samba 및 Clustered Trivial Database(CDTB) 설정
- Red Hat Enterprise Linux에서 Mellanox share 마운트
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 주소는 고정입니다.
절차
bind
및bind-utils
패키지를 설치합니다.# yum install bind bind-utils
이 패키지는 BIND 9.11을 제공합니다. BIND 9.16이 필요한 경우
bind9.16
및bind9.16-utils
패키지를 설치합니다.change-root 환경에서 BIND를 실행하려면
bind-chroot
패키지를 설치합니다.# yum install bind-chroot
SELinux가
강제
모드로 호스트에서 BIND를 실행하는 것은 기본적으로 더 안전합니다./etc/named.conf
파일을 편집하고options
문에서 다음과 같이 변경합니다.listen-on
및listen-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; };
allow-query
문을 업데이트하여 이 DNS 서버를 쿼리할 수 있는 IP 주소 및 범위 클라이언트를 구성합니다.allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
allow-recursion
문을 추가하여 어떤 IP 주소 및 범위 BIND에서 재귀 쿼리를 허용하는지 정의합니다.allow-recursion { localhost; 192.0.2.0/24; 2001:db8:1::/64; };
주의서버의 공용 IP 주소에서 재귀를 허용하지 마십시오. 그렇지 않으면 서버가 대규모 DNS 확장 공격의 일부가 될 수 있습니다.
기본적으로 BIND는 루트 서버에서 권한 있는 DNS 서버로 반복적으로 쿼리하여 쿼리를 해결합니다. 또는 공급자와 같은 다른 DNS 서버로 쿼리를 전달하도록 BIND를 구성할 수도 있습니다. 이 경우 BIND에서 쿼리를 전달해야 하는 DNS 서버의 IP 주소 목록을 사용하여
forwarders
문을 추가합니다.forwarders { 198.51.100.1; 203.0.113.5; };
폴백 동작으로 BIND는 전달자 서버가 응답하지 않는 경우 쿼리를 재귀적으로 해결합니다. 이 동작을 비활성화하려면
forward only;
문을 추가합니다.
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.
들어오는 DNS 트래픽을 허용하도록
firewalld
규칙을 업데이트합니다.# firewall-cmd --permanent --add-service=dns # firewall-cmd --reload
BIND를 시작하고 활성화합니다.
# systemctl enable --now named
change-root 환경에서 BIND를 실행하려면
systemctl enable --now named-chroot
명령을 사용하여 서비스를 활성화 및 시작합니다.
검증
새로 설정된 DNS 서버를 사용하여 도메인을 확인합니다.
# dig @localhost www.example.org ... www.example.org. 86400 IN A 198.51.100.34 ;; Query time: 917 msec ...
이 예에서는 BIND가 동일한 호스트에서 실행되고
localhost
인터페이스의 쿼리에 응답하는 것으로 가정합니다.처음으로 레코드를 쿼리한 후 BIND는 해당 캐시에 항목을 추가합니다.
이전 쿼리를 반복합니다.
# dig @localhost www.example.org ... www.example.org. 85332 IN A 198.51.100.34 ;; Query time: 1 msec ...
캐시된 항목으로 인해 항목이 만료될 때까지 동일한 레코드에 대한 추가 요청이 훨씬 더 빨라집니다.
다음 단계
- 이 DNS 서버를 사용하도록 네트워크의 클라이언트를 구성합니다. DHCP 서버가 클라이언트에 DNS 서버 설정을 제공하는 경우 그에 따라 DHCP 서버의 구성을 업데이트합니다.
추가 리소스
- SELinux로 BIND를 보호하거나 변경 루트 환경에서 실행하는 방법에 대한 고려 사항
-
시스템의
named.conf(5)
도움말 페이지 -
/usr/share/doc/bind/sample/etc/named.conf
- BIND 관리자 참조 설명서
4.4. BIND DNS 서버에서 로깅 구성
bind
패키지에서 제공하는 기본 /etc/named.conf
파일의 구성은 default_debug
채널을 사용하고 메시지를 /var/named/data/named.run
파일에 기록합니다. default_debug
채널은 서버의 디버그 수준이 0이 아닌 경우에만 항목을 기록합니다.
서로 다른 채널 및 카테고리를 사용하여 파일을 분리하기 위해 정의된 심각도가 있는 다양한 이벤트를 작성하도록 BIND를 구성할 수 있습니다.
사전 요구 사항
- 예를 들어 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
-
named
또는named-chroot
서비스가 실행 중입니다.
절차
/etc/named.conf
파일을 편집하고 다음과 같이category
및channel
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가 채널에 기록해야 하는 등 로그 메시지의 대상을 정의합니다. 이벤트의 타임 스탬프, 카테고리 및 심각도 로깅 활성화와 같은 추가 설정은 선택 사항이지만 디버깅 목적에 유용합니다.로그 디렉터리가 없는 경우 생성하고 이 디렉터리의
named
사용자에게 쓰기 권한을 부여합니다.# mkdir /var/named/log/ # chown named:named /var/named/log/ # chmod 700 /var/named/log/
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.
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
추가 리소스
-
시스템의
named.conf(5)
도움말 페이지 - BIND 관리자 참조 설명서
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
서비스가 실행 중입니다.
절차
/etc/named.conf
파일을 편집하고 다음과 같이 변경합니다.파일에
acl
문을 추가합니다. 예를 들어127.0.0.1
,192.0.2.0/24
및2001: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; };
ACL의 닉네임을 지원하는 설명에 사용합니다. 예를 들면 다음과 같습니다.
allow-query { internal-networks; dmz-networks; }; allow-recursion { internal-networks; };
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.
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 시간을 의미합니다.
4.6.2. BIND 기본 서버에서 전달 영역 설정
전달 영역은 이름을 IP 주소 및 기타 정보에 매핑합니다. 예를 들어 도메인 example.com
을 담당하는 경우 www.example.com
과 같은 이름을 확인하도록 BIND에 전달 영역을 설정할 수 있습니다.
사전 요구 사항
- 예를 들어 BIND는 캐싱 이름 서버로 이미 구성되어 있습니다.
-
named
또는named-chroot
서비스가 실행 중입니다.
절차
/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 주소에 대해서만 영역 전송을 허용합니다.
-
이 서버는
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.
다음 콘텐츠를 사용하여
/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.com
을example.com
도메인의 메일 교환기(MX
)로 설정합니다. 호스트 이름 앞에 있는 숫자 값은 레코드의 우선 순위입니다. 값이 낮은 항목은 우선 순위가 높습니다. -
www.example.com
,mail.example.com
및ns1.example.com
의 IPv4 및 IPv6 주소를 설정합니다.
-
리소스 레코드에 대한 기본 TTL(Time-to-live) 값을 8시간으로 설정합니다. 시간 접미사(예:
named
그룹만 읽을 수 있는 영역 파일에 대한 보안 권한을 설정합니다.# chown root:named /var/named/example.com.zone # chmod 640 /var/named/example.com.zone
/var/named/example.com.zone
파일의 구문을 확인합니다.# named-checkzone example.com /var/named/example.com.zone zone example.com/IN: loaded serial 2022070601 OK
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
서비스가 실행 중입니다.
절차
/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 주소에 대해서만 영역 전송을 허용합니다.
-
이 서버는
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.
/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.1
및192.0.2.30
주소에 대한 포인터(PTR
) 레코드를 설정합니다.
-
리소스 레코드에 대한 기본 TTL(Time-to-live) 값을 8시간으로 설정합니다. 시간 접미사(예:
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
/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
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
서비스가 실행 중입니다.
절차
선택 사항:
/etc/named.conf
파일에서 영역 파일의 경로를 식별합니다.options { ... directory "/var/named"; } zone "example.com" { ... file "example.com.zone"; };
영역 정의의
file
문에서 영역 파일의 경로를 찾습니다. 상대 경로는options
문의 디렉터리에 설정된디렉터리를
기준으로 합니다.영역 파일을 편집합니다.
- 필요한 변경 작업을 수행합니다.
SOA(시작 권한) 레코드의 일련번호를 늘립니다.
중요일련 번호가 이전 값과 같거나 낮으면 보조 서버에서 영역의 복사본을 업데이트하지 않습니다.
영역 파일의 구문을 확인합니다.
# named-checkzone example.com /var/named/example.com.zone zone example.com/IN: loaded serial 2022062802 OK
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 유효성 검사를 위해서는 정확한 시스템 시간이 중요합니다.
절차
/etc/named.conf
파일을 편집하고dnssec-policy 기본값
을 DNSSEC를 활성화하려는 영역에 추가합니다.zone "example.com" { ... dnssec-policy default; };
BIND를 다시 로드합니다.
# systemctl reload named
change-root 환경에서 BIND를 실행하는 경우
systemctl reload named-chroot
명령을 사용하여 서비스를 다시 로드합니다.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==
- 영역의 공개 키를 상위 영역에 추가하도록 요청합니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 도메인 공급자 또는 레지스트리에 문의하십시오.
검증
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
인터페이스의 쿼리에 응답하는 것으로 가정합니다.공개 키가 상위 영역에 추가되고 다른 서버로 전파된 후 서버에서 서명된 영역에 쿼리에 인증된 데이터(
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
서비스가 실행 중입니다.
절차
기존 기본 서버에서 다음을 수행합니다.
공유 키를 생성하고 이를
/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
에 자동으로 추가합니다.나중에 보조 서버에서도 명령 출력이 필요합니다.
/etc/named.conf
파일에서 영역 정의를 편집합니다.allow-transfer
문에서 서버가 영역을 전송하기 위해example-transfer-key
문에 지정된 키를 제공해야 함을 정의합니다.zone "example.com" { ... allow-transfer { key example-transfer-key; }; };
또는
allow-transfer
문에서 BIND ACL(access control list) 별 이름을 사용합니다.기본적으로 영역을 업데이트한 후 BIND는 이 영역에 이름 서버(
NS
) 레코드가 있는 모든 이름 서버에 알립니다. 보조 서버의NS
레코드를 영역에 추가하지 않으려면 BIND에 이 서버에 알릴 수 있습니다. 이를 위해 이 보조 서버의 IP 주소를 사용하여also-notify
문을 영역에 추가합니다.zone "example.com" { ... also-notify { 192.0.2.2; 2001:db8:1::2; }; };
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.
BIND를 다시 로드합니다.
# systemctl reload named
change-root 환경에서 BIND를 실행하는 경우
systemctl reload named-chroot
명령을 사용하여 서비스를 다시 로드합니다.
향후 보조 서버에서 다음을 수행합니다.
/etc/named.conf
파일을 다음과 같이 편집합니다.기본 서버에서와 동일한 키 정의를 추가합니다.
key "example-transfer-key" { algorithm hmac-sha256; secret "q7ANbnyliDMuvWgnKOxMLi313JGcTZB5ydMW5CyUGXQ="; };
/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.1
및2001:db8:1::2
입니다. 또는 ACL 닉네임을 지정할 수 있습니다. 이 보조 서버는example-transfer-key
라는 키를 사용하여 기본 서버에 인증합니다.
-
이 서버는
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
BIND를 다시 로드합니다.
# systemctl reload named
change-root 환경에서 BIND를 실행하는 경우
systemctl reload named-chroot
명령을 사용하여 서비스를 다시 로드합니다.
-
선택 사항: 기본 서버에서 영역 파일을 수정하고 새 보조 서버의
NS
레코드를 추가합니다.
검증
보조 서버에서 다음을 수행합니다.
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
명령을 사용하여 저널 항목을 표시합니다.BIND에서 영역 파일을 생성했는지 확인합니다.
# ls -l /var/named/slaves/ total 4 -rw-r--r--. 1 named named 2736 Jul 6 15:08 example.com.zone
기본적으로 보조 서버는 영역 파일을 바이너리 원시 형식으로 저장합니다.
보조 서버에서 전송된 영역의 레코드를 쿼리합니다.
# 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
서비스가 실행 중입니다.
절차
/etc/named.conf
파일을 편집하고 다음과 같이 변경합니다.options
설명에response-policy
정의를 추가합니다.options { ... response-policy { zone "rpz.local"; }; ... }
response-policy
의zone
문에서 RPZ의 사용자 지정 이름을 설정할 수 있습니다. 그러나 다음 단계의 영역 정의에서 동일한 이름을 사용해야 합니다.이전 단계에서 설정한 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 주소에 대해서만 영역 전송을 허용합니다.
-
이 서버는
/etc/named.conf
파일의 구문을 확인합니다.# named-checkconf
명령이 출력을 표시하지 않으면 구문이 올바르게 표시됩니다.
다음 콘텐츠를 사용하여
/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).
-
리소스 레코드의 기본 TTL(Time-to-live) 값을 10분으로 설정합니다. 시간 접미사(예:
/var/named/rpz.local
파일의 구문을 확인합니다.# named-checkzone rpz.local /var/named/rpz.local zone rpz.local/IN: loaded serial 2022070601 OK
BIND를 다시 로드합니다.
# systemctl reload named
change-root 환경에서 BIND를 실행하는 경우
systemctl reload named-chroot
명령을 사용하여 서비스를 다시 로드합니다.
검증
RPZ에 구성된
example.org
의 호스트를 확인하고NXDOMAIN
오류를 반환합니다.# dig @localhost www.example.org ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286 ...
이 예에서는 BIND가 동일한 호스트에서 실행되고
localhost
인터페이스의 쿼리에 응답하는 것으로 가정합니다.RPZ에서 쿼리를 삭제하기 위해 RPZ에 구성된
example.net
도메인에서 호스트를 확인하려고 합니다.# dig @localhost www.example.net ... ;; connection timed out; no servers could be reached ...
추가 리소스
4.9. RHEL 7에서 RHEL 8로의 마이그레이션 바인딩
RHEL 7에서 RHEL 8로 BIND
를 마이그레이션하려면 다음과 같은 방법으로 바인딩 구성을 조정해야 합니다.
-
dnssec-lookaside 자동
구성 옵션을 제거합니다. -
listen-on-v6
구성 옵션의 기본값이none
의 없음으로 변경되었기 때문에BIND
는 구성된모든
IPv6 주소에서 기본적으로 수신 대기합니다. -
영역에 대한 업데이트가 허용되는 경우 여러 영역에서 동일한 영역 파일을 공유할 수 없습니다. 여러 영역 정의에서 동일한 파일을 사용해야 하는 경우 allow-updates만 사용하지 않아야
합니다
. 비어 있지 않은update-policy
를 사용하거나인라인 서명 을
활성화하지 마십시오. 그렇지 않으면in-view
절을 사용하여 영역을 공유합니다.
업데이트된 명령줄 옵션, 기본 동작 및 출력 형식:
-
인터페이스당 사용되는 UDP 리스너 수가 프로세서 수로 변경되었습니다.
BIND
에-U
인수를 사용하여 재정의할 수 있습니다. -
statistics-channel
에 사용되는 XML 형식이 변경되었습니다. -
이제
rndc flushtree
옵션은DNSSEC
검증 실패와 특정 이름 레코드를 플러시합니다. -
/etc/named.iscdlv.key
파일 대신/etc/named.root.key
파일을 사용해야 합니다./etc/named.iscdlv.key
파일을 더 이상 사용할 수 없습니다. - 클라이언트 오브젝트의 메모리 주소를 포함하도록 쿼리 로그 형식이 변경되었습니다. 디버깅에 유용할 수 있습니다.
-
named
및dig
유틸리티는 기본적으로DNS COOKIE
(RFC 7873)을 전송하므로 제한적인 방화벽 또는 침입 탐지 시스템에서 중단될 수 있습니다.send-cookie
설정 옵션을 사용하여 이러한 동작을 변경할 수 있습니다. -
dig
유틸리티는확장 DNS 오류
(EDE, RFC 8914)를 텍스트 형식으로 표시할 수 있습니다.
4.10. dnstap을 사용하여 DNS 쿼리 기록
네트워크 관리자는 DNS(Domain Name System) 세부 정보를 기록하여 DNS 트래픽 패턴을 분석하고 DNS 서버 성능을 모니터링하고 DNS 문제를 해결할 수 있습니다. 고급 방법으로 들어오는 이름 쿼리의 세부 정보를 모니터링하고 기록하려면 named
서비스에서 보낸 메시지를 기록하는 dnstap
인터페이스를 사용합니다. DNS 쿼리를 캡처하고 기록하여 웹사이트 또는 IP 주소에 대한 정보를 수집할 수 있습니다.
사전 요구 사항
-
bind-9.11.26-2
패키지 또는 이후 버전이 설치되어 있습니다.
BIND
버전이 이미 설치되어 실행 중인 경우 새 버전의 BIND
를 추가하면 기존 버전이 덮어씁니다.
절차
options
블록에서/etc/named.conf
파일을 편집하여dnstap
및 대상 파일을 활성화합니다.options { # ... dnstap { all; }; # Configure filter dnstap-output file "/var/named/data/dnstap.bin"; # ... }; # end of options
로깅할 DNS 트래픽 유형을 지정하려면
/etc/named.conf
파일의dnstap
블록에dnstap
필터를 추가합니다. 다음 필터를 사용할 수 있습니다.-
auth
- 권한 있는 영역 응답 또는 응답. -
클라이언트
- 내부 클라이언트 쿼리 또는 응답. -
Forwarder
- 쿼리 또는 응답에서 전달합니다. -
해결자
- 반복적 해결 쿼리 또는 응답. -
업데이트
- 동적 영역 업데이트 요청. -
All - 위 옵션 중
모두
입니다. 쿼리
또는응답
-쿼리
또는응답
키워드를 지정하지 않으면dnstap
이 둘 다 기록합니다.참고dnstap
필터는 로 구분된 여러 정의가 포함되어 있습니다.dnstap {}
블록의 구문은dnstap {(모든 | auth | client | forwardr | update ) [( query | response ) ]
;
… };
-
변경 사항을 적용하려면
named
서비스를 다시 시작하십시오.# systemctl restart named.service
활성 로그에 대한 주기적인 롤아웃 구성
다음 예에서
cron
스케줄러는 사용자가 편집한 스크립트의 콘텐츠를 하루에 한 번 실행합니다. 값이3
인roll
옵션은dnstap
에서 최대 3개의 백업 로그 파일을 생성할 수 있음을 지정합니다. value3
은dnstap-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
dnstap-read
유틸리티를 사용하여 사람이 읽을 수 있는 형식으로 로그를 처리하고 분석합니다.다음 예에서
dnstap-read
유틸리티는YAML
파일 형식으로 출력을 출력합니다.Example: dnstap-read -p /var/named/data/dnstap.bin
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 공유에 액세스할 때 root
를 nobody
계정에 매핑합니다. root_squash
옵션은 이 동작을 제어합니다.
추가 리소스
-
exports(5)
시스템의 도움말 페이지
5.5. NFS 서버에 필요한 서비스
RHEL(Red Hat Enterprise Linux)은 커널 모듈과 사용자 공간 프로세스의 조합을 사용하여 NFS 파일 공유를 제공합니다.
서비스 이름 | NFS 버전 | 설명 |
---|---|---|
| 3, 4 | 공유 NFS 파일 시스템에 대해 서비스를 요청하는 NFS 커널 모듈입니다. |
| 3 |
이 프로세스에서는 로컬 원격 프로시저 호출(RPC) 서비스의 포트 예약을 허용하여 해당 원격 RPC 서비스에 액세스할 수 있도록 합니다. |
| 3, 4 |
이 서비스는 NFSv3 클라이언트의 요청된 NFS 공유가 현재 NFS 서버에서 내보내지고 클라이언트가 액세스할 수 있는지 확인합니다. |
| 3, 4 | 이 프로세스는 서버에서 정의하는 명시적인 NFS 버전 및 프로토콜을 알립니다. NFS 클라이언트가 연결할 때마다 서버 스레드를 제공하는 등 NFS 클라이언트의 동적 요구 사항을 충족하기 위해 커널과 함께 작동합니다.
|
| 3 | 이 커널 모듈은 클라이언트가 서버의 파일을 잠글 수 있는 NLM(Network Lock Manager) 프로토콜을 구현합니다. NFS 서버가 실행되면 RHEL에서 모듈을 자동으로 로드합니다. |
| 3, 4 | 이 서비스는 원격 사용자에 대한 사용자 할당량 정보를 제공합니다. |
| 4 | 이 프로세스에서는 NFSv4 클라이언트와 서버 upcall을 제공합니다. 이 호출은 NFSv4 이름( 'user@domain'형식의 문자열)과 로컬 사용자 및 그룹 ID 간에 매핑됩니다. |
| 3, 4 |
이 서비스는 |
| 4 | 이 서비스는 다른 클라이언트가 서버 재부팅과 결합된 네트워크 파티션 중에 충돌하는 잠금을 수행할 때 서버가 잠금 회수를 부여하지 못하도록 NFSv4 클라이언트 추적 데몬을 제공합니다. |
| 3 | 이 서비스는 로컬 호스트가 재부팅될 때 및 원격 NFSv3 호스트가 재부팅될 때 커널에 알림을 제공합니다. |
추가 리소스
-
rpcbind(8)
,rpc.mountd(8)
,rpc.nfsd(8)
,rpc.statd(8)
,rpc.rquotad(8)
,rpc.idmapd(8)
,gssproxy(8)
,nfsdcld(8)
,rpc.statd(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 서버는 내보낸 각 디렉터리에 대해 다음 기본 설정을 사용합니다.
기본 설정 | 설명 |
---|---|
| 디렉터리를 읽기 전용 모드로 내보냅니다. |
| 이전 요청의 변경 사항을 디스크에 쓰기 전에 NFS 서버는 요청에 응답하지 않습니다. |
| 서버가 다른 쓰기 요청이 보류 중인 것으로 의심되는 경우 디스크에 쓰기를 지연합니다. |
|
클라이언트의 |
5.7. NFSv4 전용 서버 구성
네트워크에 NFSv3 클라이언트가 없는 경우 NFSv4 또는 특정 마이너 프로토콜 버전만 지원하도록 NFS 서버를 구성할 수 있습니다. 서버에서 NFSv4만 사용하면 네트워크에 열려 있는 포트 수를 줄일 수 있습니다.
절차
nfs-utils
패키지를 설치합니다.# dnf install nfs-utils
/etc/nfs.conf
파일을 편집하고 다음과 같이 변경합니다.[nfsd]
섹션에서vers3
매개 변수를 비활성화하여 NFSv3를 비활성화합니다.[nfsd] vers3=n
선택 사항: 특정 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
를 설정하면 이 동작이 변경됩니다.
모든 NFSv3 관련 서비스를 비활성화합니다.
# systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
NFSv3 마운트 요청을 수신 대기하지 않도록
rpc.mountd
데몬을 구성합니다. 다음 콘텐츠를 사용하여/etc/systemd/system/nfs-mountd.service.d/v4only.conf
파일을 만듭니다.[Service] ExecStart= ExecStart=/usr/sbin/rpc.mountd --no-tcp --no-udp
systemd
관리자 구성을 다시 로드하고nfs-mountd
서비스를 다시 시작합니다.# systemctl daemon-reload # systemctl restart nfs-mountd
선택 사항: 공유할 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.
# mkdir -p /nfs/projects/
기존 디렉터리를 공유하려면 이 단계를 건너뜁니다.
/nfs/projects/
디렉터리에 필요한 권한을 설정합니다.# chmod 2770 /nfs/projects/ # chgrp users /nfs/projects/
이러한 명령은
/nfs/projects/
디렉터리에서users
그룹에 대한 쓰기 권한을 설정하고 동일한 그룹이 이 디렉터리에 생성된 새 항목에 자동으로 설정되어 있는지 확인합니다.공유하려는 각 디렉터리의
/etc/exports
파일에 내보내기 지점을 추가합니다./nfs/projects/ 192.0.2.0/24(rw) 2001:db8::/32(rw)
이 항목은
192.0.2.0/24
및2001:db8::/32
서브넷의 클라이언트에 대한 읽기 및 쓰기 액세스 권한으로 액세스할 수 있도록/nfs/projects/
디렉터리를 공유합니다.firewalld
에서 관련 포트를 엽니다.# firewall-cmd --permanent --add-service nfs # firewall-cmd --reload
NFS 서버를 활성화하고 시작합니다.
# systemctl enable --now nfs-server
검증
서버에서 서버가 구성한 NFS 버전만 제공하는지 확인합니다.
# cat /proc/fs/nfsd/versions -3 +4 -4.0 -4.1 +4.2
클라이언트에서 다음 단계를 수행합니다.
nfs-utils
패키지를 설치합니다.# dnf install nfs-utils
내보낸 NFS 공유를 마운트합니다.
# mount server.example.com:/nfs/projects/ /mnt/
users
그룹의 멤버인 사용자로/mnt/
:에 파일을 생성합니다.# touch /mnt/file
디렉터리를 나열하여 파일이 생성되었는지 확인합니다.
# 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 버전을 사용합니다.
절차
nfs-utils
패키지를 설치합니다.# dnf install nfs-utils
선택 사항: 기본적으로 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
를 설정하면 이 동작이 변경됩니다.기본적으로 NFSv3 RPC 서비스는 임의의 포트를 사용합니다. 방화벽 구성을 활성화하려면
/etc/nfs.conf
파일에서 고정 포트 번호를 구성합니다.[lockd]
섹션에서nlockmgr
RPC 서비스의 고정 포트 번호를 설정합니다. 예를 들면 다음과 같습니다.[lockd] port=5555
이 설정을 사용하면 서비스는 UDP 및 TCP 프로토콜 모두에 이 포트 번호를 자동으로 사용합니다.
[statd]
섹션에서rpc.statd
서비스의 고정 포트 번호를 설정합니다. 예를 들면 다음과 같습니다.[statd] port=6666
이 설정을 사용하면 서비스는 UDP 및 TCP 프로토콜 모두에 이 포트 번호를 자동으로 사용합니다.
선택 사항: 공유할 디렉터리를 생성합니다. 예를 들면 다음과 같습니다.
# mkdir -p /nfs/projects/
기존 디렉터리를 공유하려면 이 단계를 건너뜁니다.
/nfs/projects/
디렉터리에 필요한 권한을 설정합니다.# chmod 2770 /nfs/projects/ # chgrp users /nfs/projects/
이러한 명령은
/nfs/projects/
디렉터리에서users
그룹에 대한 쓰기 권한을 설정하고 동일한 그룹이 이 디렉터리에 생성된 새 항목에 자동으로 설정되어 있는지 확인합니다.공유하려는 각 디렉터리의
/etc/exports
파일에 내보내기 지점을 추가합니다./nfs/projects/ 192.0.2.0/24(rw) 2001:db8::/32(rw)
이 항목은
192.0.2.0/24
및2001:db8::/32
서브넷의 클라이언트에 대한 읽기 및 쓰기 액세스 권한으로 액세스할 수 있도록/nfs/projects/
디렉터리를 공유합니다.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
NFS 서버를 활성화하고 시작합니다.
# systemctl enable --now rpc-statd nfs-server
검증
서버에서 서버가 구성한 NFS 버전만 제공하는지 확인합니다.
# cat /proc/fs/nfsd/versions +3 +4 -4.0 -4.1 +4.2
클라이언트에서 다음 단계를 수행합니다.
nfs-utils
패키지를 설치합니다.# dnf install nfs-utils
내보낸 NFS 공유를 마운트합니다.
# mount -o vers=<version> server.example.com:/nfs/projects/ /mnt/
공유가 지정된 NFS 버전으로 마운트되었는지 확인합니다.
# mount | grep "/mnt" server.example.com:/nfs/projects/ on /mnt type nfs (rw,relatime,vers=3,...
users
그룹의 멤버인 사용자로/mnt/
:에 파일을 생성합니다.# touch /mnt/file
디렉터리를 나열하여 파일이 생성되었는지 확인합니다.
# ls -l /mnt/ total 0 -rw-r--r--. 1 demo users 0 Jan 16 14:18 file
5.9. NFS 서버에서 할당량 지원 활성화
사용자 또는 그룹이 저장할 수 있는 데이터 양을 제한하려면 파일 시스템에 할당량을 구성할 수 있습니다. NFS 서버에서 rpc-rquotad
서비스는 할당량이 NFS 클라이언트의 사용자에게도 적용되도록 합니다.
절차
내보내는 디렉터리에서 할당량이 활성화되어 있는지 확인합니다.
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
quota-rpc
패키지를 설치합니다.# dnf install quota-rpc
선택 사항: 기본적으로 quota RPC 서비스는 포트 875에서 실행됩니다. 다른 포트에서 서비스를 실행하려면
/etc/sysconfig/rpc
>를 추가합니다.-rquotad
파일의RPCRQUOTADOPTS
변수에 -p <port_numberRPCRQUOTADOPTS="-p __<port_number>__"
선택 사항: 기본적으로 원격 호스트는 할당량만 읽을 수 있습니다. 클라이언트가 할당량을 설정할 수 있도록 하려면
/etc/sysconfig/rpc-rquotad
파일의RPCRQUOTADOPTS
변수에-S
옵션을 추가합니다.RPCRQUOTADOPTS="-S"
firewalld
에서 포트를 엽니다.# firewall-cmd --permanent --add-port=875/udp # firewall-cmd --reload
rpc-rquotad
서비스를 활성화하고 시작합니다.# systemctl enable --now rpc-rquotad
검증
클라이언트에서 다음을 수행합니다.
내보낸 공유를 마운트합니다.
# mount server.example.com:/nfs/projects/ /mnt/
할당량을 표시합니다. 명령은 내보낸 디렉터리의 파일 시스템에 따라 달라집니다. 예를 들면 다음과 같습니다.
마운트된 모든 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 주소가 할당됩니다.
절차
rdma-core
패키지를 설치합니다.# dnf install rdma-core
패키지가 이미 설치된 경우
/etc/rdma/modules/rdma.conf
파일의xprtrdma
및svcrdma
모듈이 주석 해제되었는지 확인합니다.# NFS over RDMA client support xprtrdma # NFS over RDMA server support svcrdma
선택 사항: 기본적으로 RDMA를 통한 NFS에서는 포트 20049를 사용합니다. 다른 포트를 사용하려면
/etc/nfs.conf
파일의[nfsd]
섹션에서rdma-port
설정을 설정합니다.rdma-port=<port>
firewalld
에서 NFSoRDMA 포트를 엽니다.# firewall-cmd --permanent --add-port={20049/tcp,20049/udp} # firewall-cmd --reload
20049 이외의 다른 포트를 설정하면 포트 번호를 조정합니다.
nfs-server
서비스를 다시 시작합니다.# systemctl restart nfs-server
검증
InfiniBand 하드웨어가 있는 클라이언트에서 다음 단계를 수행합니다.
다음 패키지를 설치합니다.
# dnf install nfs-utils rdma-core
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/
rdma
옵션을 사용하여 공유가 마운트되었는지 확인합니다.# mount | grep "/mnt" server.example.com:/nfs/projects/ on /mnt type nfs (...,proto=rdma,...)
추가 리소스
5.11. Red Hat Enterprise Linux Identity Management 도메인에서 Kerberos를 사용하여 NFS 서버 설정
Red Hat Enterprise Linux IdM(Identity Management)을 사용하는 경우 NFS 서버를 IdM 도메인에 연결할 수 있습니다. 이를 통해 사용자와 그룹을 중앙에서 관리하고 인증, 무결성 보호 및 트래픽 암호화에 Kerberos를 사용할 수 있습니다.
사전 요구 사항
- NFS 서버는 Red Hat Enterprise Linux IdM(Identity Management) 도메인에 등록되어 있습니다.
- NFS 서버가 실행 중이고 구성되어 있습니다.
절차
IdM 관리자로 kerberos 티켓을 받습니다.
# kinit admin
nfs/<FQDN> 서비스
주체를 생성합니다.# ipa service-add nfs/nfs_server.idm.example.com
IdM에서
nfs
서비스 주체를 검색하여/etc/krb5.keytab
파일에 저장합니다.# ipa-getkeytab -s idm_server.idm.example.com -p nfs/nfs_server.idm.example.com -k /etc/krb5.keytab
선택 사항:
/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
명령을 사용하여 추가합니다.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
/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)
내보낸 파일 시스템을 다시 로드합니다.
# exportfs -r
6장. Squid 캐싱 프록시 서버 구성
Squid는 콘텐츠를 캐시하여 대역폭과 부하 웹 페이지를 더 빠르게 줄이는 프록시 서버입니다. 이 장에서는 HTTP, HTTPS 및 FTP 프로토콜에 대한 프록시로 Squid를 설정하는 방법과 인증 및 액세스 제한에 대해 설명합니다.
6.1. 인증 없이 캐싱 프록시로 Squid 설정
인증 없이 Squid를 캐싱 프록시로 구성할 수 있습니다. 이 절차에서는 IP 범위를 기반으로 프록시에 대한 액세스를 제한합니다.
사전 요구 사항
-
이 절차에서는
/etc/squid/squid.conf
파일이squid
패키지에서 제공하는 것으로 가정합니다. 이전에 이 파일을 편집한 경우 파일을 제거하고 패키지를 다시 설치합니다.
절차
squid
패키지를 설치합니다.# yum install squid
/etc/squid/squid.conf
파일을 편집합니다.프록시를 사용할 수 있어야 하는 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 ACL을 지정해야 합니다.localnet
중요사용자 환경과 일치하지 않는 기존
acl localnet
항목을 모두 제거합니다.다음 ACL은 기본 구성에 존재하며 HTTPS 프로토콜을 사용하는 포트로
443
을 정의합니다.acl SSL_ports port 443
사용자가 다른 포트에서도 HTTPS 프로토콜을 사용할 수 있어야 하는 경우 다음 각 포트에 대한 ACL을 추가합니다.
acl SSL_ports port port_number
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
규칙이 포함됩니다.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가 캐시를 메모리에 저장합니다.
-
squid는
cache_dir
매개변수에서/var/spool/squid/
와 다른 캐시 디렉터리를 설정하는 경우:캐시 디렉토리를 생성합니다.
# mkdir -p path_to_cache_directory
캐시 디렉토리에 대한 권한을 구성합니다.
# chown squid:squid path_to_cache_directory
강제
모드에서 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
패키지를 설치합니다.
방화벽에서
3128
포트를 엽니다.# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reload
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는 이 사용자로 을 디렉터리에 바인딩하여 인증을 확인합니다.
절차
squid
패키지를 설치합니다.# yum install squid
/etc/squid/squid.conf
파일을 편집합니다.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
특성에 설정된 값과 디렉터리 항목에사람
오브젝트 클래스가 포함되어 있어야 함을 정의합니다.-ZZ
는STARTTLS
명령을 사용하여 LDAP 프로토콜을 통해 TLS 암호화 연결을 적용합니다. 다음과 같은 경우에는-ZZ
를 생략하십시오.- LDAP 서버는 암호화된 연결을 지원하지 않습니다.
- URL에 지정된 포트는 LDAPS 프로토콜을 사용합니다.
- H LDAP_URL 매개 변수는 프로토콜, 호스트 이름 또는 IP 주소, LDAP 서버의 포트를 URL 형식으로 지정합니다.
-
Squid가 인증된 사용자만 프록시를 사용하도록 허용하는 다음 ACL 및 규칙을 추가합니다.
acl ldap-auth proxy_auth REQUIRED http_access allow ldap-auth
중요http_access deny
모든 규칙을 거부하기 전에 이러한 설정을 지정합니다.localnet
ACL에 지정된 IP 범위에서 프록시 인증을 바이패스하려면 다음 규칙을 제거합니다.http_access allow localnet
다음 ACL은 기본 구성에 존재하며 HTTPS 프로토콜을 사용하는 포트로
443
을 정의합니다.acl SSL_ports port 443
사용자가 다른 포트에서도 HTTPS 프로토콜을 사용할 수 있어야 하는 경우 다음 각 포트에 대한 ACL을 추가합니다.
acl SSL_ports port port_number
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_portscache_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가 캐시를 메모리에 저장합니다.
-
squid는
cache_dir
매개변수에서/var/spool/squid/
와 다른 캐시 디렉터리를 설정하는 경우:캐시 디렉토리를 생성합니다.
# mkdir -p path_to_cache_directory
캐시 디렉토리에 대한 권한을 구성합니다.
# chown squid:squid path_to_cache_directory
강제
모드에서 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
패키지를 설치합니다.
LDAP 서비스 사용자의 암호를
/etc/squid/ldap_password
파일에 저장하고 파일에 대한 적절한 권한을 설정합니다.# echo "password" > /etc/squid/ldap_password # chown root:squid /etc/squid/ldap_password # chmod 640 /etc/squid/ldap_password
방화벽에서
3128
포트를 엽니다.# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reload
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
파일이 현재 디렉터리로 다운로드된 경우 프록시가 작동합니다.
문제 해결 단계
도우미 유틸리티가 올바르게 작동하는지 확인하려면 다음을 수행하십시오.
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
유효한 사용자 이름과 암호를 입력하고 Enter 키를 누릅니다.
user_name password
도우미 유틸리티에서
OK
를 반환하는 경우 인증이 성공했습니다.
6.3. kerberos 인증을 사용하여 캐싱 프록시로 Squid 설정
Kerberos를 사용하여 AD(Active Directory)에 사용자를 인증하는 캐싱 프록시로 Squid를 구성할 수 있습니다. 이 절차에서는 인증된 사용자만 프록시를 사용할 수 있도록 구성됩니다.
사전 요구 사항
-
이 절차에서는
/etc/squid/squid.conf
파일이squid
패키지에서 제공하는 것으로 가정합니다. 이전에 이 파일을 편집한 경우 파일을 제거하고 패키지를 다시 설치합니다.
절차
다음 패키지를 설치합니다.
# yum install squid krb5-workstation
AD 도메인 관리자로 인증합니다.
# kinit administrator@AD.EXAMPLE.COM
Squid의 키탭을 만들고 이를
/etc/squid/HTTP.keytab
파일에 저장하고 keytab에HTTP
서비스 주체를 추가합니다.# export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab # net ads keytab CREATE -U administrator # net ads keytab ADD HTTP -U administrator
선택 사항: 시스템이 realm(
adcli
를 통해)과 함께 AD 도메인에 처음 가입된 경우 다음 지침을 사용하여HTTP
주체를 추가하고 squid에 대한 키탭 파일을 생성합니다.기본 키탭 파일
/etc/krb5.keytab
에HTTP
서비스 주체를 추가하고 확인합니다.# adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C # klist -kte /etc/krb5.keytab | grep -i HTTP
/etc/krb5.keytab
파일을 로드하고HTTP
를 제외한 모든 서비스 주체를 제거하고 나머지 주체를/etc/squid/HTTP.keytab
파일에 저장합니다.# ktutil ktutil: rkt /etc/krb5.keytab ktutil: l -e slot | KVNO | Principal ----------------------------------------------------------------------------- 1 | 2 | PROXY$@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 2 | 2 | PROXY$@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 3 | 2 | host/PROXY@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 4 | 2 | host/PROXY@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 5 | 2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 6 | 2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) 7 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 8 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
ktutil
의 대화형 쉘에서는 원하지 않는 모든 주체가 키탭에서 제거될 때까지 다양한 옵션을 사용할 수 있습니다. 예를 들면 다음과 같습니다.ktutil: delent 1
ktutil: l -e slot | KVNO | Principal ------------------------------------------------------------------------------- 1 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96) 2 | 2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96) ktutil: wkt /etc/squid/HTTP.keytab ktutil: q
주의SSSD 또는 Samba/winbind에서 시스템 계정 암호를 업데이트할 경우
/etc/krb5.keytab
의 키가 업데이트될 수 있습니다. 업데이트 후/etc/squid/HTTP.keytab
의 키가 작동하지 않으며ktutil
단계를 다시 수행하여 새 키를 키탭에 복사해야 합니다.
keytab 파일의 소유자를
squid
사용자로 설정합니다.# chown squid /etc/squid/HTTP.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 ...
/etc/squid/squid.conf
파일을 편집합니다.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
파일에 기록합니다.
-
Squid가 인증된 사용자만 프록시를 사용하도록 허용하는 다음 ACL 및 규칙을 추가합니다.
acl kerb-auth proxy_auth REQUIRED http_access allow kerb-auth
중요http_access deny 모든
규칙을 거부하기 전에 이러한 설정을 지정합니다.localnet
ACL에 지정된 IP 범위에서 프록시 인증을 바이패스하려면 다음 규칙을 제거합니다.http_access allow localnet
다음 ACL은 기본 구성에 존재하며 HTTPS 프로토콜을 사용하는 포트로
443
을 정의합니다.acl SSL_ports port 443
사용자가 다른 포트에서도 HTTPS 프로토콜을 사용할 수 있어야 하는 경우 다음 각 포트에 대한 ACL을 추가합니다.
acl SSL_ports port port_number
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
규칙이 포함됩니다.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가 캐시를 메모리에 저장합니다.
-
squid는
cache_dir
매개변수에서/var/spool/squid/
와 다른 캐시 디렉터리를 설정하는 경우:캐시 디렉토리를 생성합니다.
# mkdir -p path_to_cache_directory
캐시 디렉토리에 대한 권한을 구성합니다.
# chown squid:squid path_to_cache_directory
강제
모드에서 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
패키지를 설치합니다.
방화벽에서
3128
포트를 엽니다.# firewall-cmd --permanent --add-port=3128/tcp # firewall-cmd --reload
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
파일이 현재 디렉터리에 있는 경우 프록시가 작동합니다.
문제 해결 단계
AD 계정에 대한 Kerberos 티켓을 받습니다.
# kinit user@AD.EXAMPLE.COM
선택 사항: 티켓을 표시합니다.
# klist
negotiate_kerberos_auth_test
유틸리티를 사용하여 인증을 테스트합니다.# /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com
도우미 유틸리티에서 토큰을 반환하면 인증이 성공했습니다.
Token: YIIFtAYGKwYBBQUCoIIFqDC...
6.4. Squid에서 도메인 거부 목록 구성
관리자는 특정 도메인에 대한 액세스를 차단하려는 경우가 많습니다. 이 섹션에서는 Squid에서 도메인 거부 목록을 구성하는 방법을 설명합니다.
사전 요구 사항
- Squid가 구성되어 있으며 사용자는 프록시를 사용할 수 있습니다.
절차
/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
문 앞에 이러한 항목을 추가합니다./etc/squid/domain_deny_list.txt
파일을 만들고 차단하려는 도메인을 추가합니다. 예를 들어 하위 도메인을 포함한example.com
에 대한 액세스를 차단하고example.net
을 차단하려면 다음을 추가합니다..example.com example.net
중요squid 구성에서
/etc/squid/domain_deny_list.txt
파일을 참조하는 경우 이 파일은 비워서는 안 됩니다. 파일이 비어 있으면 Squid가 시작되지 않습니다.squid
서비스를 다시 시작하십시오.# systemctl restart squid
6.5. 특정 포트 또는 IP 주소에서 수신 대기하도록 Squid 서비스 구성
기본적으로 Squid 프록시 서비스는 모든 네트워크 인터페이스의 3128
포트에서 수신 대기합니다. 포트를 변경하고 특정 IP 주소에서 수신 대기하도록 Squid를 구성할 수 있습니다.
사전 요구 사항
-
squid
패키지가 설치되어 있습니다.
절차
/etc/squid/squid.conf
파일을 편집합니다.Squid 서비스가 수신 대기하는 포트를 설정하려면
http_port
매개 변수에 포트 번호를 설정합니다. 예를 들어 포트를8080
으로 설정하려면 다음을 설정합니다.http_port 8080
Squid 서비스가 수신 대기하는 IP 주소를 구성하려면
http_port
매개변수에서 IP 주소 및 포트 번호를 설정합니다. 예를 들어 Squid가 포트3128
의192.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
Squid가 기본값(3128)으로 다른 포트를 사용하도록 구성한
경우
:방화벽에서 포트를 엽니다.
# firewall-cmd --permanent --add-port=port_number/tcp # firewall-cmd --reload
강제 모드에서 SELinux를 실행하는 경우 포트를
squid_port_t
포트 유형 정의에 할당합니다.# semanage port -a -t squid_port_t -p tcp port_number
시스템에서
semanage
유틸리티를 사용할 수 없는 경우policycoreutils-python-utils
패키지를 설치합니다.
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 이후 사용 가능
- MariaDB 10.11 - RHEL 8.10 이후 사용 가능
- MySQL 8.0
- PostgreSQL 10
- PostgreSQL 9.6
- PostgreSQL 12 - RHEL 8.1.1 이후 사용 가능
- PostgreSQL 13 - RHEL 8.4 이후 사용 가능
- PostgreSQL 15 - RHEL 8.8 이후 사용 가능
- PostgreSQL 16 - RHEL 8.10 이후 사용 가능
7.2. MariaDB 사용
MariaDB 서버는 MySQL 기술을 기반으로 하는 오픈 소스 빠르고 강력한 데이터베이스 서버입니다. MariaDB 는 데이터를 구조화된 정보로 변환하고 데이터에 액세스하기 위한 SQL 인터페이스를 제공하는 관계형 데이터베이스입니다. 여러 스토리지 엔진 및 플러그인뿐만 아니라 GIS(Gyge Information System) 및 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 10.11 - RHEL 8.10 이후 사용 가능
설계상 동일한 모듈의 두 개 이상 버전(스트림)을 병렬로 설치할 수 없습니다. 따라서 mariadb
모듈에서 사용 가능한 스트림 중 하나만 선택해야 합니다. 컨테이너에서 다른 버전의 MariaDB 데이터베이스 서버를 사용할 수 있습니다. 컨테이너에서 여러 MariaDB 버전 실행을 참조하십시오.
충돌하는 RPM 패키지로 인해 MariaDB 및 MySQL 데이터베이스 서버를 RHEL 8에서 병렬로 설치할 수 없습니다. 컨테이너에서 병렬로 MariaDB 및 MySQL 데이터베이스 서버를 사용할 수 있습니다. 컨테이너에서 여러 MySQL 및 MariaDB 버전 실행을 참조하십시오.
MariaDB 를 설치하려면 다음 절차를 사용합니다.
절차
mariadb
모듈에서 스트림(버전)을 선택하고 서버 프로필을 지정하여 MariaDB서버
패키지를 설치합니다. 예를 들면 다음과 같습니다.# yum module install mariadb:10.3/server
mariadb
서비스를 시작합니다.# systemctl start mariadb.service
부팅 시 시작되도록
mariadb
서비스를 활성화합니다.# systemctl enable mariadb.service
MariaDB 10.3에 권장됩니다. MariaDB 를 설치할 때 보안을 개선하려면 다음 명령을 실행합니다.
$ mysql_secure_installation
명령은 완전히 대화형 스크립트를 시작하여 프로세스의 각 단계에 대한 메시지를 표시합니다. 이 스크립트를 사용하면 다음과 같은 방법으로 보안을 강화할 수 있습니다.
- root 계정의 암호 설정
- 익명 사용자 제거
원격 root 로그인 허용 (로컬 호스트 내부)
참고mysql_secure_installation 스크립트는 MariaDB 10.5 이상에서 더 이상 중요하지 않습니다. 보안 개선 사항은 MariaDB 10.5 이후 기본 동작의 일부입니다.
RHEL 8 내의 이전 mariadb
스트림에서 업그레이드하려면 이후 스트림으로 전환하고 MariaDB 10.3에서 MariaDB 10.5로 업그레이드하거나 MariaDB 10.5에서 MariaDB 10.11로 업그레이드에 설명된 두 가지 절차를 따르십시오.
7.2.2. 컨테이너에서 여러 MariaDB 버전 실행
동일한 호스트에서 다른 버전의 MariaDB 를 실행하려면 동일한 모듈의 여러 버전(스트림)을 병렬로 설치할 수 없기 때문에 컨테이너에서 실행합니다.
사전 요구 사항
-
container-tools
모듈이 설치되어 있습니다.
절차
Red Hat 고객 포털 계정을 사용하여
registry.redhat.io
레지스트리에 인증합니다.# podman login registry.redhat.io
컨테이너 레지스트리에 이미 로그인한 경우 이 단계를 건너뜁니다.
컨테이너에서 MariaDB 10.3 을 실행합니다.
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_1>:3306 rhel8/mariadb-103
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
컨테이너에서 MariaDB 10.5 를 실행합니다.
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
컨테이너에서 MariaDB 10.11 을 실행합니다.
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
참고두 데이터베이스 서버의 컨테이너 이름과 호스트 포트는 달라야 합니다.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 호스트 포트를 엽니다.
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,<host_port_3>/tcp...} # firewall-cmd --reload
검증
실행 중인 컨테이너에 대한 정보를 표시합니다.
$ podman ps
데이터베이스 서버에 연결하고 root로 로그인합니다.
# mysql -u root -p -h localhost -P <host_port> --protocol tcp
7.2.3. MariaDB 구성
네트워킹에 사용할 MariaDB 서버를 구성하려면 다음 절차를 사용합니다.
절차
/etc/my.cnf.
섹션을 편집합니다. 다음 구성 지시문을 설정할 수 있습니다.d/mariadb-server.cnf 파일의 [mysqld
]bind-address
- 서버가 수신 대기하는 주소입니다. 가능한 옵션은 다음과 같습니다.- 호스트 이름
- IPv4 주소
- IPv6 주소
skip-networking
- 서버가 TCP/IP 연결을 수신하는지 여부를 제어합니다. 가능한 값은 다음과 같습니다.- 0 - 모든 클라이언트 수신 대기
- 1 - 로컬 클라이언트만 수신 대기
-
포트
- MariaDB 가 TCP/IP 연결을 수신 대기하는 포트입니다.
mariadb
서비스를 다시 시작합니다.# systemctl restart mariadb.service
7.2.4. MariaDB 서버에서 TLS 암호화 설정
기본적으로 MariaDB 는 암호화되지 않은 연결을 사용합니다. 보안 연결을 위해 MariaDB 서버에서 TLS 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성합니다.
7.2.4.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 문서를 참조하십시오.
-
서버의 개인 키:
절차
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/
MariaDB 서버가 파일을 읽을 수 있도록 CA 및 서버 인증서에 대한 권한을 설정합니다.
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
인증서는 보안 연결을 설정하기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 검색할 수 있습니다. 따라서 CA 및 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.
서버의 개인 키를
/etc/pki/tls/private/
디렉터리에 저장합니다.# mv <path>/server.example.com.key.pem /etc/pki/tls/private/
서버의 개인 키에 보안 권한을 설정합니다.
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
권한이 없는 사용자가 개인 키에 액세스할 수 있는 경우 MariaDB 서버에 대한 연결이 더 이상 안전하지 않습니다.
SELinux 컨텍스트를 복원하십시오.
# restorecon -Rv /etc/pki/tls/
7.2.4.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) 또는 서버 인증서의 SAN(주체 대체 이름) 필드와 서버의 호스트 이름과 일치합니다.
절차
/etc/my.cnf.d/mariadb-server-tls.cnf
파일을 생성합니다.다음 콘텐츠를 추가하여 개인 키, 서버 및 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
CRL(인증서 해지 목록)이 있는 경우 이를 사용하도록 MariaDB 서버를 구성합니다.
ssl_crl = /etc/pki/tls/certs/example.crl.pem
선택 사항: MariaDB 10.5.2 이상을 실행하는 경우 암호화 없이 연결 시도를 거부할 수 있습니다. 이 기능을 활성화하려면 다음을 추가합니다.
require_secure_transport = on
선택 사항: 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을 지원합니다.
mariadb
서비스를 다시 시작합니다.# systemctl restart mariadb.service
검증
문제 해결을 간소화하려면 TLS 암호화를 사용하도록 로컬 클라이언트를 구성하기 전에 MariaDB 서버에서 다음 단계를 수행합니다.
MariaDB 에 TLS 암호화가 활성화되어 있는지 확인합니다.
# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'have_ssl';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | have_ssl | YES | +---------------+-----------------+
have_ssl
변수를yes
로 설정하면 TLS 암호화가 활성화됩니다.특정 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.4.3. 특정 사용자 계정에 대해 TLS 암호화 연결 필요
중요한 데이터에 액세스할 수 있는 사용자는 항상 TLS 암호화 연결을 사용하여 네트워크를 통해 암호화되지 않은 데이터를 전송하지 않도록 해야 합니다.
모든 연결(에서 required_secure_transport =)에 보안 전송이 필요한
서버에서 를 구성할 수 없는 경우 TLS 암호화가 필요하도록 개별 사용자 계정을 구성합니다.
사전 요구 사항
- MariaDB 서버에는 TLS 지원이 활성화되어 있습니다.
- 보안 전송을 요구하도록 구성하는 사용자가 있습니다.
- 클라이언트는 서버의 인증서를 발급한 CA 인증서를 신뢰합니다.
절차
관리자로 MariaDB 서버에 연결합니다.
# mysql -u root -p -h server.example.com
관리자가 서버에 원격으로 액세스할 수 있는 권한이 없는 경우 MariaDB 서버에서 명령을 수행하고
localhost
에 연결합니다.REQUIRE SSL
절을 사용하여 사용자가 TLS 암호화 연결을 사용하여 연결해야 함을 적용합니다.MariaDB [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
검증
TLS 암호화를 사용하여 서버에
예제
사용자로 연결합니다.# mysql -u example -p -h server.example.com --ssl ... MariaDB [(none)]>
오류가 표시되지 않고 대화형 MariaDB 콘솔에 액세스할 수 있는 경우 TLS와의 연결이 성공합니다.
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.5. MariaDB 클라이언트에서 전역적으로 TLS 암호화 활성화
MariaDB 서버가 TLS 암호화를 지원하는 경우 보안 연결만 설정하고 서버 인증서를 확인하도록 클라이언트를 구성합니다. 다음 절차에서는 서버에 있는 모든 사용자에 대해 TLS 지원을 활성화하는 방법을 설명합니다.
7.2.5.1. 기본적으로 TLS 암호화를 사용하도록 MariaDB 클라이언트 구성
RHEL에서는 MariaDB 클라이언트가 TLS 암호화를 사용하도록 구성하고 서버 인증서의 CN(Common Name)이 사용자가 연결하는 호스트 이름과 일치하는지 확인할 수 있습니다. 따라서 메시지 가로채기(man-in-the-middle) 공격을 방지합니다.
사전 요구 사항
- MariaDB 서버에는 TLS 지원이 활성화되어 있습니다.
- 서버의 인증서를 발급한 CA(인증 기관)가 RHEL에서 신뢰할 수 없는 경우 CA 인증서가 클라이언트에 복사됩니다.
절차
RHEL이 서버의 인증서를 발급한 CA를 신뢰하지 않는 경우:
CA 인증서를
/etc/pki/ca-trust/source/anchors/
디렉터리에 복사합니다.# cp <path>/ca.crt.pem /etc/pki/ca-trust/source/anchors/
모든 사용자가 CA 인증서 파일을 읽을 수 있도록 권한을 설정합니다.
# chmod 644 /etc/pki/ca-trust/source/anchors/ca.crt.pem
CA 신뢰 데이터베이스를 다시 빌드합니다.
# update-ca-trust
다음 콘텐츠를 사용하여
/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.6. MariaDB 데이터 백업
MariaDB 데이터베이스에서 데이터를 백업하는 방법은 다음 두 가지가 있습니다.
- 논리적 백업
논리적 백업은 데이터를 복원하는 데 필요한 SQL 문으로 구성됩니다. 이러한 유형의 백업은 일반 텍스트 파일로 정보와 레코드를 내보냅니다.
물리적 백업보다 논리적 백업의 주요 장점은 이식성과 유연성입니다. 데이터는 물리적 백업에서는 사용할 수 없는 기타 하드웨어 구성, MariaDB 버전 또는 DBMS(데이터베이스 관리 시스템)에서 복원할 수 있습니다.
논리 백업은
mariadb.service
가 실행 중인 경우에만 수행할 수 있습니다. 논리적 백업에는 로그 및 구성 파일이 포함되지 않습니다.- 물리적 백업
물리적 백업은 콘텐츠를 저장하는 파일 및 디렉터리의 사본으로 구성됩니다.
물리적 백업은 논리적 백업과 비교하여 다음과 같은 이점이 있습니다.
- 출력이 더 작습니다.
- 백업은 크기가 작습니다.
- 백업 및 복원 속도가 빨라집니다.
백업에는 로그 및 구성 파일이 포함됩니다.
물리적 백업은
mariadb.service
가 실행 중이 아니거나 백업 중 변경을 방지하기 위해 데이터베이스의 모든 테이블이 잠겨 있는 경우 수행해야 합니다.
다음 MariaDB 백업 방법 중 하나를 사용하여 MariaDB 데이터베이스에서 데이터를 백업할 수 있습니다.
-
mysqldump
를 사용한 논리적 백업 -
Mariabackup
유틸리티를 사용한 물리적 온라인 백업 - 파일 시스템 백업
- 백업 솔루션으로의 복제
7.2.6.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
추가 리소스
- mysqldump 를 사용한 논리 백업에 대한 자세한 내용은 MariaDB 문서를 참조하십시오.
7.2.6.2. Mariabackup 유틸리티를 사용하여 물리적 온라인 백업 수행
mariabackup 은 Percona XtraBackup 기술을 기반으로 하는 유틸리티로서 InnoDB, Aria, MyISAM 테이블의 물리적 온라인 백업을 수행할 수 있습니다. 이 유틸리티는 AppStream 리포지토리에서 mariadb-backup
패키지에서 제공합니다.
mariabackup 은 암호화 및 압축된 데이터를 포함하는 MariaDB 서버에 대한 전체 백업 기능을 지원합니다.
사전 요구 사항
mariadb-backup
패키지가 시스템에 설치됩니다.# yum install mariadb-backup
- 백업이 실행될 사용자 자격 증명이 포함된 Mariabackup 을 제공해야 합니다. 명령줄 또는 구성 파일을 통해 자격 증명을 제공할 수 있습니다.
-
Mariabackup 사용자는
RELOAD
,LOCK TABLES
및REPLICATION CLIENT
권한이 있어야 합니다.
Mariabackup 을 사용하여 데이터베이스 백업을 만들려면 다음 절차를 따르십시오.
절차
명령줄에서 자격 증명을 제공하는 동안 백업을 만들려면 다음을 실행합니다.
$ mariabackup --backup --target-dir <backup_directory> --user <backup_user> --password <backup_passwd>
target-dir
옵션은 백업 파일이 저장되는 디렉터리를 정의합니다. 전체 백업을 수행하려면 대상 디렉터리가 비어 있거나 존재하지 않아야 합니다.사용자
이름 및암호
옵션을 사용하여 사용자 이름과 암호를 구성할 수 있습니다.구성 파일에 인증 정보가 설정된 백업을 생성하려면 다음을 수행합니다.
-
/etc/my.cnf.d/
디렉터리에 구성 파일을 만듭니다(예:/etc/my.cnf.d/mariabackup.cnf
). 새 파일의
[xtrabackup]
또는[mysqld]
섹션에 다음 행을 추가합니다.[xtrabackup] user=myuser password=mypassword
백업을 수행합니다.
$ mariabackup --backup --target-dir <backup_directory>
-
추가 리소스
7.2.6.3. Mariabackup 유틸리티를 사용하여 데이터 복원
백업이 완료되면 다음 옵션 중 하나와 함께 mariabackup
명령을 사용하여 백업에서 데이터를 복원할 수 있습니다.
-
--copy-back
을 사용하면 원본 백업 파일을 유지할 수 있습니다. -
--move-back
은 백업 파일을 데이터 디렉터리로 이동하고 원래 백업 파일을 제거합니다.
Mariabackup 유틸리티를 사용하여 데이터를 복원하려면 다음 절차를 따르십시오.
사전 요구 사항
mariadb
서비스가 실행되고 있지 않은지 확인합니다.# systemctl stop mariadb.service
- 데이터 디렉터리가 비어 있는지 확인합니다.
-
Mariabackup 사용자는
RELOAD
,LOCK TABLES
및REPLICATION CLIENT
권한이 있어야 합니다.
절차
mariabackup
명령을 실행합니다.데이터를 복원하고 원본 백업 파일을 유지하려면
--copy-back
옵션을 사용합니다.$ mariabackup --copy-back --target-dir=/var/mariadb/backup/
데이터를 복원하고 원본 백업 파일을 제거하려면
--move-back
옵션을 사용합니다.$ mariabackup --move-back --target-dir=/var/mariadb/backup/
파일 권한을 수정합니다.
데이터베이스를 복원할 때 Mariabackup 은 백업의 파일 및 디렉토리 권한을 보존합니다. 그러나 Mariabackup 은 파일을 디스크에 쓰는 사용자 및 그룹으로 데이터베이스를 복원합니다. 백업을 복원한 후 일반적으로 MariaDB 서버의 사용자 및 그룹과 일치하도록 데이터 디렉터리의 소유자(일반적으로
mysql
)를 조정해야 할 수 있습니다.예를 들어 파일의 소유권을
mysql
사용자 및 그룹으로 재귀적으로 변경하려면 다음을 수행합니다.# chown -R mysql:mysql /var/lib/mysql/
mariadb
서비스를 시작합니다.# systemctl start mariadb.service
추가 리소스
7.2.6.4. 파일 시스템 백업 수행
MariaDB 데이터 파일의 파일 시스템 백업을 생성하려면 MariaDB 데이터 디렉터리의 콘텐츠를 백업 위치에 복사합니다.
현재 구성 또는 로그 파일도 백업하려면 다음 절차의 선택적 단계를 사용하십시오.
절차
mariadb
서비스를 중지합니다.# systemctl stop mariadb.service
필요한 위치에 데이터 파일을 복사합니다.
# cp -r /var/lib/mysql /backup-location
선택 사항: 구성 파일을 필요한 위치에 복사합니다.
# cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
선택 사항: 로그 파일을 필요한 위치에 복사합니다.
# cp /var/log/mariadb/* /backup-location/logs
mariadb
서비스를 시작합니다.# systemctl start mariadb.service
백업 위치에서
/var/lib/mysql
디렉터리에 백업 데이터를 로드할 때mysql:mysql
이/var/lib/mysql
에 있는 모든 데이터의 소유자인지 확인하십시오.# chown -R mysql:mysql /var/lib/mysql
7.2.6.5. 백업 솔루션으로의 복제
복제는 소스 서버를 위한 대체 백업 솔루션입니다. 소스 서버에서 복제본 서버에 복제하는 경우 소스에 영향을 주지 않고 복제본에서 백업을 실행할 수 있습니다. 복제본을 종료하는 동안 계속 소스를 실행하고 복제본에서 데이터를 백업할 수 있습니다.
복제 자체는 충분한 백업 솔루션이 아닙니다. 복제는 하드웨어 장애로부터 소스 서버를 보호하지만 데이터 손실에 대한 보호는 보장하지 않습니다. 이 메서드와 함께 복제본에서 다른 백업 솔루션을 사용하는 것이 좋습니다.
7.2.7. MariaDB 10.3으로 마이그레이션
RHEL 7에는 MySQL 데이터베이스 제품군의 서버 기본 구현으로 MariaDB 5.5 가 포함되어 있습니다. MariaDB 데이터베이스 서버의 이후 버전은 RHEL 7용 Software Collections로 사용할 수 있습니다. RHEL 8에서는 MariaDB 10.3,MariaDB 10.5,MariaDB 10.11 및 MySQL 8.0 을 제공합니다.
이 부분에서는 RHEL 7 또는 Red Hat Software Collections 버전의 MariaDB에서 MariaDB 10.3 로의 마이그레이션에 대해 설명합니다.
MariaDB 10.3 에서 RHEL 8 내에서 MariaDB 10.5 로 마이그레이션하려면 대신 MariaDB 10.3에서 MariaDB 10.5로 업그레이드 를 참조하십시오.
RHEL 8에서 MariaDB 10.5에서 MariaDB 10.11로 마이그레이션하려면 MariaDB 10.5에서 MariaDB 10.11로 업그레이드 를 참조하십시오.
7.2.7.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 대신 기본 스토리지 엔진으로 사용됩니다.
-
새로운
mariadb-connector-c 패키지에서
는 MySQL 및 MariaDB의 공통 클라이언트 라이브러리를 제공합니다. 이 라이브러리는 MySQL 및 MariaDB 데이터베이스 서버의 모든 버전에서 사용할 수 있습니다. 결과적으로 사용자는 Red Hat Enterprise Linux 8과 함께 배포된 MySQL 및 MariaDB 서버에 애플리케이션 빌드를 연결할 수 있습니다.
MariaDB 5.5 에서 MariaDB 10.3 으로 마이그레이션하려면 여러 구성 변경을 수행해야 합니다.
7.2.7.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 로 마이그레이션 및 필요한 구성 변경 사항은 다음 문서에 설명되어 있습니다.
- Red Hat Software Collections 문서에서 MariaDB 10.1로 마이그레이션.
- Red Hat Software Collections 문서에서 MariaDB 10.2로 마이그레이션.
- Red Hat Software Collections 문서에서 MariaDB 10.3으로 마이그레이션.
MariaDB 5.5에서 MariaDB 10.3 으로 직접 마이그레이션할 수도 있지만 위의 마이그레이션 문서에 설명된 차이점에 필요한 모든 구성 변경 사항을 수행해야 합니다.
7.2.7.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 데이터베이스에 저장된 모든 데이터를 백업합니다.
절차
mariadb-server
패키지가 RHEL 8 시스템에 설치되어 있는지 확인합니다.# yum install mariadb-server
데이터를 복사할 때
mariadb
서비스가 소스 및 대상 시스템에서 실행되지 않는지 확인합니다.# systemctl stop mariadb.service
-
소스 위치의 데이터를 RHEL 8 대상 시스템의
/var/lib/mysql/
디렉터리로 복사합니다. 대상 시스템에서 복사된 파일에 대한 적절한 권한 및 SELinux 컨텍스트를 설정합니다.
# restorecon -vr /var/lib/mysql
대상 시스템에서 MariaDB 서버를 시작합니다.
# systemctl start mariadb.service
mysql_upgrade
명령을 실행하여 내부 테이블을 확인하고 복구합니다.$ mysql_upgrade
-
업그레이드가 완료되면
/etc/my.cnf.d/
디렉터리에 있는 모든 구성 파일에 MariaDB 10.3 에 유효한 옵션만 포함되어 있는지 확인합니다.
즉각적 업그레이드와 관련하여 특정 위험 및 알려진 문제가 있습니다. 예를 들어 일부 쿼리가 작동하지 않거나 업그레이드 전과 다른 순서로 실행될 수 있습니다. 이러한 위험 및 문제에 대한 자세한 내용과 인플레이스 업그레이드에 대한 일반적인 정보는 MariaDB 10.3 릴리스 노트 를 참조하십시오.
7.2.8. MariaDB 10.3에서 MariaDB 10.5로 업그레이드
이 부분에서는 RHEL 8 내의 MariaDB 10.3 에서 MariaDB 10.5 로의 마이그레이션에 대해 설명합니다.
7.2.8.1. MariaDB 10.3과 MariaDB 10.5의 주요 차이점
MariaDB 10.3과 MariaDB 10.5 간의 중요한 변경 사항은 다음과 같습니다.
-
이제 MariaDB 에서 기본적으로
unix_socket
인증 플러그인을 사용합니다. 플러그인을 사용하면 로컬 UNIX 소켓 파일을 통해 MariaDB 에 연결할 때 운영 체제 인증 정보를 사용할 수 있습니다. -
MariaDB
는 바이너리라는mariadb-*
와mariadb-*
바이너리를 가리키는mysql*
심볼릭 링크를 추가합니다. 예를 들어mysqladmin
,mysqlaccess
및mysqlshow
symlink는mariadb-admin
,mariadb-access
및mariadb-show
바이너리를 각각 가리킵니다. -
SUPER
권한이 각 사용자 역할에 맞게 여러 권한으로 분할되었습니다. 결과적으로 특정 문이 필수 권한이 변경되었습니다. -
병렬 복제에서
slave_parallel_mode
는 이제 기본적으로 fake로설정됩니다
. -
InnoDB 스토리지 엔진에서 다음 변수의 기본값이 변경되었습니다.
innodb_adaptive_hash_index
는OFF
로,innodb_checksum_algorithm에서
로 변경되었습니다.full_
crc32 MariaDB 는 이전에 사용된
읽기라인
라이브러리 대신 MariaDB 명령 기록(.mysql_history
파일)을 관리하는 기본 소프트웨어의libedit
구현을 사용합니다. 이 변경 사항은.mysql_history
파일을 직접 사용하는 사용자에게 영향을 미칩니다..mysql_history
는 MariaDB 또는 MySQL 애플리케이션에서 관리하는 파일이며 사용자는 파일에서 직접 작업해서는 안 됩니다. 사람이 읽을 수 있는 모양은 무의미합니다.참고보안을 강화하기 위해 기록 파일을 유지하지 않는 것이 좋습니다. 명령 기록 기록을 비활성화하려면 다음을 수행합니다.
-
있는 경우
.mysql_history
파일을 제거합니다. 다음 방법 중 하나를 사용합니다.
-
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 루트
도우미 바이너리를 사용하여 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.8.2. RHEL 8 버전의 MariaDB 10.3에서 MariaDB 10.5로 업그레이드
이 절차에서는 yum
및 mariadb
모듈 스트림으로의 업그레이드를 설명합니다.
-upgrade
유틸리티를 사용하여 mariadb:10.3
모듈 스트림에서 mariadb:10.5
mariadb-upgrade
유틸리티는 mariadb-server 패키지의 종속성으로 설치된
하위 패키지에서 제공합니다.
mariadb-server-
utils
사전 요구 사항
- 업그레이드를 수행하기 전에 MariaDB 데이터베이스에 저장된 모든 데이터를 백업합니다.
절차
MariaDB 서버를 중지합니다.
# systemctl stop mariadb.service
다음 명령을 실행하여 시스템이 이후 스트림으로 전환할 준비가 되었는지 확인합니다.
# yum distro-sync
이 명령은 필요한 작업 없음 메시지로 끝나야 합니다. 완료되었습니다! 자세한 내용은 다음 스트림으로 전환을 참조하십시오.
시스템에서
mariadb
모듈을 재설정합니다.# yum module reset mariadb
새
mariadb:10.5
모듈 스트림을 활성화합니다.# yum module enable mariadb:10.5
설치된 패키지를 동기화하여 스트림 간 변경을 수행합니다.
# yum distro-sync
그러면 설치된 모든 MariaDB 패키지가 업데이트됩니다.
-
/etc/my.cnf.d/
에 있는 옵션 파일이 MariaDB 10.5 에 유효한 옵션만 포함하도록 구성을 조정합니다. 자세한 내용은 MariaDB 10.4 및 MariaDB 10.5 의 업스트림 문서를 참조하십시오. MariaDB 서버를 시작합니다.
독립 실행형으로 데이터베이스를 업그레이드하는 경우:
# systemctl start mariadb.service
Galera 클러스터 노드를 업그레이드하는 경우 다음을 수행합니다.
# galera_new_cluster
mariadb
서비스가 자동으로 시작됩니다.
mariadb-upgrade 유틸리티를 실행하여 내부 테이블을 확인하고 복구합니다.
독립 실행형으로 데이터베이스를 업그레이드하는 경우:
# mariadb-upgrade
Galera 클러스터 노드를 업그레이드하는 경우 다음을 수행합니다.
# mariadb-upgrade --skip-write-binlog
즉각적 업그레이드와 관련하여 특정 위험 및 알려진 문제가 있습니다. 예를 들어 일부 쿼리가 작동하지 않거나 업그레이드 전과 다른 순서로 실행될 수 있습니다. 이러한 위험 및 문제에 대한 자세한 내용과 인플레이스 업그레이드에 대한 일반적인 정보는 MariaDB 10.5 릴리스 노트 를 참조하십시오.
7.2.9. MariaDB 10.5에서 MariaDB 10.11로 업그레이드
이 부분에서는 RHEL 8 내의 MariaDB 10.5에서 MariaDB 10.11로의 마이그레이션을 설명합니다.
7.2.9.1. MariaDB 10.5와 MariaDB 10.11의 주요 차이점
MariaDB 10.5 와 MariaDB 10.11 간의 중요한 변경 사항은 다음과 같습니다.
-
새로운
sys_schema
기능은 데이터베이스 사용량에 대한 정보를 제공하는 뷰, 함수 및 프로시저의 컬렉션입니다. -
CREATE Cryostat
, Cryostat ,RENAME
Cryostat ,DROP DATABASE
, DROP DATABASE 및 관련 DDL(Data Definition Language) 문이 원자적입니다.문을 완전히 완료해야 합니다. 그렇지 않으면 변경 사항이 취소됩니다.
DROP
Cryostat를 사용하여 여러 테이블을 삭제할 때 각 드롭다운만 전체 테이블 목록이 아닌 atomic입니다. -
새로운
GRANT … TO PUBLIC
권한을 사용할 수 있습니다. -
이제
SUPER
및READ 전용
권한이 분리되어 있습니다. -
이제 새로운
UUID
데이터베이스 데이터 유형에 범용 고유 식별자를 저장할 수 있습니다. - MariaDB 는 이제 SSL(Secure Socket Layer) 프로토콜 버전 3을 지원합니다.
- 이제 MariaDB 서버를 시작하려면 올바르게 구성된 SSL이 필요합니다. 이전에는 MariaDB 에서 SSL을 자동으로 비활성화하고 SSL을 잘못 구성하는 경우 비보안 연결을 사용했습니다.
-
MariaDB 는 이제
natural_sort_key()
함수를 통해 자연 정렬 순서를 지원합니다. -
이제 임의의 텍스트 형식에 새로운
SFORMAT
함수를 사용할 수 있습니다. -
utf8
문자 세트(및 관련 데이터 정렬)는 기본적으로utf8mb3
의 별칭입니다. - MariaDB 는 UCA( Unicode Collation Algorithm) 14 데이터 정렬을 지원합니다.
-
MariaDB 의
systemd
소켓 활성화 파일은 이제/usr/share/
디렉토리에서 사용할 수 있습니다. 이는 업스트림과 달리 RHEL의 기본 구성의 일부가 아닙니다. -
오류 메시지에
MySQL
대신MariaDB
문자열이 포함됩니다. - 이제 중국어로 오류 메시지를 사용할 수 있습니다.
- 기본 logrotate 파일이 크게 변경되었습니다. MariaDB 10.11 로 마이그레이션하기 전에 구성을 검토합니다.
-
MariaDB 및 MySQL 클라이언트의 경우 명령줄에 지정된 연결 속성(예:
--port=3306
)은 이제tcp
,소켓
,파이프
또는메모리
와 같은 클라이언트와 서버 간의 프로토콜 통신 유형을 강제 적용합니다. 이전에는 MariaDB 클라이언트가 UNIX 소켓을 통해 연결된 경우 지정된 포트가 무시되었습니다.
7.2.9.2. MariaDB 10.5의 RHEL 8 버전에서 MariaDB 10.11로 업그레이드
다음 절차에서는 yum
및 mariadb-upgrade
유틸리티를 사용하여 mariadb:10.11
모듈 스트림으로 mariadb:10.5
모듈 스트림으로 업그레이드하는 방법을 설명합니다.
mariadb-upgrade
유틸리티는 mariadb-server 패키지의 종속성으로 설치된
하위 패키지에서 제공합니다.
mariadb-server-
utils
사전 요구 사항
- 업그레이드를 수행하기 전에 MariaDB 데이터베이스에 저장된 모든 데이터를 백업합니다.
절차
MariaDB 서버를 중지합니다.
# systemctl stop mariadb.service
다음 명령을 실행하여 시스템이 이후 스트림으로 전환할 준비가 되었는지 확인합니다.
# yum distro-sync
이 명령은 필요한 작업 없음 메시지로 끝나야 합니다. 완료되었습니다! 자세한 내용은 다음 스트림으로 전환을 참조하십시오.
시스템에서
mariadb
모듈을 재설정합니다.# yum module reset mariadb
새
mariadb:10.11
모듈 스트림을 활성화합니다.# yum module enable mariadb:10.11
설치된 패키지를 동기화하여 스트림 간 변경을 수행합니다.
# yum distro-sync
그러면 설치된 모든 MariaDB 패키지가 업데이트됩니다.
-
/etc/my.cnf.d/
에 있는 옵션 파일이 MariaDB 10.11 에 유효한 옵션만 포함하도록 구성을 조정합니다. 자세한 내용은 MariaDB 10.6 및 MariaDB 10.11 에 대한 업스트림 문서를 참조하십시오. MariaDB 서버를 시작합니다.
독립 실행형으로 데이터베이스를 업그레이드하는 경우:
# systemctl start mariadb.service
Galera 클러스터 노드를 업그레이드하는 경우 다음을 수행합니다.
# galera_new_cluster
mariadb
서비스가 자동으로 시작됩니다.
mariadb-upgrade 유틸리티를 실행하여 내부 테이블을 확인하고 복구합니다.
독립 실행형으로 데이터베이스를 업그레이드하는 경우:
# mariadb-upgrade
Galera 클러스터 노드를 업그레이드하는 경우 다음을 수행합니다.
# mariadb-upgrade --skip-write-binlog
즉각적 업그레이드와 관련하여 특정 위험 및 알려진 문제가 있습니다. 예를 들어 일부 쿼리가 작동하지 않거나 업그레이드 전과 다른 순서로 실행될 수 있습니다. 이러한 위험 및 문제에 대한 자세한 내용과 인플레이스 업그레이드에 대한 일반적인 정보는 MariaDB 10.11 릴리스 노트 를 참조하십시오.
7.2.10. Galera를 사용하여 MariaDB 복제
이 섹션에서는 Red Hat Enterprise Linux 8에서 Galera 솔루션을 사용하여 MariaDB 데이터베이스를 복제하는 방법을 설명합니다.
7.2.10.1. MariaDB Galera 클러스터 소개
Galera 복제는 여러 MariaDB 서버로 구성된 동기식 멀티 소스 MariaDB Galera 클러스터 생성을 기반으로 합니다. 일반적으로 복제본이 읽기 전용인 기존의 기본/복제 설정과 달리 MariaDB Galera 클러스터의 노드는 모두 쓸 수 있습니다.
Galera 복제와 MariaDB 데이터베이스 간의 인터페이스는 쓰기 세트 복제 API(wsrep API)로 정의됩니다.
MariaDB Galera 클러스터의 주요 기능은 다음과 같습니다.
- 동기 복제
- 액티브-액티브 멀티 소스 토폴로지
- 클러스터 노드에 읽기 및 쓰기
- 자동 멤버십 제어, 클러스터에서 실패한 노드 삭제
- 자동 노드 결합
- 행 수준에서 병렬 복제
- 직접 클라이언트 연결: 사용자가 클러스터 노드에 로그온하고 복제가 실행되는 동안 노드에서 직접 작업할 수 있습니다.
동기 복제는 서버와 관련된 쓰기 집합을 클러스터의 모든 노드에 브로드캐스트하여 커밋 시 트랜잭션을 복제함을 의미합니다. 클라이언트(사용자 애플리케이션)는 기본 MariaDB 와 유사한 DBMS(데이터베이스 관리 시스템)에 직접 연결됩니다.
동기 복제를 사용하면 클러스터의 한 노드에서 동시에 발생한 변경 사항이 클러스터의 다른 노드에서 동시에 수행됩니다.
따라서 동기 복제는 비동기 복제에 비해 다음과 같은 이점이 있습니다.
- 특정 클러스터 노드 간의 변경 사항을 전파하는 데 지연 없음
- 모든 클러스터 노드는 항상 일관성이 유지됩니다.
- 클러스터 노드 중 하나가 충돌하면 최신 변경 사항이 손실되지 않습니다.
- 모든 클러스터 노드의 트랜잭션이 병렬로 실행됩니다.
- 전체 클러스터의 원인
7.2.10.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 유틸리티는 split- Cryostat 시나리오에서 투표하는 클러스터 구성원으로 사용할 수 있습니다. 그러나 Galera Arbitrator 는 실제 복제에 참여할 수 없습니다.
-
Galera Systemd 서비스 및 Galera Arbitrator 유틸리티 배포에 사용되는 Galera 래퍼 스크립트 입니다. MariaDB 10.3,MariaDB 10.5 및 MariaDB 10.11 에는 각각
/usr/lib/systemd/system/garbd.service
및/usr/sbin/garbd-wrapper
파일의garbd
systemd 서비스의 Red Hat 버전과 래퍼 스크립트가 포함되어 있습니다.RHEL 8.6 이후 RHEL과 함께 배포된 MariaDB 는
/usr/share/doc/galera/garb-systemd
및/usr/share/doc/galera/garbd.service
에 있는 이러한 파일의 업스트림 버전도 제공합니다.
7.2.10.3. MariaDB Galera 클러스터 배포
사전 요구 사항
- 클러스터의 모든 노드에는 TLS가 설정되어 있습니다.
모든 노드의 모든 인증서에는
Extended Key Usage
필드가 다음과 같이 설정되어 있어야 합니다.TLS Web Server Authentication, TLS Web Client Authentication
프로세스
mariadb
모듈에서 스트림(버전)을 선택하고galera
프로필을 지정하여 MariaDB Galera 클러스터 패키지를 설치합니다. 예를 들면 다음과 같습니다.# yum module install mariadb:10.3/galera
결과적으로 다음 패키지가 설치됩니다.
-
mariadb-server-galera
-
mariadb-server
Galera
mariadb-server-galera
패키지는mariadb-server
및galera
패키지를 종속성으로 가져옵니다.MariaDB Galera Cluster 를 구축하기 위해 설치해야 하는 패키지에 대한 자세한 내용은 MariaDB 클러스터를 빌드하기 위한 구성 요소를 참조하십시오.
-
시스템을 클러스터에 처음 추가하기 전에 MariaDB 서버 복제 구성을 업데이트합니다. 기본 구성은
/etc/my.cnf.d/galera.cnf
파일에 배포됩니다. MariaDB Galera Cluster 를 배포하기 전에 다음 문자열로 시작하도록 모든 노드의/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 를 참조하십시오.
-
/etc/my.cnf.d/galera.cnf
구성 파일에서wsrep
_on=1 TLS 키 및 인증서를 사용하여 Galera 구성 파일에
wsrep_provider_options
변수를 추가합니다. 예를 들면 다음과 같습니다.wsrep_provider_options="socket.ssl_cert=/etc/pki/tls/certs/source.crt;socket.ssl_key=/etc/pki/tls/private/source.key;socket.ssl_ca=/etc/pki/tls/certs/ca.crt”
해당 노드에서 다음 래퍼를 실행하여 새 클러스터의 첫 번째 노드를 부트스트랩합니다.
# galera_new_cluster
이 래퍼를 사용하면 MariaDB 서버 데몬(
mysqld
)이--wsrep-new-cluster
옵션으로 실행됩니다. 이 옵션은 연결할 기존 클러스터가 없다는 정보를 제공합니다. 따라서 노드는 새 클러스터를 식별하기 위해 새 UUID를 생성합니다.참고mariadb
서비스는 여러 MariaDB 서버 프로세스와 상호 작용하는 systemd 방법을 지원합니다. 따라서 실행 중인 여러 MariaDB 서버가 있는 경우 인스턴스 이름을 접미사로 지정하여 특정 인스턴스를 부트스트랩할 수 있습니다.# galera_new_cluster mariadb@node1
각 노드에서 다음 명령을 실행하여 다른 노드를 클러스터에 연결합니다.
# systemctl start mariadb.service
결과적으로 노드는 클러스터에 연결하고 클러스터 상태와 자체적으로 동기화됩니다.
추가 리소스
7.2.10.4. MariaDB Galera 클러스터에 새 노드 추가
MariaDB Galera Cluster 에 새 노드를 추가하려면 다음 절차를 사용하십시오.
이 절차를 사용하여 기존 노드를 다시 연결할 수도 있습니다.
프로세스
특정 노드에서
/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.10.5. MariaDB Galera 클러스터 다시 시작
모든 노드를 동시에 종료하면 클러스터를 중지하고 실행 중인 클러스터가 더 이상 존재하지 않습니다. 그러나 클러스터의 데이터는 여전히 존재합니다.
클러스터를 다시 시작하려면 MariaDB Galera Cluster 구성에 설명된 대로 첫 번째 노드를 부트스트랩합니다.
클러스터가 부트스트랩되지 않고 첫 번째 노드의 mariadb
가 systemctl start mariadb.service
명령으로만 시작되면 노드는 /etc/my.cnf.d/galera.cnf
파일의 wsrep_cluster_address
옵션에 나열된 노드 중 하나에 연결을 시도합니다. 현재 실행 중인 노드가 없으면 재시작이 실패합니다.
추가 리소스
7.2.11. MariaDB 클라이언트 애플리케이션 개발
Red Hat은 MariaDB 클라이언트 라이브러리에 대해 MariaDB 클라이언트 애플리케이션을 개발하는 것이 좋습니다.
MariaDB 클라이언트 라이브러리에 대해 애플리케이션을 빌드하는 데 필요한 개발 파일 및 프로그램은 mariadb-connector-c-devel
패키지에서 제공합니다.
직접 라이브러리 이름을 사용하는 대신 mariadb-connector-c-devel
패키지에 배포되는 mariadb_config
프로그램을 사용합니다. 이 프로그램을 통해 올바른 빌드 플래그가 반환됩니다.
7.3. MySQL 사용
MySQL 서버는 빠르고 강력한 오픈 소스 데이터베이스 서버입니다. MySQL 은 데이터를 구조화된 정보로 변환하고 데이터에 액세스하기 위한 SQL 인터페이스를 제공하는 관계형 데이터베이스입니다. 여러 스토리지 엔진 및 플러그인뿐만 아니라 GIS(Gyge Information System) 및 JSON(JavaScript Object Notation) 기능이 포함되어 있습니다.
RHEL 시스템에 MySQL 을 설치하고 구성하는 방법, MySQL 데이터를 백업하는 방법, 이전 MySQL 버전에서 마이그레이션하는 방법, MySQL 을 복제하는 방법을 알아봅니다.
7.3.1. MySQL 설치
RHEL 8에서 MySQL 8.0 서버는 mysql:8.0
모듈 스트림으로 사용할 수 있습니다.
충돌하는 RPM 패키지로 인해 RHEL 8에서 MySQL 및 MariaDB 데이터베이스 서버를 병렬로 설치할 수 없습니다. 컨테이너에서 병렬로 MySQL 및 MariaDB 데이터베이스 서버를 사용할 수 있습니다. 컨테이너에서 여러 MySQL 및 MariaDB 버전 실행을 참조하십시오.
MySQL 을 설치하려면 다음 절차를 사용하십시오.
절차
mysql
모듈에서8.0
스트림(버전)을 선택하고server
프로필을 지정하여 MySQL 서버 패키지를 설치합니다.# yum module install mysql:8.0/server
mysqld
서비스를 시작합니다.# systemctl start mysqld.service
부팅 시
mysqld
서비스가 시작되도록 활성화합니다.# systemctl enable mysqld.service
권장 사항: MySQL 을 설치할 때 보안을 강화하려면 다음 명령을 실행합니다.
$ mysql_secure_installation
명령은 완전히 대화형 스크립트를 시작하여 프로세스의 각 단계에 대한 메시지를 표시합니다. 이 스크립트를 사용하면 다음과 같은 방법으로 보안을 강화할 수 있습니다.
- root 계정의 암호 설정
- 익명 사용자 제거
- 원격 root 로그인 허용 (로컬 호스트 내부)
7.3.2. 컨테이너에서 여러 MySQL 및 MariaDB 버전 실행
동일한 호스트에서 MySQL 과 MariaDB 를 모두 실행하려면 충돌하는 RPM 패키지로 인해 이러한 데이터베이스 서버를 병렬로 설치할 수 없기 때문에 컨테이너에서 실행합니다.
이 절차에서는 예를 들어 MySQL 8.0 및 MariaDB 10.5 가 포함되어 있지만 Red Hat Ecosystem Catalog에서 사용할 수 있는 MySQL 또는 MariaDB 컨테이너 버전을 사용할 수 있습니다.
사전 요구 사항
-
container-tools
모듈이 설치되어 있습니다.
절차
Red Hat 고객 포털 계정을 사용하여
registry.redhat.io
레지스트리에 인증합니다.# podman login registry.redhat.io
컨테이너 레지스트리에 이미 로그인한 경우 이 단계를 건너뜁니다.
컨테이너에서 MySQL 8.0 을 실행합니다.
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mysql_root_password> -p <host_port_1>:3306 rhel8/mysql-80
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
컨테이너에서 MariaDB 10.5 를 실행합니다.
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_2>:3306 rhel8/mariadb-105
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
컨테이너에서 MariaDB 10.11 을 실행합니다.
$ podman run -d --name <container_name> -e MYSQL_ROOT_PASSWORD=<mariadb_root_password> -p <host_port_3>:3306 rhel8/mariadb-1011
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
참고두 데이터베이스 서버의 컨테이너 이름과 호스트 포트는 달라야 합니다.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 호스트 포트를 엽니다.
# firewall-cmd --permanent --add-port={<host_port>/tcp,<host_port>/tcp,...} # firewall-cmd --reload
검증
실행 중인 컨테이너에 대한 정보를 표시합니다.
$ podman ps
데이터베이스 서버에 연결하고 root로 로그인합니다.
# mysql -u root -p -h localhost -P <host_port> --protocol tcp
7.3.3. MySQL 구성
네트워킹을 위해 MySQL 서버를 구성하려면 다음 절차를 사용하십시오.
절차
/etc/my.cnf.d/mysql-server.cnf
파일의[mysqld]
섹션을 편집합니다. 다음 구성 지시문을 설정할 수 있습니다.bind-address
- 서버가 수신 대기하는 주소입니다. 가능한 옵션은 다음과 같습니다.- 호스트 이름
- IPv4 주소
- IPv6 주소
skip-networking
- 서버가 TCP/IP 연결을 수신하는지 여부를 제어합니다. 가능한 값은 다음과 같습니다.- 0 - 모든 클라이언트 수신 대기
- 1 - 로컬 클라이언트만 수신 대기
-
포트
- MySQL 이 TCP/IP 연결을 수신 대기하는 포트입니다.
mysqld
서비스를 다시 시작합니다.# systemctl restart mysqld.service
7.3.4. MySQL 서버에서 TLS 암호화 설정
기본적으로 MySQL 은 암호화되지 않은 연결을 사용합니다. 보안 연결의 경우 MySQL 서버에서 TLS 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성합니다.
7.3.4.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 문서를 참조하십시오.
-
서버의 개인 키:
절차
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/
MySQL 서버가 파일을 읽을 수 있도록 하는 CA 및 서버 인증서에 대한 권한을 설정합니다.
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
인증서는 보안 연결을 설정하기 전에 통신의 일부이므로 모든 클라이언트는 인증 없이 검색할 수 있습니다. 따라서 CA 및 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.
서버의 개인 키를
/etc/pki/tls/private/
디렉터리에 저장합니다.# mv <path>/server.example.com.key.pem /etc/pki/tls/private/
서버의 개인 키에 보안 권한을 설정합니다.
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
권한이 없는 사용자가 개인 키에 액세스할 수 있는 경우 MySQL 서버에 대한 연결이 더 이상 안전하지 않습니다.
SELinux 컨텍스트를 복원하십시오.
# restorecon -Rv /etc/pki/tls/
7.3.4.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) 필드는 서버의 호스트 이름과 일치합니다.
절차
/etc/my.cnf.d/mysql-server-tls.cnf
파일을 만듭니다.다음 콘텐츠를 추가하여 개인 키, 서버 및 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
CRL(Certificate Revocation List)이 있는 경우 이를 사용하도록 MySQL 서버를 구성합니다.
ssl_crl = /etc/pki/tls/certs/example.crl.pem
선택 사항: 암호화 없이 연결 시도를 거부합니다. 이 기능을 활성화하려면 다음을 추가합니다.
require_secure_transport = on
선택 사항: 서버가 지원해야 하는 TLS 버전을 설정합니다. 예를 들어 TLS 1.2 및 TLS 1.3을 지원하려면 다음을 추가합니다.
tls_version = TLSv1.2,TLSv1.3
기본적으로 서버는 TLS 1.1, TLS 1.2 및 TLS 1.3을 지원합니다.
mysqld
서비스를 다시 시작합니다.# systemctl restart mysqld.service
검증
문제 해결을 간소화하려면 TLS 암호화를 사용하도록 로컬 클라이언트를 구성하기 전에 MySQL 서버에서 다음 단계를 수행합니다.
이제 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 | +---------------+------------------------+
특정 TLS 버전만 지원하도록 MySQL 서버를 구성한 경우
tls_version
변수를 표시합니다.# mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';" +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tls_version | TLSv1.2,TLSv1.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.4.3. 특정 사용자 계정에 대해 TLS 암호화 연결 필요
중요한 데이터에 액세스할 수 있는 사용자는 항상 TLS 암호화 연결을 사용하여 네트워크를 통해 암호화되지 않은 데이터를 전송하지 않도록 해야 합니다.
모든 연결(에서 required_secure_transport =)에 보안 전송이 필요한
서버에서 를 구성할 수 없는 경우 TLS 암호화가 필요하도록 개별 사용자 계정을 구성합니다.
사전 요구 사항
- MySQL 서버에는 TLS 지원이 활성화되어 있습니다.
- 보안 전송을 요구하도록 구성하는 사용자가 있습니다.
- CA 인증서는 클라이언트에 저장됩니다.
절차
관리 사용자로 MySQL 서버에 연결합니다.
# mysql -u root -p -h server.example.com
관리 사용자에게 원격으로 서버에 액세스할 수 있는 권한이 없는 경우 MySQL 서버에서 명령을 수행하고
localhost
에 연결합니다.REQUIRE SSL
절을 사용하여 사용자가 TLS 암호화 연결을 사용하여 연결해야 함을 적용합니다.MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
검증
TLS 암호화를 사용하여 서버에
예제
사용자로 연결합니다.# mysql -u example -p -h server.example.com ... MySQL [(none)]>
오류가 표시되지 않고 대화형 MySQL 콘솔에 액세스할 수 있는 경우 TLS와의 연결에 성공합니다.
기본적으로 클라이언트는 서버에서 제공하는 경우 TLS 암호화를 자동으로 사용합니다. 따라서
--ssl-ca=ca.crt.pem
및--ssl-mode=VERIFY_IDENTITY
옵션은 필요하지 않지만 이러한 옵션을 사용하여 클라이언트는 서버 ID를 확인하므로 보안을 개선합니다.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.5. MySQL 클라이언트에서 CA 인증서 검증으로 TLS 암호화 글로벌 활성화
MySQL 서버가 TLS 암호화를 지원하는 경우 보안 연결만 설정하고 서버 인증서를 확인하도록 클라이언트를 구성합니다. 다음 절차에서는 서버에 있는 모든 사용자에 대해 TLS 지원을 활성화하는 방법을 설명합니다.
7.3.5.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.6. MySQL 데이터 백업
MySQL 데이터베이스에서 데이터를 백업하는 두 가지 주요 방법이 있습니다.
- 논리적 백업
논리적 백업은 데이터를 복원하는 데 필요한 SQL 문으로 구성됩니다. 이러한 유형의 백업은 일반 텍스트 파일로 정보와 레코드를 내보냅니다.
물리적 백업보다 논리적 백업의 주요 장점은 이식성과 유연성입니다. 데이터는 물리적 백업에서 사용할 수 없는 다른 하드웨어 구성, MySQL 버전 또는 DBMS(데이터베이스 관리 시스템)에서 복원할 수 있습니다.
논리 백업은
mysqld.service
가 실행 중인 경우에만 수행할 수 있습니다. 논리적 백업에는 로그 및 구성 파일이 포함되지 않습니다.- 물리적 백업
물리적 백업은 콘텐츠를 저장하는 파일 및 디렉터리의 사본으로 구성됩니다.
물리적 백업은 논리적 백업과 비교하여 다음과 같은 이점이 있습니다.
- 출력이 더 작습니다.
- 백업은 크기가 작습니다.
- 백업 및 복원 속도가 빨라집니다.
백업에는 로그 및 구성 파일이 포함됩니다.
mysqld.service
가 실행 중이 아니거나 백업 중 변경되지 않도록 데이터베이스의 모든 테이블이 잠길 때 물리적 백업을 수행해야 합니다.
다음 MySQL 백업 접근법 중 하나를 사용하여 MySQL 데이터베이스에서 데이터를 백업할 수 있습니다.
-
mysqldump
를 사용한 논리적 백업 - 파일 시스템 백업
- 백업 솔루션으로의 복제
7.3.6.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.6.2. 파일 시스템 백업 수행
MySQL 데이터 파일의 파일 시스템 백업을 생성하려면 MySQL 데이터 디렉터리의 내용을 백업 위치에 복사합니다.
현재 구성 또는 로그 파일도 백업하려면 다음 절차의 선택적 단계를 사용하십시오.
절차
mysqld
서비스를 중지합니다.# systemctl stop mysqld.service
필요한 위치에 데이터 파일을 복사합니다.
# cp -r /var/lib/mysql /backup-location
선택 사항: 구성 파일을 필요한 위치에 복사합니다.
# cp -r /etc/my.cnf /etc/my.cnf.d /backup-location/configuration
선택 사항: 로그 파일을 필요한 위치에 복사합니다.
# cp /var/log/mysql/* /backup-location/logs
mysqld
서비스를 시작합니다.# systemctl start mysqld.service
백업 위치에서
/var/lib/mysql
디렉터리에 백업 데이터를 로드할 때mysql:mysql
이/var/lib/mysql
에 있는 모든 데이터의 소유자인지 확인하십시오.# chown -R mysql:mysql /var/lib/mysql
7.3.6.3. 백업 솔루션으로의 복제
복제는 소스 서버를 위한 대체 백업 솔루션입니다. 소스 서버에서 복제본 서버에 복제하는 경우 소스에 영향을 주지 않고 복제본에서 백업을 실행할 수 있습니다. 복제본을 종료하는 동안 계속 소스를 실행하고 복제본에서 데이터를 백업할 수 있습니다.
MySQL 데이터베이스를 복제하는 방법에 대한 지침은 MySQL 복제를 참조하십시오.
복제 자체는 충분한 백업 솔루션이 아닙니다. 복제는 하드웨어 장애로부터 소스 서버를 보호하지만 데이터 손실에 대한 보호는 보장하지 않습니다. 이 메서드와 함께 복제본에서 다른 백업 솔루션을 사용하는 것이 좋습니다.
추가 리소스
7.3.7. RHEL 8 버전의 MySQL 8.0으로 마이그레이션
RHEL 7에는 MariaDB 5.5 가 MySQL 데이터베이스 제품군에서 서버의 기본 구현으로 포함되어 있습니다. RHEL 7용 Red Hat Software Collections는 MySQL 8.0 과 여러 버전의 MariaDB 를 제공합니다. RHEL 8에서는 MySQL 8.0,MariaDB 10.3 및 MariaDB 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 데이터베이스에 저장된 모든 데이터를 백업합니다.
절차
mysql-server
패키지가 RHEL 8 시스템에 설치되었는지 확인합니다.# yum install mysql-server
데이터를 복사할 때
mysqld
서비스가 소스 및 대상 시스템에서 실행되고 있지 않은지 확인합니다.# systemctl stop mysqld.service
-
RHEL 7 소스 시스템의
/var/opt/rh/rh-mysql80/mysql/
디렉터리에서 RHEL 8 대상 시스템의/var/lib/mysql/
디렉터리에 데이터를 복사합니다. 대상 시스템에서 복사된 파일에 대한 적절한 권한 및 SELinux 컨텍스트를 설정합니다.
# restorecon -vr /var/lib/mysql
mysql:mysql
이/var/lib/mysql
디렉터리에 있는 모든 데이터의 소유자인지 확인합니다.# chown -R mysql:mysql /var/lib/mysql
대상 시스템에서 MySQL 서버를 시작합니다.
# systemctl start mysqld.service
참고: 이전 버전의 MySQL 에서는 내부 테이블을 확인하고 복구하는 데
mysql_upgrade
명령이 필요했습니다. 이제 서버를 시작할 때 자동으로 수행됩니다.
7.3.8. TLS 암호화를 사용하여 MySQL 복제
MySQL 은 기본에서 고급까지 복제를 위한 다양한 구성 옵션을 제공합니다. 이 섹션에서는 GTID(Global transaction Identifiers)를 사용하여 새로 설치된 MySQL 서버에서 MySQL 에서 복제하는 트랜잭션 기반 방법에 대해 설명합니다. GTID를 사용하면 트랜잭션 식별 및 일관성 확인이 간소화됩니다.
MySQL 에서 복제를 설정하려면 다음을 수행해야 합니다.
복제에 기존 MySQL 서버를 사용하려면 먼저 데이터를 동기화해야 합니다. 자세한 내용은 업스트림 문서 를 참조하십시오.
7.3.8.1. MySQL 소스 서버 구성
MySQL 소스 서버에 필요한 구성 옵션을 설정하여 TLS 프로토콜을 통해 데이터베이스 서버에서 수행된 모든 변경 사항을 올바르게 실행하고 복제할 수 있습니다.
사전 요구 사항
- 소스 서버가 설치되어 있어야 합니다.
소스 서버에는 TLS가 설정되어 있습니다.
중요소스 및 복제본 인증서는 동일한 인증 기관에서 서명해야 합니다.
절차
[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
복제에서 특정 데이터베이스를 제외하려면 이 옵션을 사용합니다.
mysqld
서비스를 다시 시작합니다.# systemctl restart mysqld.service
7.3.8.2. MySQL 복제본 서버 구성
MySQL 복제본 서버에 필요한 구성 옵션을 설정하여 복제를 성공적으로 수행할 수 있습니다.
사전 요구 사항
- 복제본 서버가 설치되어 있어야 합니다.
복제본 서버에는 TLS가 설정되어 있습니다.
중요소스 및 복제본 인증서는 동일한 인증 기관에서 서명해야 합니다.
절차
[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
복제에서 특정 데이터베이스를 제외하려면 이 옵션을 사용합니다.
mysqld
서비스를 다시 시작합니다.# systemctl restart mysqld.service
7.3.8.3. MySQL 소스 서버에서 복제 사용자 생성
복제 사용자를 생성하고 복제 트래픽에 필요한 이 사용자 권한을 부여해야 합니다. 다음 절차에서는 적절한 권한이 있는 복제 사용자를 만드는 방법을 설명합니다. 소스 서버에서만 이 단계를 실행합니다.
사전 요구 사항
- MySQL 소스 서버 구성에 설명된 대로 소스 서버가 설치되고 구성됩니다.
절차
복제 사용자를 생성합니다.
mysql> CREATE USER 'replication_user'@'replica_server_hostname' IDENTIFIED WITH mysql_native_password BY 'password';
사용자 복제 권한을 부여합니다.
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'replica_server_hostname';
MySQL 데이터베이스에서 부여 테이블을 다시 로드합니다.
mysql> FLUSH PRIVILEGES;
소스 서버를 읽기 전용 상태로 설정합니다.
mysql> SET @@GLOBAL.read_only = ON;
7.3.8.4. 소스 서버에 복제본 서버 연결
MySQL 복제본 서버에서는 소스 서버의 자격 증명과 주소를 구성해야 합니다. 다음 절차에 따라 복제본 서버를 구현합니다.
사전 요구 사항
- MySQL 소스 서버 구성에 설명된 대로 소스 서버가 설치되고 구성됩니다.
- MySQL 복제본 서버 구성에 설명된 대로 복제본 서버가 설치되고 구성됩니다.
- 복제 사용자를 생성했습니다. MySQL 소스 서버에서 복제 사용자 생성을 참조하십시오.
절차
복제본 서버를 읽기 전용 상태로 설정합니다.
mysql> SET @@GLOBAL.read_only = ON;
복제 소스를 구성합니다.
mysql> CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_hostname', SOURCE_USER='replication_user', SOURCE_PASSWORD='password', SOURCE_AUTO_POSITION=1, SOURCE_SSL=1, SOURCE_SSL_CA='path_to_ca_on_source', SOURCE_SSL_CAPATH='path_to_directory_with_certificates', SOURCE_SSL_CERT='path_to_source_certificate', SOURCE_SSL_KEY='path_to_source_key';
MySQL 복제본 서버에서 복제본 스레드를 시작합니다.
mysql> START REPLICA;
소스 및 복제본 서버 둘 다에서 읽기 전용 상태를 설정 해제합니다.
mysql> SET @@GLOBAL.read_only = OFF;
선택 사항: 디버깅 목적으로 복제본 서버의 상태를 검사합니다.
mysql> SHOW REPLICA STATUS\G;
참고복제본 서버가 시작하거나 연결하는 데 실패하면
SHOW MASTER STATUS
명령의 출력에 표시된 바이너리 로그 파일 위치에 따라 특정 이벤트 수를 건너뛸 수 있습니다. 예를 들어 정의된 위치에서 첫 번째 이벤트를 건너뛰십시오.mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
복제 서버를 다시 시작합니다.
선택 사항: 복제본 서버에서 복제본 스레드를 중지합니다.
mysql> STOP REPLICA;
7.3.8.5. MySQL 서버에서 복제 확인
여러 MySQL 서버에 복제를 구성한 후 작동하는지 확인해야 합니다.
절차
소스 서버에서 예제 데이터베이스를 생성합니다.
mysql> CREATE DATABASE test_db_name;
-
test_db_name
데이터베이스가 복제본 서버에 복제되는지 확인합니다. 소스 또는 복제본 서버 중 하나에서 다음 명령을 실행하여 MySQL 서버의 바이너리 로그 파일에 대한 상태 정보를 표시합니다.
mysql> SHOW MASTER STATUS;
소스에서 실행되는 트랜잭션에 대한 GTID 집합을 표시하는
Executed_Gtid_Set
열은 비어 있지 않아야 합니다.참고복제본 서버에서
SHOW REPLICA STATUS
를 사용할 때Executed_Gtid_Set
행에 동일한 GTIDs 세트가 표시됩니다.
7.3.8.5.1. 추가 리소스
7.3.9. MySQL 클라이언트 애플리케이션 개발
Red Hat은 MariaDB 클라이언트 라이브러리에 대해 MySQL 클라이언트 애플리케이션을 개발하는 것이 좋습니다. 클라이언트와 서버 간의 통신 프로토콜은 MariaDB 와 MySQL 간에 호환됩니다. 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 16 - RHEL 8.10 이후 사용 가능
설계상 동일한 모듈의 두 개 이상 버전(스트림)을 병렬로 설치할 수 없습니다. 따라서 postgresql
모듈에서 사용 가능한 스트림 중 하나만 선택해야 합니다. 컨테이너에서 다른 버전의 PostgreSQL 데이터베이스 서버를 사용할 수 있습니다. 컨테이너에서 여러 PostgreSQL 버전 실행을 참조하십시오.
PostgreSQL 을 설치하려면 다음 절차를 사용합니다.
절차
postgresql
모듈에서 스트림(버전)을 선택하고 서버 프로필을 지정하여 PostgreSQL 서버 패키지를 설치합니다. 예를 들면 다음과 같습니다.# yum module install postgresql:16/server
postgres
수퍼유저가 자동으로 생성됩니다.데이터베이스 클러스터를 초기화합니다.
# postgresql-setup --initdb
Red Hat은 기본
/var/lib/pgsql/data
디렉터리에 데이터를 저장하는 것이 좋습니다.postgresql
서비스를 시작합니다.# systemctl start postgresql.service
부팅 시 시작되도록
postgresql
서비스를 활성화합니다.# systemctl enable postgresql.service
모듈 스트림 사용에 대한 자세한 내용은 사용자 공간 구성 요소 설치, 관리 및 제거를 참조하십시오.
RHEL 8 내의 이전 postgresql
스트림에서 업그레이드하려면 이후 스트림으로 전환하고 RHEL 8 버전의 PostgreSQL으로 마이그레이션에 설명된 두 가지 절차를 모두 따르십시오.
7.4.2. 컨테이너에서 여러 PostgreSQL 버전 실행
동일한 호스트에서 다른 버전의 PostgreSQL 을 실행하려면 동일한 모듈의 여러 버전(스트림)을 병렬로 설치할 수 없기 때문에 컨테이너에서 실행합니다.
이 절차에는 PostgreSQL 13 및 PostgreSQL 15 가 포함되어 있지만 Red Hat Ecosystem Catalog에서 사용할 수 있는 PostgreSQL 컨테이너 버전을 사용할 수 있습니다.
사전 요구 사항
-
container-tools
모듈이 설치되어 있습니다.
절차
Red Hat 고객 포털 계정을 사용하여
registry.redhat.io
레지스트리에 인증합니다.# podman login registry.redhat.io
컨테이너 레지스트리에 이미 로그인한 경우 이 단계를 건너뜁니다.
컨테이너에서 PostgreSQL 13 을 실행합니다.
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_1>:5432 rhel8/postgresql-13
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
컨테이너에서 PostgreSQL 15 를 실행합니다.
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_2>:5432 rhel8/postgresql-15
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
컨테이너에서 PostgreSQL 16 을 실행합니다.
$ podman run -d --name <container_name> -e POSTGRESQL_USER=<user_name> -e POSTGRESQL_PASSWORD=<password> -e POSTGRESQL_DATABASE=<database_name> -p <host_port_3>:5432 rhel8/postgresql-16
이 컨테이너 이미지 사용에 대한 자세한 내용은 Red Hat Ecosystem Catalog 를 참조하십시오.
참고두 데이터베이스 서버의 컨테이너 이름과 호스트 포트는 달라야 합니다.
클라이언트가 네트워크의 데이터베이스 서버에 액세스할 수 있도록 하려면 방화벽에서 호스트 포트를 엽니다.
# firewall-cmd --permanent --add-port={<host_port_1>/tcp,<host_port_2>/tcp,...} # firewall-cmd --reload
검증
실행 중인 컨테이너에 대한 정보를 표시합니다.
$ podman ps
데이터베이스 서버에 연결하고 root로 로그인합니다.
# psql -u postgres -p -h localhost -P <host_port> --protocol tcp
7.4.3. 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 서버가 설치되어 있어야 합니다.
- 데이터베이스 클러스터가 초기화됩니다.
절차
사용자를 생성하려면 사용자의 암호를 설정하고 사용자에게
CREATEROLE
및CREATEDB
권한을 할당합니다.postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB;
mydbuser 를 사용자 이름으로 바꾸고 mypasswd 를 사용자 암호로 바꿉니다.
예 7.1. PostgreSQL 데이터베이스 초기화, 생성 및 연결
이 예제에서는 PostgreSQL 데이터베이스를 초기화하고, 일상적인 데이터베이스 관리 권한이 있는 데이터베이스 사용자를 생성하고, 관리 권한이 있는 데이터베이스 사용자를 통해 모든 시스템 계정에서 액세스할 수 있는 데이터베이스를 생성하는 방법을 보여줍니다.
PosgreSQL 서버를 설치합니다.
# yum module install postgresql:13/server
데이터베이스 클러스터를 초기화합니다.
# postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
암호 해시 알고리즘을
scram-sha-256
으로 설정합니다./var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경합니다.#password_encryption = md5 # md5 or scram-sha-256
다음으로 변경합니다.
password_encryption = scram-sha-256
/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
postgresql 서비스를 시작합니다.
# systemctl start postgresql.service
postgres
라는 시스템 사용자로 로그인합니다.# su - postgres
PostgreSQL 대화형 터미널을 시작합니다.
$ psql psql (13.7) Type "help" for help. postgres=#
선택 사항: 현재 데이터베이스 연결에 대한 정보를 얻습니다.
postgres=# \conninfo You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".
mydbuser
라는 사용자를 만들고,mydbuser
의 암호를 설정한 다음mydbuser
에게CREATEROLE
및CREATEDB
권한을 할당합니다.postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd' CREATEROLE CREATEDB; CREATE ROLE
이제
mydbuser
사용자가 일상적인 데이터베이스 관리 작업을 수행할 수 있습니다: 데이터베이스를 생성하고 사용자 인덱스를 관리합니다.\q
meta 명령을 사용하여 대화형 터미널에서 로그아웃합니다.postgres=# \q
postgres
사용자 세션에서 로그아웃합니다.$ logout
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=>
mydatabase
데이터베이스를 생성합니다.postgres=> CREATE DATABASE mydatabase; CREATE DATABASE postgres=>
세션에서 로그아웃합니다.
postgres=# \q
mydatabase에
mydbuser
로 연결합니다.# psql -U mydbuser -h 127.0.0.1 -d mydatabase Password for user mydbuser: psql (13.7) Type "help" for help. mydatabase=>
선택 사항: 현재 데이터베이스 연결에 대한 정보를 얻습니다.
mydatabase=> \conninfo You are connected to database "mydatabase" as user "mydbuser" on host "127.0.0.1" at port "5432".
7.4.4. 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 구성을 변경하려면 다음 절차를 사용하십시오.
절차
-
해당 구성 파일(예:
/var/lib/pgsql/data/postgresql.conf
)을 편집합니다. 변경 사항이 적용되도록
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.5. PostgreSQL 서버에서 TLS 암호화 구성
기본적으로 PostgreSQL 에서는 암호화되지 않은 연결을 사용합니다. 보다 안전한 연결을 위해 PostgreSQL 서버에서 TLS(Transport Layer Security) 지원을 활성화하고 암호화된 연결을 설정하도록 클라이언트를 구성할 수 있습니다.
사전 요구 사항
- PostgreSQL 서버가 설치되어 있어야 합니다.
- 데이터베이스 클러스터가 초기화됩니다.
절차
OpenSSL 라이브러리를 설치합니다.
# yum install openssl
TLS 인증서 및 키를 생성합니다.
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 바꿉니다.
서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.
# cp server.{key,crt} /var/lib/pgsql/data/.
서명된 인증서의 소유자 및 그룹 소유권을
postgres
사용자로 변경합니다.# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.
# chmod 0400 /var/lib/pgsql/data/server.key
/var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경하여 암호 해시 알고리즘을scram-sha-256
으로 설정합니다.#password_encryption = md5 # md5 or scram-sha-256
다음으로 변경합니다.
password_encryption = scram-sha-256
/var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경하여 SSL/TLS를 사용하도록 PostgreSQL을 구성합니다.#ssl = off
다음으로 변경합니다.
ssl=on
/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 를 사용자 이름으로 바꿉니다.
postgresql
서비스를 다시 시작하여 변경 사항을 적용합니다.# systemctl restart postgresql.service
검증
연결이 암호화되었는지 수동으로 확인하려면 다음을 수행하십시오.
PostgreSQL 데이터베이스에 mydbuser 사용자로 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.
$ psql -U mydbuser -h 127.0.0.1 -d mydatabase Password for user mydbuser:
mydatabase 를 데이터베이스 이름으로 바꾸고 mydbuser 를 사용자 이름으로 바꿉니다.
현재 데이터베이스 연결에 대한 정보를 얻습니다.
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 라이브러리를 로드해야 합니다. 예를 들어 GCC 컴파일러를 사용하여 애플리케이션을 컴파일하려면 다음을 수행합니다.pq
$ gcc source_file.c -lpq -o myapplication
source_file.c 에 위의 예제 코드가 포함되어 있고 myapplication 은 보안된 PostgreSQL 연결을 확인하기 위한 애플리케이션의 이름입니다.
예 7.4. TLS 암호화를 사용하여 PostgreSQL 데이터베이스 초기화, 생성 및 연결
이 예제에서는 PostgreSQL 데이터베이스를 초기화하고 데이터베이스 사용자 및 데이터베이스를 생성하고 보안 연결을 사용하여 데이터베이스에 연결하는 방법을 보여줍니다.
PosgreSQL 서버를 설치합니다.
# yum module install postgresql:13/server
데이터베이스 클러스터를 초기화합니다.
# postgresql-setup --initdb * Initializing database in '/var/lib/pgsql/data' * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
OpenSSL 라이브러리를 설치합니다.
# yum install openssl
TLS 인증서 및 키를 생성합니다.
# openssl req -new -x509 -days 365 -nodes -text -out server.crt \ -keyout server.key -subj "/CN=dbhost.yourdomain.com"
dbhost.yourdomain.com을 데이터베이스 호스트 및 도메인 이름으로 바꿉니다.
서명된 인증서와 개인 키를 데이터베이스 서버의 필수 위치에 복사합니다.
# cp server.{key,crt} /var/lib/pgsql/data/.
서명된 인증서의 소유자 및 그룹 소유권을
postgres
사용자로 변경합니다.# chown postgres:postgres /var/lib/pgsql/data/server.{key,crt}
소유자만 읽을 수 있도록 개인 키에 대한 권한을 제한합니다.
# chmod 0400 /var/lib/pgsql/data/server.key
암호 해시 알고리즘을
scram-sha-256
으로 설정합니다./var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경합니다.#password_encryption = md5 # md5 or scram-sha-256
다음으로 변경합니다.
password_encryption = scram-sha-256
SSL/TLS를 사용하도록 PostgreSQL을 구성합니다.
/var/lib/pgsql/data/postgresql.conf
파일에서 다음 행을 변경합니다.#ssl = off
다음으로 변경합니다.
ssl=on
postgresql
서비스를 시작합니다.# systemctl start postgresql.service
postgres
라는 시스템 사용자로 로그인합니다.# su - postgres
postgres
사용자로 PostgreSQL 대화형 터미널을 시작합니다.$ psql -U postgres psql (13.7) Type "help" for help. postgres=#
mydbuser
라는 사용자를 생성하고mydbuser
의 암호를 설정합니다.postgres=# CREATE USER mydbuser WITH PASSWORD 'mypasswd'; CREATE ROLE postgres=#
mydatabase
데이터베이스를 생성합니다.postgres=# CREATE DATABASE mydatabase; CREATE DATABASE postgres=#
mydbuser
사용자에게 모든 권한을 부여합니다.postgres=# GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydbuser; GRANT postgres=#
대화형 터미널에서 로그아웃합니다.
postgres=# \q
postgres
사용자 세션에서 로그아웃합니다.$ logout
/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
postgresql
서비스를 다시 시작하여 변경 사항을 적용합니다.# systemctl restart postgresql.service
PostgreSQL 데이터베이스에
mydbuser
사용자로 연결하고 호스트 이름과 데이터베이스 이름을 지정합니다.$ 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.6. PostgreSQL 데이터 백업
PostgreSQL 데이터를 백업하려면 다음 방법 중 하나를 사용합니다.
- SQL 덤프
- 파일 시스템 수준 백업
- 연속 아카이브
7.4.6.1. SQL 덤프를 사용하여 PostgreSQL 데이터 백업
SQL 덤프 방법은 SQL 명령으로 덤프 파일을 생성하는 방법을 기반으로 합니다. 덤프가 데이터베이스 서버에 다시 업로드되면 덤프 시와 동일한 상태로 데이터베이스를 다시 생성합니다.
SQL 덤프는 다음 PostgreSQL 클라이언트 애플리케이션에서 확인합니다.
- pg_dump 는 역할 또는 테이블 공간에 대한 클러스터 전체 정보가 없는 단일 데이터베이스를 덤프합니다.
- pg_dumpall 은 지정된 클러스터의 각 데이터베이스를 덤프하고 역할 및 테이블 공간 정의와 같은 클러스터 전체 데이터를 유지합니다.
기본적으로 pg_dump
및 pg_dumpall
명령은 결과를 표준 출력에 작성합니다. 덤프를 파일에 저장하려면 출력을 SQL 파일로 리디렉션합니다. 결과 SQL 파일은 병렬 처리를 허용하는 텍스트 형식 또는 다른 형식으로 되어 있고 개체 복원을 보다 자세히 제어할 수 있습니다.
데이터베이스에 액세스할 수 있는 모든 원격 호스트에서 SQL 덤프를 수행할 수 있습니다.
7.4.6.1.1. SQL 덤프의 장점 및 단점
SQL 덤프에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.
- SQL 덤프는 서버 버전별이 아닌 유일한 PostgreSQL 백업 방법입니다. pg_dump 유틸리티의 출력은 이후 버전의 PostgreSQL 으로 다시 로드할 수 있으며 이는 파일 시스템 수준 백업 또는 연속 보관에서는 불가능합니다.
- SQL 덤프는 32비트에서 64비트 서버로 이동하는 등 데이터베이스를 다른 시스템 아키텍처로 전송할 때 작동하는 유일한 방법입니다.
- SQL 덤프는 내부적으로 일관된 덤프를 제공합니다. 덤프는 pg_dump 가 실행될 때 데이터베이스의 스냅샷을 나타냅니다.
- pg_dump 유틸리티는 실행 중일 때 데이터베이스에서 다른 작업을 차단하지 않습니다.
SQL 덤프의 단점은 파일 시스템 수준 백업에 비해 더 많은 시간이 필요하다는 것입니다.
7.4.6.1.2. pg_dump
를 사용하여 SQL 덤프 수행
클러스터 전체 정보 없이 단일 데이터베이스를 덤프하려면 pg_dump 유틸리티를 사용합니다.
사전 요구 사항
-
덤프하려는 모든 테이블에 대한 읽기 액세스 권한이 있어야 합니다. 전체 데이터베이스를 덤프하려면
postgres
superuser 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
클러스터 전체 정보가 없는 데이터베이스를 덤프합니다.
$ pg_dump dbname > dumpfile
연결할 데이터베이스 서버 pg_dump 를 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h
옵션.기본 호스트는 로컬 호스트이거나 PPP
HOST
환경 변수에 의해 지정된 항목입니다.포트를 정의하는
-p
옵션.기본 포트는 PPP
PORT
환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.
7.4.6.1.3. pg_dumpall
을 사용하여 SQL 덤프 수행
지정된 데이터베이스 클러스터에서 각 데이터베이스를 덤프하고 클러스터 전체 데이터를 보존하려면 pg_dumpall 유틸리티를 사용합니다.
사전 요구 사항
-
postgres
수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
데이터베이스 클러스터의 모든 데이터베이스를 덤프하고 클러스터 전체 데이터를 보존합니다.
$ pg_dumpall > dumpfile
연결할 데이터베이스 서버 pg_dumpall 을 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h
옵션.기본 호스트는 로컬 호스트이거나 PPP
HOST
환경 변수에 의해 지정된 항목입니다.포트를 정의하는
-p
옵션.기본 포트는 PPP
PORT
환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.기본 데이터베이스를 정의하는
-l
옵션입니다.이 옵션을 사용하면 초기화 중에 자동으로 생성된
postgres
데이터베이스와 다른 기본 데이터베이스를 선택할 수 있습니다.
7.4.6.1.4. pg_dump
를 사용하여 덤프된 데이터베이스 복원
pg_dump 유틸리티를 사용하여 덤프한 SQL 덤프에서 데이터베이스를 복원하려면 아래 단계를 수행하십시오.
사전 요구 사항
-
postgres
수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
새 데이터베이스를 생성합니다.
$ createdb dbname
- 개체를 소유하고 있거나 덤프된 데이터베이스의 오브젝트에 대한 사용 권한이 이미 있는지 확인합니다. 이러한 사용자가 없는 경우 복원에서 원래 소유권 및 권한을 가진 오브젝트를 다시 생성할 수 없습니다.
psql
유틸리티를 실행하여 pg_dump 유틸리티로 생성된 텍스트 파일 덤프를 복원합니다.$ psql dbname < dumpfile
여기서
dumpfile
은pg_dump
명령의 출력입니다. 비 텍스트 파일 덤프를 복원하려면 대신pg_restore
유틸리티를 사용합니다.$ pg_restore non-plain-text-file
7.4.6.1.5. pg_dumpall
을 사용하여 덤프된 데이터베이스 복원
pg_dumpall 유틸리티를 사용하여 덤프한 데이터베이스 클러스터에서 데이터를 복원하려면 아래 단계를 따르십시오.
사전 요구 사항
-
postgres
수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
- 개체를 소유하고 있거나 덤프된 데이터베이스의 오브젝트에 대한 사용 권한이 이미 있는지 확인합니다. 이러한 사용자가 없는 경우 복원에서 원래 소유권 및 권한을 가진 오브젝트를 다시 생성할 수 없습니다.
psql 유틸리티를 실행하여 pg_dumpall 유틸리티로 생성된 텍스트 파일 덤프를 복원합니다.
$ psql < dumpfile
여기서
dumpfile
은pg_dumpall
명령의 출력입니다.
7.4.6.1.6. 다른 서버에서 데이터베이스의 SQL 덤프 수행
pg_dump 및 psql 은 파이프로 쓰고 읽을 수 있기 때문에 한 서버에서 다른 서버로 직접 데이터베이스를 덤프할 수 있습니다.
절차
한 서버에서 다른 서버로 데이터베이스를 덤프하려면 다음을 실행합니다.
$ pg_dump -h host1 dbname | psql -h host2 dbname
7.4.6.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.6.2. 파일 시스템 수준 백업을 사용하여 PostgreSQL 데이터 백업
파일 시스템 수준 백업을 생성하려면 PostgreSQL 데이터베이스 파일을 다른 위치에 복사합니다. 예를 들어 다음 방법을 사용할 수 있습니다.
- tar 유틸리티를 사용하여 아카이브 파일을 만듭니다.
- rsync 유틸리티를 사용하여 파일을 다른 위치에 복사합니다.
- 데이터 디렉터리의 일관된 스냅샷을 생성합니다.
7.4.6.2.1. 파일 시스템 백업의 이점 및 제한 사항
파일 시스템 수준 백업은 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.
- 파일 시스템 수준 백업은 일반적으로 SQL 덤프보다 빠릅니다.
파일 시스템 수준 백업에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 제한 사항이 있습니다.
- 이 백업 방법은 RHEL 7에서 RHEL 8로 업그레이드하고 데이터를 업그레이드된 시스템으로 마이그레이션하려는 경우 적합하지 않습니다. 파일 시스템 수준 백업은 아키텍처 및 RHEL 주요 버전에 따라 다릅니다. 업그레이드에 실패하면 RHEL 7 시스템에서 데이터를 복원할 수 있지만 RHEL 8 시스템에서 데이터를 복원할 수 없습니다.
- 데이터를 백업 및 복원하기 전에 데이터베이스 서버를 종료해야 합니다.
- 특정 파일 또는 테이블을 백업 및 복원하는 것은 불가능합니다. 파일 시스템 백업은 전체 데이터베이스 클러스터의 전체 백업 및 복원에만 작동합니다.
7.4.6.2.2. 파일 시스템 수준 백업 수행
파일 시스템 수준 백업을 수행하려면 다음 절차를 사용하십시오.
절차
데이터베이스 클러스터의 위치를 선택하고 이 클러스터를 초기화합니다.
# postgresql-setup --initdb
postgresql 서비스를 중지합니다.
# systemctl stop postgresql.service
파일 시스템 백업을 생성하려면 방법을 사용하여
tar
아카이브와 같이 파일 시스템 백업을 생성합니다.$ tar -cf backup.tar /var/lib/pgsql/data/
postgresql 서비스를 시작합니다.
# systemctl start postgresql.service
추가 리소스
7.4.6.3. 연속 아카이빙을 통한 PostgreSQL 데이터 백업
PostgreSQL 은 데이터베이스의 데이터 파일의 모든 변경 사항을 클러스터 데이터 디렉터리의 pg_wal/
하위 디렉터리에서 사용할 수 있는 쓰기 전 로그(WAL) 파일에 기록합니다. 이 로그는 주로 크래시 복구용으로 사용됩니다. 충돌이 발생한 후 마지막 checkpoint 이후 발생한 로그 항목을 일관성으로 복원하는 데 사용할 수 있습니다.
온라인 백업이라고도 하는 지속적인 아카이브 방법은 실행 중인 서버 또는 파일 시스템 수준 백업에서 수행되는 기본 백업 형태의 데이터베이스 클러스터 사본과 WAL 파일을 결합합니다.
데이터베이스 복구가 필요한 경우 데이터베이스 클러스터 복사본에서 데이터베이스를 복원한 다음 백업된 WAL 파일의 로그를 재생하여 시스템을 현재 상태로 가져올 수 있습니다.
지속적인 아카이브 방법을 사용하면 최소한 마지막 기본 백업 시작 시간으로 확장되는 모든 아카이브 WAL 파일의 연속 시퀀스를 유지해야 합니다. 따라서 기본 백업의 이상적인 빈도는 다음에 따라 달라집니다.
- 아카이브된 WAL 파일에 사용 가능한 스토리지 볼륨입니다.
- 복구가 필요한 상황에서 가능한 최대 데이터 복구 기간입니다. 마지막 백업 이후 긴 기간이 있는 경우 시스템은 더 많은 WAL 세그먼트를 재생하므로 복구 시간이 더 오래 걸립니다.
지속적인 아카이브 백업 솔루션의 일부로 pg_dump 및 pg_dumpall SQL 덤프를 사용할 수 없습니다. SQL 덤프는 논리적 백업을 생성하고 WAL 재생에서 사용할 수 있는 충분한 정보를 포함하지 않습니다.
7.4.6.3.1. 지속적인 아카이빙의 장점과 단점
연속 아카이브는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.
- 연속 백업 방법을 사용하면 백업의 내부 불일치가 로그 재생에 의해 수정되므로 완전히 일치하지 않는 기본 백업을 사용할 수 있습니다. 따라서 실행 중인 PostgreSQL 서버에서 기본 백업을 수행할 수 있습니다.
-
파일 시스템 스냅샷이 필요하지 않습니다.
tar
또는 유사한 아카이브 유틸리티로 충분합니다. - 연속 백업은 로그 재생에 대한 WAL 파일의 시퀀스가 무기한 길어질 수 있기 때문에 WAL 파일을 계속 보관하여 달성할 수 있습니다. 이는 대규모 데이터베이스에 특히 유용합니다.
- 연속 백업은 특정 시점 복구를 지원합니다. WAL 항목을 끝까지 재생하지 않아도 됩니다. 언제든지 재생을 중지할 수 있으며 기본 백업 이후 언제든지 데이터베이스를 해당 상태로 복원할 수 있습니다.
- 일련의 WAL 파일을 동일한 기본 백업 파일과 함께 로드한 다른 시스템에서 지속적으로 사용할 수 있는 경우 언제든지 거의 최신 데이터베이스 복사본으로 다른 시스템을 복원할 수 있습니다.
연속 아카이브에는 다른 PostgreSQL 백업 방법에 비해 다음과 같은 단점이 있습니다.
- 연속 백업 방법은 하위 집합이 아닌 전체 데이터베이스 클러스터의 복원만 지원합니다.
- 연속 백업에는 광범위한 보관 스토리지가 필요합니다.
7.4.6.3.2. WAL 아카이브 설정
실행 중인 PostgreSQL 서버는 일련의 WAL(Write ahead log) 레코드를 생성합니다. 서버는 이 시퀀스를 WAL 세그먼트 파일로 분할하며, WAL 시퀀스에서 해당 위치를 반영하는 숫자 이름이 지정됩니다. WAL 아카이브가 없으면 세그먼트 파일이 재사용되고 더 높은 세그먼트 번호로 이름이 변경됩니다.
WAL 데이터를 보관하면 세그먼트 파일을 재사용하기 전에 각 세그먼트 파일의 내용을 새 위치에 캡처하여 저장합니다. 다른 시스템의 NFS 마운트된 디렉토리, 테이프 드라이브 또는 CD와 같은 콘텐츠를 저장할 수 있는 여러 옵션이 있습니다.
WAL 레코드에는 구성 파일에 대한 변경 사항이 포함되지 않습니다.
WAL 아카이브를 활성화하려면 다음 절차를 사용합니다.
절차
/var/lib/pgsql/data/postgresql.conf
파일에서 다음을 수행합니다.-
the
wal_level
구성 매개 변수를replica
이상으로 설정합니다. -
archive_mode
매개 변수를on
으로 설정합니다. archive_command
구성 매개 변수에 shell 명령을 지정합니다.cp
명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다.참고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
아카이브된 각 새 파일에 대해 유사한 명령이 생성됩니다.
-
지정된 빈도로 서버가 새 WAL 세그먼트 파일로 전환되도록
-
the
postgresql
서비스를 다시 시작하여 변경 사항을 활성화합니다.# systemctl restart postgresql.service
- archive 명령을 테스트하고 기존 파일을 덮어쓰지 않고 실패하는 경우 0이 아닌 종료 상태를 반환하는지 확인합니다.
- 데이터를 보호하려면 세그먼트 파일이 그룹 또는 세계 읽기 액세스 권한이 없는 디렉터리에 보관되었는지 확인합니다.
추가 리소스
7.4.6.3.3. 기본 백업 만들기
몇 가지 방법으로 기본 백업을 만들 수 있습니다. 기본 백업을 수행하는 가장 간단한 방법은 실행 중인 PostgreSQL 서버에서 pg_basebackup 유틸리티를 사용하는 것입니다.
기본 백업 프로세스는 WAL 아카이브 영역에 저장된 백업 기록 파일을 만들고 기본 백업에 필요한 첫 번째 WAL 세그먼트 파일 다음에 이름이 지정됩니다.
백업 기록 파일은 시작 및 끝 시간과 백업의 WAL 세그먼트를 포함하는 작은 텍스트 파일입니다. 레이블 문자열을 사용하여 연결된 덤프 파일을 식별한 경우 백업 기록 파일을 사용하여 복원할 덤프 파일을 확인할 수 있습니다.
데이터를 복구할 수 있도록 몇 가지 백업 세트를 확실하게 유지하는 것이 좋습니다.
사전 요구 사항
-
postgres
수퍼유저, 데이터베이스 관리자 권한이 있는 사용자 또는 최소REPLICATION
권한이 있는 다른 사용자로 명령을 실행해야 합니다. - 기본 백업 중 및 이후에 생성된 모든 WAL 세그먼트 파일을 보관해야 합니다.
절차
pg_basebackup
유틸리티를 사용하여 기본 백업을 수행합니다.개별 파일(일반 형식)으로 기본 백업을 생성하려면 다음을 수행합니다.
$ pg_basebackup -D backup_directory -Fp
backup_directory 를 선택한 백업 위치로 바꿉니다.
테이블 공간을 사용하고 서버와 동일한 호스트에서 기본 백업을 수행하는 경우
--tablespace-mapping
옵션도 사용해야 합니다. 그렇지 않으면 백업을 동일한 위치에 쓰기를 시도할 때 백업이 실패합니다.tar 아카이브( tar
및 압축된 형식)로 기본 백업을 생성하려면 다음을 수행합니다.
$ pg_basebackup -D backup_directory -Ft -z
backup_directory 를 선택한 백업 위치로 바꿉니다.
이러한 데이터를 복원하려면 올바른 위치에 있는 파일을 수동으로 추출해야 합니다.
연결할 데이터베이스 서버 pg_basebackup 을 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h
옵션.기본 호스트는 DASD
HOST
환경 변수에서 지정한 로컬 호스트 또는 호스트입니다.포트를 정의하는
-p
옵션.기본 포트는 PPP
PORT
환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.
- 기본 백업 프로세스가 완료되면 백업 기록 파일에 지정된 데이터베이스 클러스터의 복사본과 백업 중에 사용되는 WAL 세그먼트 파일을 안전하게 보관합니다.
- WAL 세그먼트는 기본 백업보다 오래되어 더 이상 복원이 필요하지 않기 때문에 기본 백업에 사용되는 WAL 세그먼트보다 숫자적으로 낮은 값을 삭제합니다.
7.4.6.3.4. 연속 아카이브 백업을 사용하여 데이터베이스 복원
연속 백업을 사용하여 데이터베이스를 복원하려면 다음 절차를 따릅니다.
절차
서버를 중지합니다.
# systemctl stop postgresql.service
필요한 데이터를 임시 위치에 복사합니다.
전체 클러스터 데이터 디렉터리 및 모든 테이블 공간을 복사하는 것이 좋습니다. 이를 위해서는 기존 데이터베이스의 두 사본을 저장할 수 있는 충분한 여유 공간이 필요합니다.
공간이 충분하지 않은 경우 시스템이 중단되기 전에 보관되지 않은 로그가 포함될 수 있는 클러스터의
pg_wal
디렉터리 콘텐츠를 저장합니다.- 클러스터 데이터 디렉토리 아래에 있는 기존 파일과 하위 디렉토리를 사용하고 있는 테이블 공간의 루트 디렉토리 아래에 모두 제거합니다.
기본 백업에서 데이터베이스 파일을 복원합니다.
다음을 확인하십시오.
-
파일이 올바른 소유권(root이 아닌 데이터베이스 시스템 사용자)을 사용하여 복원됩니다
.
- 올바른 권한으로 파일이 복원됩니다.
-
pg_tblspc/
하위 디렉터리의 심볼릭 링크가 올바르게 복원됩니다.
-
파일이 올바른 소유권(root이 아닌 데이터베이스 시스템 사용자)을 사용하여 복원됩니다
pg_wal/
하위 디렉터리에 있는 파일을 모두 제거합니다.이러한 파일은 기본 백업에서 발생하므로 더 이상 사용되지 않습니다.
pg_wal/
을 보관하지 않은 경우 적절한 권한으로 다시 만듭니다.-
2단계에 저장된 아카이브되지 않은 WAL 세그먼트 파일을
pg_wal/
에 복사합니다. 클러스터 데이터 디렉터리에
recovery.conf
복구 명령 파일을 만들고restore_command
구성 매개 변수에 shell 명령을 지정합니다.cp
명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다. 예를 들면 다음과 같습니다.restore_command = 'cp /mnt/server/archivedir/%f "%p"'
서버를 시작합니다.
# systemctl start postgresql.service
서버는 복구 모드로 전환하고 필요한 아카이브된 WAL 파일을 읽습니다.
외부 오류로 인해 복구가 종료되면 서버를 다시 시작할 수 있으며 복구가 계속됩니다. 복구 프로세스가 완료되면 서버의 recovery
.conf의 이름이 recovery.
done으로 변경됩니다.
이렇게 하면 서버가 정상적인 데이터베이스 작업을 시작한 후 실수로 복구 모드로 전환되지 않습니다.데이터베이스 내용을 확인하여 데이터베이스가 필수 상태로 복구되었는지 확인합니다.
데이터베이스가 필수 상태로 복구되지 않은 경우 1단계로 돌아갑니다. 데이터베이스가 필수 상태로 복구된 경우 사용자가
pg_hba.conf
파일에서 클라이언트 인증 구성을 복원하여 연결하도록 허용합니다.
7.4.6.3.4.1. 추가 리소스
7.4.7. 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 및 PostgreSQL 16 으로 제공합니다.
Red Hat Enterprise Linux의 PostgreSQL 사용자는 데이터베이스 파일에 대해 두 가지 마이그레이션 경로를 사용할 수 있습니다.
빠른 업그레이드 방법은 dump 및 restore 프로세스보다 빠릅니다. 그러나 경우에 따라 빠른 업그레이드가 작동하지 않으며 덤프 및 복원 프로세스만 사용할 수 있습니다. 이러한 경우는 다음과 같습니다.
- 아키텍처 간 업그레이드
-
plpython 또는
확장을 사용하는 시스템. RHEL 8 AppStream 리포지토리에는plpython
2postgresql-plpython
패키지만 포함되어 있습니다.2 패키지가 아닌 postgresql-plpython
3 - Red Hat Software Collections 버전의 PostgreSQL 마이그레이션에는 빠른 업그레이드가 지원되지 않습니다.
최신 버전의 PostgreSQL으로 마이그레이션하기 위한 전제 조건으로 모든 PostgreSQL 데이터베이스를 백업 합니다.
덤프 및 복원 프로세스에는 데이터베이스를 덤프하고 SQL 파일의 백업을 수행해야 하며 빠른 업그레이드 방법에 권장됩니다.
최신 버전의 PostgreSQL 으로 마이그레이션하기 전에 마이그레이션하려는 PostgreSQL 버전과 대상 버전 및 대상 버전 간의 모든 건너뛰는 PostgreSQL 버전에 대한 업스트림 호환성 노트 를 참조하십시오.
7.4.7.1. PostgreSQL 15와 PostgreSQL 16의 주요 차이점
PostgreSQL 16 에서는 다음과 같은 주요 변경 사항이 추가되었습니다.
postmasters
바이너리는 더 이상 사용할 수 없습니다.
PostgreSQL 은 더 이상 postmaster
바이너리와 함께 배포되지 않습니다. 제공된 systemd
장치 파일( systemctl start postgres.service
명령)을 사용하여 postgresql
서버를 시작하는 사용자는 이 변경의 영향을 받지 않습니다. 이전에 postmaster
바이너리를 통해 postgresql
서버를 직접 시작한 경우 대신 postgres
바이너리를 사용해야 합니다.
문서가 더 이상 패키지되지 않음
PostgreSQL 은 더 이상 패키지 내에서 PDF 형식으로 문서를 제공하지 않습니다. 대신 온라인 문서를 사용하십시오.
7.4.7.2. 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
액세스가 pg_hba.conf
파일에 적절하게 구성되었는지 확인합니다. 자세한 내용은 PostgreSQL 사용자 생성을 참조하십시오.
PQsendQuery()
가 더 이상 파이프라인 모드에서 지원되지 않음
PostgreSQL 15 이므로 libpq
라이브러리 PQsendQuery()
함수는 더 이상 파이프라인 모드에서 지원되지 않습니다. 대신 PQsendQueryParams()
함수를 사용하도록 영향을 받는 애플리케이션을 수정합니다.
7.4.7.3. pg_upgrade 유틸리티를 사용한 빠른 업그레이드
빠른 업그레이드 중에 바이너리 데이터 파일을 /var/lib/pgsql/data/
디렉터리에 복사하고 pg_upgrade
유틸리티를 사용해야 합니다.
이 방법을 사용하여 데이터를 마이그레이션할 수 있습니다.
- RHEL 7 시스템 버전 PostgreSQL 9.2 에서 RHEL 8 버전 PostgreSQL 10
- PostgreSQL 10 의 RHEL 8 버전에서 RHEL 버전 PostgreSQL 12로
- RHEL 8 버전의 PostgreSQL 12 에서 RHEL 버전의 PostgreSQL 13으로
- RHEL 버전의 PostgreSQL 13 에서 RHEL 버전의 PostgreSQL 15로
- RHEL 버전의 PostgreSQL 15 에서 RHEL 버전의 PostgreSQL 16으로
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/
디렉터리에 저장됩니다.
절차
RHEL 8 시스템에서 마이그레이션할 스트림(버전)을 활성화합니다.
# yum module enable postgresql:stream
stream 을 선택한 PostgreSQL 서버 버전으로 교체합니다.
PostgreSQL 10 을 제공하는 기본 스트림을 사용하려면 이 단계를 생략할 수 있습니다.
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
다음 항목을 확인합니다.
-
기본 설정: 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/
디렉토리에).
-
기본 설정: RHEL 8 시스템에서 서버가 기본
postgresql
서비스가 데이터를 복사할 때 소스 및 대상 시스템에서 실행되지 않는지 확인합니다.# systemctl stop postgresql.service
-
소스 위치의 데이터베이스 파일을 RHEL 8 시스템의
/var/lib/pgsql/data/
디렉터리로 복사합니다. PostgreSQL 사용자로 다음 명령을 실행하여 업그레이드 프로세스를 수행합니다.
# postgresql-setup --upgrade
그러면 백그라운드에서
pg_upgrade
프로세스가 시작됩니다.실패하는 경우
postgresql-setup
은 정보적인 오류 메시지를 제공합니다./var/lib/pgsql/data-old
의 이전 구성을 새 클러스터로 복사합니다.빠른 업그레이드는 최신 데이터 스택에서 이전 구성을 재사용하지 않으며 구성이 처음부터 생성됩니다. 이전 구성과 새 구성을 수동으로 결합하려면 데이터 디렉터리에서 *.conf 파일을 사용합니다.
새 PostgreSQL 서버를 시작합니다.
# systemctl start postgresql.service
새 데이터베이스 클러스터를 분석합니다.
PostgreSQL 13 이하의 경우:
su postgres -c '~/analyze_new_cluster.sh'
PostgreSQL 15 이상의 경우:
su postgres -c 'vacuumdb --all --analyze-in-stages'
참고REFRESH VERSION을 사용해야 할
수도 있습니다. 자세한 내용은 업스트림 문서를 참조하십시오.
부팅 시 새 PostgreSQL 서버가 자동으로 시작되도록 하려면 다음을 실행합니다.
# systemctl enable postgresql.service
7.4.7.4. 업그레이드 덤프 및 복원
덤프 및 복원 업그레이드를 사용하는 경우 모든 데이터베이스의 콘텐츠를 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 제외).
92/root/var/lib/pgsql/data/
디렉터리를 사용하는 postgresql
RHEL 8에서 이전 postgresql
스트림에서 업그레이드하려면 이후 스트림으로 전환에 설명된 절차를 수행한 다음 PostgreSQL 데이터를 마이그레이션합니다.
덤프를 수행하고 업그레이드를 복원하려면 사용자를 root
로 변경합니다.
다음 절차에서는 RHEL 7 시스템 버전의 PostgreSQL 9.2 에서 RHEL 8 버전의 PostgreSQL 으로 마이그레이션하는 방법을 설명합니다.
절차
RHEL 7 시스템에서 PostgreSQL 9.2 서버를 시작합니다.
# systemctl start postgresql.service
RHEL 7 시스템에서 모든 데이터베이스 콘텐츠를
pgdump_file.sql 파일에 덤프합니다.
su - postgres -c "pg_dumpall > ~/pgdump_file.sql"
데이터베이스가 올바르게 덤프되었는지 확인합니다.
su - postgres -c 'less "$HOME/pgdump_file.sql"'
결과적으로 덤프된 sql 파일의 경로가
/var/lib/pgsql/pgdump_file.sql
이 표시됩니다.RHEL 8 시스템에서 마이그레이션할 스트림(버전)을 활성화합니다.
# yum module enable postgresql:stream
stream 을 선택한 PostgreSQL 서버 버전으로 교체합니다.
PostgreSQL 10 을 제공하는 기본 스트림을 사용하려면 이 단계를 생략할 수 있습니다.
RHEL 8 시스템에서
postgresql-server
패키지를 설치합니다.# yum install postgresql-server
RHEL 7에서 PostgreSQL 서버 모듈을 사용하는 경우 선택적으로 RHEL 8 시스템에 설치합니다. 타사 PostgreSQL 서버 모듈을 컴파일해야 하는 경우
postgresql-devel
패키지에 대해 빌드합니다.RHEL 8 시스템에서 새 PostgreSQL 서버의 데이터 디렉터리를 초기화합니다.
# postgresql-setup --initdb
RHEL 8 시스템에서
pgdump_file.sql
을 PostgreSQL 홈 디렉터리에 복사하고 파일이 올바르게 복사되었는지 확인합니다.su - postgres -c 'test -e "$HOME/pgdump_file.sql" && echo exists'
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
-
RHEL 8 시스템에서 새 PostgreSQL 서버를 시작합니다.
# systemctl start postgresql.service
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"'
7.4.8. RHEL 시스템 역할을 사용하여 PostgreSQL 데이터베이스 서버 설치 및 구성
postgresql
RHEL 시스템 역할을 사용하여 PostgreSQL 데이터베이스 서버의 설치 및 관리를 자동화할 수 있습니다. 기본적으로 이 역할은 PostgreSQL 서비스 구성 파일에서 성능 관련 설정을 자동으로 구성하여 PostgreSQL을 최적화합니다.
7.4.8.1. postgresql
RHEL 시스템 역할을 사용하여 기존 TLS 인증서로 PostgreSQL 구성
애플리케이션에 PostgreSQL 데이터베이스 서버가 필요한 경우 이 서비스를 TLS 암호화로 구성하여 애플리케이션과 데이터베이스 간에 보안 통신을 활성화할 수 있습니다. postgresql
RHEL 시스템 역할을 사용하면 이 프로세스를 자동화하고 TLS 암호화를 사용하여 PostgreSQL을 원격으로 설치하고 구성할 수 있습니다. 플레이북에서 기존 개인 키와 CA(인증 기관)에서 발급한 TLS 인증서를 사용할 수 있습니다.
postgresql
역할은 firewalld
서비스에서 포트를 열 수 없습니다. PostgreSQL 서버에 대한 원격 액세스를 허용하려면 방화벽
RHEL 시스템 역할을 사용하는 작업을 플레이북에 추가합니다.
사전 요구 사항
- 컨트롤 노드 및 관리형 노드를 준비했습니다.
- 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
-
관리 노드에 연결하는 데 사용하는 계정에는
sudo
권한이 있습니다. 관리 노드의 개인 키와 인증서 모두 다음 파일의 제어 노드에 저장됩니다.
-
Private key:
~/<FQDN_of_the_managed_node>.key
-
Certificate:
~/<FQDN_of_the_managed_node>.crt
-
Private key:
절차
중요한 변수를 암호화된 파일에 저장합니다.
자격 증명 모음을 생성합니다.
$ ansible-vault create vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
ansible-vault create
명령이 편집기를 열고 <key > : < value
> 형식으로 중요한 데이터를 입력합니다.pwd: <password>
- 변경 사항을 저장하고 편집기를 종료합니다. Ansible은 자격 증명 모음의 데이터를 암호화합니다.
다음 콘텐츠를 사용하여 플레이북 파일(예:
~/playbook.yml
)을 생성합니다.--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - vault.yml tasks: - name: Create directory for TLS certificate and key ansible.builtin.file: path: /etc/postgresql/ state: directory mode: 755 - name: Copy CA certificate ansible.builtin.copy: src: "~/{{ inventory_hostname }}.crt" dest: "/etc/postgresql/server.crt" - name: Copy private key ansible.builtin.copy: src: "~/{{ inventory_hostname }}.key" dest: "/etc/postgresql/server.key" mode: 0600 - name: PostgreSQL with an existing private key and certificate ansible.builtin.include_role: name: rhel-system-roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_cert_name: "/etc/postgresql/server" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: rhel-system-roles.firewall vars: firewall: - service: postgresql state: enabled
예제 플레이북에 지정된 설정은 다음과 같습니다.
postgresql_version: <version>
설치할 PostgreSQL 버전을 설정합니다. 설정할 수 있는 버전은 관리 노드에서 실행되는 Red Hat Enterprise Linux에서 사용할 수 있는 PostgreSQL 버전에 따라 다릅니다.
postgresql_version
변수를 변경하고 플레이북을 다시 실행하여 PostgreSQL을 업그레이드하거나 다운그레이드할 수 없습니다.postgresql_password: <password>
postgres
데이터베이스 슈퍼유저의 암호를 설정합니다.postgresql_password
변수를 변경하고 플레이북을 다시 실행하여 암호를 변경할 수 없습니다.postgresql_cert_name: <private_key_and_certificate_file>
.crt
및 키 접미사 없이 관리 노드의 인증서 및 개인 키의 경로와 기본 이름을 정의합니다.PostgreSQL 구성 중에 역할은 이러한 파일을 참조하는
/var/lib/pgsql/data/
디렉터리에 심볼릭 링크를 생성합니다.인증서 및 개인 키는 관리 노드에 로컬로 존재해야 합니다.
ansible.builtin.copy
모듈과 함께 작업을 사용하여 플레이북에 표시된 대로 제어 노드에서 관리 노드로 파일을 전송할 수 있습니다.postgresql_server_conf: <list_of_settings>
역할이 설정해야 하는
postgresql.conf
설정을 정의합니다. 역할은 이러한 설정을/etc/postgresql/system-roles.conf
파일에 추가하고/var/lib/pgsql/data/postgresql.conf
끝에 이 파일을 포함합니다. 결과적으로postgresql_server_conf
변수의 설정은/var/lib/pgsql/data/postgresql.conf
의 설정을 재정의합니다.postgresql_server_conf
의 다른 설정으로 플레이북을 다시 실행하면/etc/postgresql/system-roles.conf
파일을 새 설정으로 덮어씁니다.postgresql_pg_hba_conf: <list_of_authentication_entries>
/var/lib/pgsql/data/pg_hba.conf
파일에서 클라이언트 인증 항목을 구성합니다. 자세한 내용은 PostgreSQL 설명서를 참조하십시오.이 예제에서는 PostgreSQL에 다음과 같은 연결을 허용합니다.
- 로컬 UNIX 도메인 소켓을 사용하여 암호화되지 않은 연결입니다.
- IPv4 및 IPv6 localhost 주소에 대한 TLS 암호화 연결
-
192.0.2.0/24 서브넷의 TLS 암호화 연결 원격 주소의 액세스는
postgresql_server_conf
변수에서listen_addresses
설정도 적절하게 구성하는 경우에만 가능합니다.
postgresql_pg_hba_conf
의 다른 설정으로 플레이북을 다시 실행하면 새 설정으로/var/lib/pgsql/data/pg_hba.conf
파일을 덮어씁니다.
플레이북에 사용되는 모든 변수에 대한 자세한 내용은 제어 노드의
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
파일을 참조하십시오.플레이북 구문을 확인합니다.
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.
Playbook을 실행합니다.
$ ansible-playbook --ask-vault-pass ~/playbook.yml
검증
postgres
슈퍼 사용자를 사용하여 PostgreSQL 서버에 연결하고\conninfo
meta 명령을 실행합니다.# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
출력에 TLS 프로토콜 버전 및 암호 세부 정보가 표시되면 연결이 작동하고 TLS 암호화가 활성화됩니다.
추가 리소스
-
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
file -
/usr/share/doc/rhel-system-roles/postgresql/
디렉터리 - Ansible vault
7.4.8.2. postgresql
RHEL 시스템 역할을 사용하여 IdM에서 발행된 TLS 인증서로 PostgreSQL 구성
애플리케이션에 PostgreSQL 데이터베이스 서버가 필요한 경우 애플리케이션과 데이터베이스 간에 보안 통신을 사용하도록 PostgreSQL 서비스를 TLS 암호화로 구성할 수 있습니다. PostgreSQL 호스트가 Red Hat Enterprise Linux IdM(Identity Management) 도메인의 멤버인 경우 certmonger
서비스에서 인증서 요청 및 향후 갱신을 관리할 수 있습니다.
postgresql
RHEL 시스템 역할을 사용하면 이 프로세스를 자동화할 수 있습니다. TLS 암호화를 사용하여 PostgreSQL을 원격으로 설치하고 구성할 수 있으며 postgresql
역할은 인증서
RHEL 시스템 역할을 사용하여 certmonger
를 구성하고 IdM에서 인증서를 요청합니다.
postgresql
역할은 firewalld
서비스에서 포트를 열 수 없습니다. PostgreSQL 서버에 대한 원격 액세스를 허용하려면 방화벽
RHEL 시스템 역할을 사용하는 플레이북에 작업을 추가합니다.
사전 요구 사항
- 컨트롤 노드 및 관리형 노드를 준비했습니다.
- 관리 노드에서 플레이북을 실행할 수 있는 사용자로 제어 노드에 로그인되어 있습니다.
-
관리 노드에 연결하는 데 사용하는 계정에는
sudo
권한이 있습니다. - IdM 도메인에 관리형 노드를 등록하셨습니다.
절차
중요한 변수를 암호화된 파일에 저장합니다.
자격 증명 모음을 생성합니다.
$ ansible-vault create vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
ansible-vault create
명령이 편집기를 열고 <key > : < value
> 형식으로 중요한 데이터를 입력합니다.pwd: <password>
- 변경 사항을 저장하고 편집기를 종료합니다. Ansible은 자격 증명 모음의 데이터를 암호화합니다.
다음 콘텐츠를 사용하여 플레이북 파일(예:
~/playbook.yml
)을 생성합니다.--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - vault.yml tasks: - name: PostgreSQL with certificates issued by IdM ansible.builtin.include_role: name: rhel-system-roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_certificates: - name: postgresql_cert dns: "{{ inventory_hostname }}" ca: ipa principal: "postgresql/{{ inventory_hostname }}@EXAMPLE.COM" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: rhel-system-roles.firewall vars: firewall: - service: postgresql state: enabled
예제 플레이북에 지정된 설정은 다음과 같습니다.
postgresql_version: <version>
설치할 PostgreSQL 버전을 설정합니다. 설정할 수 있는 버전은 관리 노드에서 실행되는 Red Hat Enterprise Linux에서 사용할 수 있는 PostgreSQL 버전에 따라 다릅니다.
postgresql_version
변수를 변경하고 플레이북을 다시 실행하여 PostgreSQL을 업그레이드하거나 다운그레이드할 수 없습니다.postgresql_password: <password>
postgres
데이터베이스 슈퍼유저의 암호를 설정합니다.postgresql_password
변수를 변경하고 플레이북을 다시 실행하여 암호를 변경할 수 없습니다.postgresql_certificates: <certificate_role_settings>
-
인증서
역할의 설정이 포함된 YAML 사전 목록입니다. postgresql_server_conf: <list_of_settings>
역할을 설정할
postgresql.conf
설정을 정의합니다. 역할은 이러한 설정을/etc/postgresql/system-roles.conf
파일에 추가하고/var/lib/pgsql/data/postgresql.conf
끝에 이 파일을 포함합니다. 결과적으로postgresql_server_conf
변수의 설정은/var/lib/pgsql/data/postgresql.conf
의 설정을 재정의합니다.postgresql_server_conf
의 다른 설정으로 플레이북을 다시 실행하면/etc/postgresql/system-roles.conf
파일을 새 설정으로 덮어씁니다.postgresql_pg_hba_conf: <list_of_authentication_entries>
/var/lib/pgsql/data/pg_hba.conf
파일에서 클라이언트 인증 항목을 구성합니다. 자세한 내용은 PostgreSQL 설명서를 참조하십시오.이 예제에서는 PostgreSQL에 다음과 같은 연결을 허용합니다.
- 로컬 UNIX 도메인 소켓을 사용하여 암호화되지 않은 연결입니다.
- IPv4 및 IPv6 localhost 주소에 대한 TLS 암호화 연결
-
192.0.2.0/24 서브넷의 TLS 암호화 연결 원격 주소의 액세스는
postgresql_server_conf
변수에서listen_addresses
설정도 적절하게 구성하는 경우에만 가능합니다.
postgresql_pg_hba_conf
의 다른 설정으로 플레이북을 다시 실행하면 새 설정으로/var/lib/pgsql/data/pg_hba.conf
파일을 덮어씁니다.
플레이북에 사용되는 모든 변수에 대한 자세한 내용은 제어 노드의
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
파일을 참조하십시오.플레이북 구문을 확인합니다.
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
이 명령은 구문만 검증하고 잘못되었지만 유효한 구성으로부터 보호하지 않습니다.
Playbook을 실행합니다.
$ ansible-playbook --ask-vault-pass ~/playbook.yml
검증
postgres
슈퍼 사용자를 사용하여 PostgreSQL 서버에 연결하고\conninfo
meta 명령을 실행합니다.# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
출력에 TLS 프로토콜 버전 및 암호 세부 정보가 표시되면 연결이 작동하고 TLS 암호화가 활성화됩니다.
추가 리소스
-
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.md
file -
/usr/share/doc/rhel-system-roles/postgresql/
디렉터리 - Ansible vault
8장. SriovNetwork SMTP 서버 배포 및 구성
시스템 관리자는 messages와 같은 메일 전송 에이전트(MTA)를 사용하여 SMTP 프로토콜을 사용하여 호스트 간에 이메일 메시지를 전송할 수 있습니다. nodeSelector는 메일 라우팅 및 전송을 위한 서버 측 애플리케이션입니다. SriovNetwork를 사용하여 로컬 메일 서버를 설정하거나 null-client 메일 릴레이를 생성하거나, ReplicaSet 서버를 여러 도메인의 대상으로 사용하거나, 조회를 위해 파일 대신 LDAP 디렉터리를 선택할 수 있습니다.
postfix
패키지는 /etc/ Cryostat/
디렉터리에 여러 구성 파일을 제공합니다.
이메일 인프라를 구성하려면 다음 구성 파일을 사용합니다.
-
main.cf
- nodeSelector의 글로벌 구성이 포함되어 있습니다. -
master.cf
- mail delivery를 수행하기 위해 다양한 프로세스와 Geneve 상호 작용을 지정합니다. -
access
- 액세스 규칙(예: Cryostat에 연결할 수 있는 호스트)을 지정합니다. -
전송
- 이메일 주소를 매핑하여 호스트를 릴레이합니다. -
별칭
- 사용자 ID 별칭을 설명하는 메일 프로토콜에 필요한 구성 가능한 목록을 포함합니다. 이 파일은/etc/
디렉토리에서 찾을 수 있습니다.
dhcp의 주요 기능:
- 일반적인 이메일 관련 위협으로부터 보호하는 보안 기능
- 가상 도메인 및 별칭 지원을 포함한 사용자 정의 옵션
8.1. SriovNetwork SMTP 서버 설치 및 구성
email 메시지를 수신, 저장 및 전달하도록 SQLite SMTP 서버를 구성할 수 있습니다. 시스템 설치 중에 메일 서버 패키지를 선택하지 않으면 Postfix는 기본적으로 사용할 수 없습니다. Postfix를 설치하려면 다음 단계를 수행하십시오.
사전 요구 사항
- 루트 액세스 권한이 있습니다.
- 시스템 등록
절차
Sendmail 유틸리티를 제거합니다.
# yum remove sendmail
OperatorHub를 설치합니다.
# yum install postfix
Cryostat를 구성하려면
/etc/ Cryostat/main.cf
파일을 편집하고 다음과 같이 변경합니다.기본적으로 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
SriovNetwork가
gethostname()
함수에서 반환하는 FQDN(정규화된 도메인 이름)과 다른 호스트 이름을 사용하려면myhostname
매개변수를 추가합니다.myhostname = smtp.example.com
예를 들어, content 는 이 호스트 이름을 처리하는 이메일의 헤더에 추가합니다.
도메인 이름이
myhostname
매개변수의 항목과 다른 경우mydomain
매개변수를 추가합니다.mydomain = example.com
myorigin
매개변수를 추가하고mydomain
: 값으로 설정합니다.myorigin = $mydomain
이 설정을 통해 Geneve는 호스트 이름 대신 로컬에 게시된 메일의 원본으로 도메인 이름을 사용합니다.
mynetworks
매개변수를 추가하고 이메일을 보낼 수 있는 신뢰할 수 있는 네트워크의 IP 범위를 정의합니다.mynetworks = 127.0.0.1/32, [::1]/128, 192.0.2.1/24, [2001:db8:1::1]/64
인터넷과 같은 신뢰할 수 없는 네트워크에서 클라이언트가 이 서버를 통해 이메일을 보낼 수 있어야 하는 경우 이후 단계에서 릴레이 제한 사항을 구성해야 합니다.
main.cf
파일의 dhcp 구성이 올바른지 확인합니다.# postfix check
postfix
서비스가 부팅 시 시작되고 시작되도록 활성화합니다.# systemctl enable --now postfix
방화벽을 통해 smtp 트래픽을 허용하고 방화벽 규칙을 다시 로드합니다.
# firewall-cmd --permanent --add-service smtp # firewall-cmd --reload
검증
postfix
서비스가 실행 중인지 확인합니다.# systemctl status postfix
선택 사항: 출력이 중지되거나 대기 중이거나 서비스가 실행되지 않는 경우
postfix
서비스를 다시 시작합니다.# systemctl restart postfix
선택 사항:
/etc/ Cryostat/ 디렉터리의 구성 파일에서 옵션을 변경한 후
서비스를 다시 로드하여 해당 변경 사항을 적용합니다.postfix
# systemctl reload postfix
시스템의 로컬 사용자 간 이메일 통신을 확인합니다.
# echo "This is a test message" | mail -s <subject> <user@mydomain.com>
메일 서버가 외부 IP 범위의 이메일을 외부 도메인으로 릴레이하지 않는지 확인하려면 다음 절차를 따르십시오.
-
mynetworks
에 정의된 서브넷 내에 있지 않은 클라이언트에 로그인합니다. - 메일 서버를 사용하도록 클라이언트를 구성합니다.
-
메일 서버의 mydomain에 지정한 도메인에 없는 이메일 주소로 이메일을 보냅니다. 예를 들어,
non-existing-user@redhat.com
로 이메일을 보내 주십시오. /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
파일을 확인하십시오.
추가 리소스
-
/etc/ Cryostat/main.cf
구성 파일 -
/usr/share/doc/ Cryostat/README_FILES
디렉터리 - firewalld 사용 및 구성
8.2. 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
-
서버 인증서:
절차
/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
/etc/ Cryostat/main.cf 파일을 편집하여 인증된 사용자에게만 들어오는 SMTP 연결을 제한합니다.
smtpd_tls_auth_only = yes
postfix
서비스를 다시 로드하여 변경 사항을 적용합니다.# systemctl reload postfix
검증
TLS 암호화를 사용하고 이메일을 보내도록 클라이언트를 구성합니다.
참고Cryostat 클라이언트 TLS 활동에 대한 추가 정보를 얻으려면
/etc/ Cryostat/main.cf에서 다음 행을 변경하여 로그 수준을
0
에서1
로 늘립니다.smtp_tls_loglevel = 1
8.3. 모든 이메일을 메일 릴레이로 전달하도록 nodeSelector 구성
모든 이메일을 메일 릴레이로 전달하려면 Cryostat 서버를 null 클라이언트로 구성할 수 있습니다. 이 구성에서 Geneve는 다른 메일 서버로만 메일만 전달하며 이메일을 수신할 수 없습니다.
사전 요구 사항
- 루트 액세스 권한이 있습니다.
-
postfix
패키지가 서버에 설치되어 있어야 합니다. - 이메일을 전달하려는 릴레이 호스트의 IP 주소 또는 호스트 이름이 있습니다.
절차
Cryostat가 로컬 이메일 전송을 수락하지 않고 null 클라이언트로 만들지 않으려면
/etc/ Cryostat/main.cf
파일을 편집하고 다음과 같이 변경합니다.mydestination
매개변수를 빈 값과 동일하게 설정하여 모든 이메일을 전달하도록 dhcp를 구성합니다.mydestination =
이 구성에서 content 서버는 이메일의 대상이 아니며 null 클라이언트 역할을 합니다.
null 클라이언트에서 이메일을 수신하는 메일 릴레이 서버를 지정합니다.
relayhost = [<ip_address_or_hostname>]
릴레이 호스트는 메일 전송을 담당합니다. 대괄호로
<ip_address_or_hostname&
gt;을 묶습니다.이메일이 전달할 루프백 인터페이스에서만 수신 대기하도록 CloudEvent 메일 서버를 구성합니다.
inet_interfaces = loopback-only
모든 발신 이메일의 보낸 사람 도메인을 릴레이 메일 서버의 회사 도메인으로 다시 작성하려면 다음을 설정합니다.
myorigin = relay.example.com
로컬 메일 전송을 비활성화하려면 구성 파일 끝에 다음 지시문을 추가합니다.
local_transport = error: local delivery disabled
왼쪽이 127.0.0.0/8 IPv4 네트워크 및 [::1]/128 IPv6 네트워크에서 메일 릴레이 서버로 이메일을 전달하도록
mynetworks
매개변수를 추가합니다.mynetworks = 127.0.0.0/8, [::1]/128
main.cf
파일의 dhcp 구성이 올바른지 확인합니다.# postfix check
postfix
서비스를 다시 시작하여 변경 사항을 적용합니다.# systemctl restart postfix
검증
이메일 통신이 메일 릴레이로 전달되었는지 확인합니다.
# echo "This is a test message" | mail -s <subject> <user@example.com>
문제 해결
-
오류가 발생한 경우
/var/log/maillog
파일을 확인하십시오.
추가 리소스
-
/etc/ Cryostat/main.cf
구성 파일
8.4. SriovNetwork를 여러 도메인의 대상으로 구성
postfix는 여러 도메인에 대한 이메일을 수신할 수 있는 메일 서버로 구성할 수 있습니다. 이 구성에서 Geneve는 지정된 도메인 내의 주소로 전송된 이메일의 최종 대상 역할을 합니다. 다음을 구성할 수 있습니다.
- 동일한 이메일 대상을 가리키는 여러 이메일 주소 설정
- 여러 도메인에 대한 들어오는 이메일 라우팅을 동일한 Cryostat 서버로 라우팅
사전 요구 사항
- 루트 액세스 권한이 있습니다.
- KubeletConfig 서버를 구성했습니다.
절차
/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로 리디렉션합니다.
가상 별칭 맵의 해시 파일을 생성합니다.
# postmap /etc/postfix/virtual
이 명령은
/etc/ Cryostat/virtual.db
파일을 생성합니다./etc/ Cryostat/virtual
파일을 업데이트한 후 항상 이 명령을 다시 실행해야 합니다.Cryostat
/etc/ Cryostat/main.cf
구성 파일에서virtual_alias_maps
매개변수를 추가하고 해시 파일을 가리킵니다.virtual_alias_maps = hash:/etc/postfix/virtual
postfix
서비스를 다시 로드하여 변경 사항을 적용합니다.# systemctl reload postfix
검증
- 가상 이메일 주소 중 하나로 이메일을 전송하여 구성을 테스트합니다.
문제 해결
-
오류가 발생한 경우
/var/log/maillog
파일을 확인하십시오.
8.5. LDAP 디렉터리를 조회 테이블로 사용
LDAP(Lightweight Directory Access Protocol) 서버를 사용하여 계정, 도메인 또는 별칭을 저장하는 경우 LDAP 서버를 조회 테이블로 사용하도록 HPA를 구성할 수 있습니다. 조회에 파일 대신 LDAP를 사용하면 중앙 데이터베이스를 사용할 수 있습니다.
사전 요구 사항
- 루트 액세스 권한이 있습니다.
-
postfix
패키지가 서버에 설치되어 있어야 합니다. - 필요한 스키마 및 사용자 인증 정보가 있는 LDAP 서버가 있습니다.
-
GPO를 실행하는 서버에
postfix-ldap
플러그인이 설치되어 있어야 합니다.
절차
다음 내용으로
/etc/ Cryostat/ldap-aliases.cf
파일을 생성하여 LDAP 조회 매개변수를 구성합니다.LDAP 서버의 호스트 이름을 지정합니다.
server_host = ldap.example.com
LDAP 검색의 기본 도메인 이름을 지정합니다.
search_base = dc=example,dc=com
-
선택 사항: 요구 사항에 따라 LDAP 검색 필터 및 속성을 사용자 지정합니다. 디렉터리를 검색하는 필터의 기본값은
query_filter = mailacceptinggeneralid=%s
입니다.
다음 콘텐츠를 추가하여
/etc/ Cryostat/main.cf
구성 파일에서 LDAP 소스를 조회 테이블로 활성화합니다.virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
구문 오류 또는 연결 문제를 확인하는
postmap
명령을 실행하여 LDAP 구성을 확인합니다.# postmap -q @example.com ldap:/etc/postfix/ldap-aliases.cf
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.6. 인증된 사용자를 위해 중계하도록 SriovNetwork를 발신 메일 서버로 구성
인증된 사용자의 메일에 대해 릴레이하도록 SriovNetwork를 구성할 수 있습니다. 이 시나리오에서는 사용자가 자신을 인증하고 SMTP 인증, TLS 암호화 및 보낸 사람 주소 제한이 있는 발신 메일 서버로 postfix를 구성하여 이메일 주소를 사용하여 SMTP 서버를 통해 이메일을 보낼 수 있습니다.
사전 요구 사항
- 루트 액세스 권한이 있습니다.
- KubeletConfig 서버를 구성했습니다.
절차
Cryostat를 발신 메일 서버로 구성하려면
/etc/ Cryostat/main.cf
파일을 편집하고 다음을 추가합니다.SMTP 인증을 활성화합니다.
smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes
TLS 없이 액세스를 비활성화합니다.
smtpd_tls_auth_only = yes
인증된 사용자만 메일 중계를 허용합니다.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
선택 사항: 사용자가 자신의 이메일 주소를 발신자로만 사용하도록 제한합니다.
smtpd_sender_restrictions = reject_sender_login_mismatch
postfix
서비스를 다시 로드하여 변경 사항을 적용합니다.# systemctl reload postfix
검증
- TLS 및 SASL을 지원하는 SMTP 클라이언트에서 인증합니다. 테스트 이메일을 보내 SMTP 인증이 올바르게 작동하는지 확인합니다.
8.7. 동일한 호스트에서 실행 중인 SriovNetwork에서 Dovecot에 이메일 전달
UNIX 소켓을 통해 LMTP를 사용하여 동일한 호스트에서 수신한 이메일을 Dovecot에 전달하도록 Geneve를 구성할 수 있습니다. 이 소켓을 사용하면 로컬 시스템의 Cryostat와 Dovecot 간에 직접 통신할 수 있습니다.
사전 요구 사항
- 루트 액세스 권한이 있습니다.
- KubeletConfig 서버를 구성했습니다.
- Dovecot 서버를 구성했습니다. Dovecot Cryostat 및 POP3 서버 구성 및 유지 관리를 참조하십시오.
- Dovecot 서버에 LMTP 소켓을 구성했습니다. LMTP 소켓 구성 및 LMTPS 리스너를 참조하십시오.
절차
/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
postfix
를 다시 로드하여 변경 사항을 적용합니다.# systemctl reload postfix
검증
-
테스트 이메일을 보내 LMTP 소켓이 올바르게 작동하는지 확인합니다.
/var/log/maillog
의 메일 로그에서 오류가 있는지 확인합니다.
8.8. 다른 호스트에서 실행 중인 tls에서 Dovecot에 이메일 전달
네트워크를 통해 Cryostat 메일 서버와 Dovecot 전달 에이전트 간에 보안 연결을 설정할 수 있습니다. 이렇게 하려면 메일 서버 간에 메일 전송에 네트워크 소켓을 사용하도록 LMTP 서비스를 구성합니다. 기본적으로 LMTP 프로토콜은 암호화되지 않습니다. 그러나 TLS 암호화를 구성한 경우 Dovecot는 LMTP 서비스에 동일한 설정을 자동으로 사용합니다. 그런 다음 SMTP 서버는 LMTP를 통해 STARTTLS
명령을 사용하여 연결할 수 있습니다.
사전 요구 사항
- 루트 액세스 권한이 있습니다.
- KubeletConfig 서버를 구성했습니다.
- Dovecot 서버를 구성했습니다. Dovecot Cryostat 및 POP3 서버 구성 및 유지 관리를 참조하십시오.
- Dovecot 서버에 LMTP 서비스를 구성했습니다. LMTP 소켓 구성 및 LMTPS 리스너를 참조하십시오.
절차
다음 콘텐츠를 추가하여
/etc/ Cryostat/main.cf 파일에서 Dovecot에 메일 전달을 위해 LMTP 프로토콜과 INET 도메인 소켓을 사용하도록 rbd를 구성합니다.
mailbox_transport = lmtp:inet:<dovecot_host>:<port>
<
dovecot_host
>를 Dovecot 서버의 IP 주소 또는 호스트 이름으로 바꾸고 <port
>를 LMTP 서비스의 포트 번호로 바꿉니다.postfix
서비스를 다시 로드하여 변경 사항을 적용합니다.# systemctl reload postfix
검증
- 테스트 이메일을 원격 Dovecot 서버에서 호스팅하는 주소로 전송하고 Dovecot 로그를 확인하여 메일이 성공적으로 전달되었는지 확인합니다.
8.9. LoadBalancer 서비스 보안
10.0.0.1은 SMTP(Simple>-< Transfer Protocol)를 사용하여 다른 MTA와 이메일 클라이언트 또는 전달 에이전트 간에 전자식 메시지를 전달하는 메일 전송 에이전트(MTA)입니다. MTA는 서로 간에 트래픽을 암호화할 수 있지만 기본적으로 트래픽을 암호화하지 못할 수 있습니다. 설정을 보다 안전한 값으로 변경하여 다양한 공격에 대한 위험을 완화할 수도 있습니다.
8.9.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
- 클라이언트로부터 시간 단위당 요청까지의 최대 메시지 전달 수를 정의합니다(다양이가 해당 메시지를 실제로 수락하는지의 여부 제외).
default_process_limit
-
지정된 서비스를 제공하는 기본 최대 MTU 하위 프로세스 수를 정의합니다.
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.9.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
패키지가 시스템에 설치되어 있습니다.
절차
Dovecot를 설정합니다.
/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/ 디렉터리에 있는 메일 대기열과
사용자 및 그룹 아래에서 실행되는 애플리케이션을 포함하는 기본 10.0.0.1 SMTP 서버 설정도 가정합니다.postfix
선택 사항: TCP를 통해LoadBalancer 인증 요청을 수신하도록 Dovecot를 설정합니다.
service auth { inet_listener { port = <port-number> } }
/etc/dovecot/conf.d/10-auth.conf
파일에서auth_mechanisms
매개변수를 편집하여 이메일 클라이언트가 Dovecot로 인증하는 방법을 지정합니다.auth_mechanisms = plain login
auth_mechanisms
매개변수는 다른 일반 텍스트 및 비 설명적 인증 방법을 지원합니다.
/etc/ECDHE/main.cf 파일을 수정하여 10.0.0.1을 설정합니다.
10.0.0.1 SMTP 서버에서 SMTP 인증을 활성화합니다.
smtpd_sasl_auth_enable = yes
SMTP 인증에 대한 Dovecot SASL 구현을 활성화합니다.
smtpd_sasl_type = dovecot
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
파일에 지정된 포트 번호로 바꿉니다.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의 주요 기능:
- 설계 및 구현은 보안에 중점을 두고 있습니다.
- 대규모 환경에서 성능을 개선하기 위해 고가용성을 위한 양방향 복제 지원
-
호환성상의 이유로
mbox
및maildir
도 예외적으로 지원합니다. - 손상된 인덱스 파일 수정과 같은 자동 복구 기능
- 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(정규화된 도메인 이름)과 일치합니다.
절차
개인 키 파일에 대한 보안 권한을 설정합니다.
# chown root:root /etc/pki/dovecot/private/server.example.com.key # chmod 600 /etc/pki/dovecot/private/server.example.com.key
Diffie-Hellman 매개변수를 사용하여 파일을 생성합니다.
# openssl dhparam -out /etc/dovecot/dh.pem 4096
서버의 하드웨어 및 엔트로피에 따라 4096비트의 Diffie-Hellman 매개변수를 생성하는 데 몇 분이 걸릴 수 있습니다.
/etc/dovecot/conf.d/10-ssl.conf
파일에서 인증서 및 개인 키 파일의 경로를 설정합니다.ssl_cert
및ssl_key
매개변수를 업데이트하고 서버 인증서 및 개인 키의 경로를 사용하도록 설정합니다.ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.key
ssl_ca
매개변수의 주석을 해제하고 CA 인증서 경로를 사용하도록 설정합니다.ssl_ca = </etc/pki/dovecot/certs/ca.crt
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가 설치되어 있어야 합니다.
절차
vmail
사용자를 만듭니다.# useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail
dovecot는 나중에 이 사용자를 사용하여boxes를 관리합니다. 보안상의 이유로
dovecot
또는dovenull
시스템 사용자를 사용하지 마십시오./var/mail/
와 다른 경로를 사용하는 경우mail_spool_t
SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.# semanage fcontext -a -t mail_spool_t "<path>(/.*)?" # restorecon -Rv <path>
vmail
사용자에게/var/mail/
에 대한 쓰기 권한을 부여합니다.# chown vmail:vmail /var/mail/ # chmod 700 /var/mail/
/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에 대한 별도의 디렉터리가 있는지 확인하는 데 필요합니다.
-
Dovecot는 high-performant
다음 단계
추가 리소스
-
/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가 설치되어 있어야 합니다.
- 가상 사용자 기능이 구성됩니다.
절차
/etc/dovecot/conf.d/10-mail.conf
파일에서first_valid_uid
매개 변수를 업데이트하여 Dovecot에 인증할 수 있는 최소 사용자 ID(UID)를 정의합니다.first_valid_uid = 1000
기본적으로 UID가
1000
개 이상인 사용자는 인증할 수 있습니다. 필요한 경우, Dovecot에서 로그인할 수 있는 가장 높은 UID를 정의하도록last_valid_uid
매개변수를 설정할 수도 있습니다./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(인증 기관) 인증서를 신뢰합니다.
절차
사용자에게 CloudEvent 또는 POP3 서비스만 제공하려면
/etc/dovecot/dovecot.conf
파일에서protocols
매개변수의 주석을 제거하고 필요한 프로토콜로 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.protocols = imap lmtp
기본적으로
imap
,pop3
,lmtp
프로토콜이 활성화됩니다.로컬 방화벽에서 포트를 엽니다. 예를 들어, CloudEventS,Forwarded, POP3S 및 POP3 프로토콜의 포트를 여는 경우 다음을 입력합니다.
# firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 # firewall-cmd --reload
dovecot
서비스를 활성화하고 시작합니다.# systemctl enable --now dovecot
검증
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가 없는 연결에서 일반 텍스트 인증을 허용하지 않으므로 이 테이블에는 암호화되지 않은 연결의 설정이 나열되지 않습니다.
기본값이 아닌 값을 사용하여 구성 설정을 표시합니다.
# 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(정규화된 도메인 이름)과 일치합니다.
절차
개인 키 파일에 대한 보안 권한을 설정합니다.
# chown root:root /etc/pki/dovecot/private/server.example.com.key # chmod 600 /etc/pki/dovecot/private/server.example.com.key
Diffie-Hellman 매개변수를 사용하여 파일을 생성합니다.
# openssl dhparam -out /etc/dovecot/dh.pem 4096
서버의 하드웨어 및 엔트로피에 따라 4096비트의 Diffie-Hellman 매개변수를 생성하는 데 몇 분이 걸릴 수 있습니다.
/etc/dovecot/conf.d/10-ssl.conf
파일에서 인증서 및 개인 키 파일의 경로를 설정합니다.ssl_cert
및ssl_key
매개변수를 업데이트하고 서버 인증서 및 개인 키의 경로를 사용하도록 설정합니다.ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.key
ssl_ca
매개변수의 주석을 해제하고 CA 인증서 경로를 사용하도록 설정합니다.ssl_ca = </etc/pki/dovecot/certs/ca.crt
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가 설치되어 있어야 합니다.
절차
vmail
사용자를 만듭니다.# useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail
dovecot는 나중에 이 사용자를 사용하여boxes를 관리합니다. 보안상의 이유로
dovecot
또는dovenull
시스템 사용자를 사용하지 마십시오./var/mail/
와 다른 경로를 사용하는 경우mail_spool_t
SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.# semanage fcontext -a -t mail_spool_t "<path>(/.*)?" # restorecon -Rv <path>
vmail
사용자에게/var/mail/
에 대한 쓰기 권한을 부여합니다.# chown vmail:vmail /var/mail/ # chmod 700 /var/mail/
/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에 대한 별도의 디렉터리가 있는지 확인하는 데 필요합니다.
-
Dovecot는 high-performant
다음 단계
추가 리소스
-
/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)을 검색할 수 있는 권한이 필요합니다.
절차
/etc/dovecot/conf.d/10-auth.conf
파일에서 인증 백엔드를 구성합니다.주석 처리에
는
있습니다. 예를 들면 다음과 같습니다.auth-*.conf.ext
인증 백엔드 구성 파일에 대한 설명이 포함되어#!include auth-system.conf.ext
다음 줄의 주석을 해제하여 LDAP 인증을 활성화합니다.
!include auth-ldap.conf.ext
/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 서버에서 이러한 설정을 쿼리하지 않습니다. 따라서 이러한 속성도 존재할 필요가 없습니다.
다음 설정으로
/etc/dovecot/dovecot-ldap.conf.ext
파일을 만듭니다.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
LDAP 서버에 인증 바인딩을 활성화하여 Dovecot 사용자를 확인합니다.
auth_bind = yes
URL을 LDAP 서버로 설정합니다.
uris = ldaps://LDAP-srv.example.com
보안상의 이유로 LDAP 프로토콜을 통해 LDAPS 또는ECDHE
TLS
명령을 사용하여 암호화된 연결만 사용하십시오. 후자의 경우 설정에tls = yes
를 추가합니다.작업 인증서 검증을 위해 LDAP 서버의 호스트 이름이 TLS 인증서에 사용된 호스트 이름과 일치해야 합니다.
LDAP 서버의 TLS 인증서 확인을 활성화합니다.
tls_require_cert = hard
사용자 검색을 시작할 DN으로 기본 DN을 설정합니다.
base = ou=People,dc=example,dc=com
검색 범위를 설정합니다.
scope = onelevel
dovecot는 지정된 기본 DN에서만
onelevel
범위로, 하위 트리에서하위 트리
범위를 사용하여 검색합니다.
/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(인증 기관) 인증서를 신뢰합니다.
절차
사용자에게 CloudEvent 또는 POP3 서비스만 제공하려면
/etc/dovecot/dovecot.conf
파일에서protocols
매개변수의 주석을 제거하고 필요한 프로토콜로 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.protocols = imap lmtp
기본적으로
imap
,pop3
,lmtp
프로토콜이 활성화됩니다.로컬 방화벽에서 포트를 엽니다. 예를 들어, CloudEventS,Forwarded, POP3S 및 POP3 프로토콜의 포트를 여는 경우 다음을 입력합니다.
# firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 # firewall-cmd --reload
dovecot
서비스를 활성화하고 시작합니다.# systemctl enable --now dovecot
검증
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가 없는 연결에서 일반 텍스트 인증을 허용하지 않으므로 이 테이블에는 암호화되지 않은 연결의 설정이 나열되지 않습니다.
기본값이 아닌 값을 사용하여 구성 설정을 표시합니다.
# 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(정규화된 도메인 이름)과 일치합니다.
절차
개인 키 파일에 대한 보안 권한을 설정합니다.
# chown root:root /etc/pki/dovecot/private/server.example.com.key # chmod 600 /etc/pki/dovecot/private/server.example.com.key
Diffie-Hellman 매개변수를 사용하여 파일을 생성합니다.
# openssl dhparam -out /etc/dovecot/dh.pem 4096
서버의 하드웨어 및 엔트로피에 따라 4096비트의 Diffie-Hellman 매개변수를 생성하는 데 몇 분이 걸릴 수 있습니다.
/etc/dovecot/conf.d/10-ssl.conf
파일에서 인증서 및 개인 키 파일의 경로를 설정합니다.ssl_cert
및ssl_key
매개변수를 업데이트하고 서버 인증서 및 개인 키의 경로를 사용하도록 설정합니다.ssl_cert = </etc/pki/dovecot/certs/server.example.com.crt ssl_key = </etc/pki/dovecot/private/server.example.com.key
ssl_ca
매개변수의 주석을 해제하고 CA 인증서 경로를 사용하도록 설정합니다.ssl_ca = </etc/pki/dovecot/certs/ca.crt
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가 설치되어 있어야 합니다.
절차
vmail
사용자를 만듭니다.# useradd --home-dir /var/mail/ --shell /usr/sbin/nologin vmail
dovecot는 나중에 이 사용자를 사용하여boxes를 관리합니다. 보안상의 이유로
dovecot
또는dovenull
시스템 사용자를 사용하지 마십시오./var/mail/
와 다른 경로를 사용하는 경우mail_spool_t
SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.# semanage fcontext -a -t mail_spool_t "<path>(/.*)?" # restorecon -Rv <path>
vmail
사용자에게/var/mail/
에 대한 쓰기 권한을 부여합니다.# chown vmail:vmail /var/mail/ # chmod 700 /var/mail/
/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에 대한 별도의 디렉터리가 있는지 확인하는 데 필요합니다.
-
Dovecot는 high-performant
추가 리소스
-
/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
테이블에는 적어도username
및password
열이 포함됩니다. -
암호
열에는 Dovecot에서 지원하는 스키마로 암호화된 암호가 포함되어 있습니다. -
암호는 동일한 스키마를 사용하거나
{pw-storage-scheme}
접두사가 있습니다. -
dovecot
MariaDB 사용자는dovecotDB
데이터베이스의users
테이블에 대한 읽기 권한이 있습니다. -
MariaDB 서버의 TLS 인증서를 발행한 인증 기관(CA) 인증서는
/etc/pki/tls/certs/ca.crt
파일의 Dovecot 서버에 저장됩니다.
절차
dovecot-mysql
패키지를 설치합니다.# yum install dovecot-mysql
/etc/dovecot/conf.d/10-auth.conf
파일에서 인증 백엔드를 구성합니다.주석 처리에
는
있습니다. 예를 들면 다음과 같습니다.auth-*.conf.ext
인증 백엔드 구성 파일에 대한 설명이 포함되어#!include auth-system.conf.ext
다음 줄의 주석을 해제하여 SQL 인증을 활성화합니다.
!include auth-sql.conf.ext
/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에서 이러한 설정을 쿼리하지 않습니다.
다음 설정으로
/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
매개변수의 경우 쿼리에서 모든 사용자 목록을 반환해야 합니다.
-
/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(인증 기관) 인증서를 신뢰합니다.
절차
사용자에게 CloudEvent 또는 POP3 서비스만 제공하려면
/etc/dovecot/dovecot.conf
파일에서protocols
매개변수의 주석을 제거하고 필요한 프로토콜로 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.protocols = imap lmtp
기본적으로
imap
,pop3
,lmtp
프로토콜이 활성화됩니다.로컬 방화벽에서 포트를 엽니다. 예를 들어, CloudEventS,Forwarded, POP3S 및 POP3 프로토콜의 포트를 여는 경우 다음을 입력합니다.
# firewall-cmd --permanent --add-service=imaps --add-service=imap --add-service=pop3s --add-service=pop3 # firewall-cmd --reload
dovecot
서비스를 활성화하고 시작합니다.# systemctl enable --now dovecot
검증
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가 없는 연결에서 일반 텍스트 인증을 허용하지 않으므로 이 테이블에는 암호화되지 않은 연결의 설정이 나열되지 않습니다.
기본값이 아닌 값을 사용하여 구성 설정을 표시합니다.
# doveconf -n
추가 리소스
-
시스템의
firewall-cmd(1)
도움말 페이지
9.4. 두 개의 Dovecot 서버 간 복제 구성
양방향 복제를 사용하면 Dovecot 서버를 고가용성으로 만들 수 있으며, Bookinfo 및 POP3 클라이언트가 두 서버의 kdump에 액세스할 수 있습니다. Dovecot는 각box의 인덱스 로그의 변경 사항을 추적하고 안전한 방식으로 충돌을 해결합니다.
두 복제 파트너 모두에서 이 절차를 수행합니다.
복제는 서버 쌍 간에만 작동합니다. 결과적으로 대규모 클러스터에서는 여러 개의 독립적인 백엔드 쌍이 필요합니다.
사전 요구 사항
- 두 서버 모두 동일한 인증 백엔드를 사용합니다. LDAP 또는 SQL을 사용하여 계정을 중앙에서 유지하는 것이 좋습니다.
-
Dovecot 사용자 데이터베이스 구성은 사용자 목록을 지원합니다.
doveadm user '*'
명령을 사용하여 이를 확인합니다. -
dovecot는 사용자 ID(UID) 대신
vmail
사용자로 파일 시스템의 kdump에 액세스합니다.
절차
/etc/dovecot/conf.d/10-replication.conf
파일을 만들고 여기에 다음 단계를 수행합니다.notify
및replication
플러그인을 활성화합니다.mail_plugins = $mail_plugins notify replication
서비스 복제
기 섹션을 추가합니다.service replicator { process_min_avail = 1 unix_listener replicator-doveadm { mode = 0600 user = vmail } }
이러한 설정으로 Dovecot는
dovecot
서비스가 시작될 때 하나 이상의 replicator 프로세스를 시작합니다. 또한 이 섹션에서는replicator-doveadm
소켓의 설정을 정의합니다.서비스 집계
기 섹션을 추가하여replication-notify-fifo
파이프 및replication-notify
소켓을 구성합니다.service aggregator { fifo_listener replication-notify-fifo { user = vmail } unix_listener replication-notify { user = vmail } }
서비스 doveadm
섹션을 추가하여 복제 서비스의 포트를 정의합니다.service doveadm { inet_listener { port = 12345 } }
doveadm
복제 서비스의 암호를 설정합니다.doveadm_password = replication_password
두 서버에서 암호는 동일해야 합니다.
복제 파트너를 구성합니다.
plugin { mail_replica = tcp:server2.example.com:12345 }
선택 사항: 최대 병렬
dsync
프로세스 수를 정의합니다.replication_max_conns = 20
replication_max_conns
의 기본값은10
입니다.
/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
nis_enabled
SELinux 부울을 활성화하여 Doveadm 복제 포트를 열
수 있습니다.setsebool -P nis_enabled on
복제 파트너만 복제 포트에 액세스할 수 있도록
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- 다른 복제 파트너에서도 이 절차를 수행하십시오.
다시 로드 Dovecot:
# systemctl reload dovecot
검증
- 한 서버의 Webhook에서 작업을 수행한 다음 Dovecot가 변경 사항을 다른 서버에 복제했는지 확인합니다.
복제자 상태를 표시합니다.
# 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
특정 사용자의 복제본 상태를 표시합니다.
# 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)
도움말 페이지 -
/usr/share/doc/dovecot/wiki/Replication.txt
9.5. 사용자 구독이 CloudEventVerifyboxes에 자동으로 가입
일반적으로, CloudEvent 서버 관리자는 Dovecot가 Sent
및 Trash
와 같은 특정 Webhook를 자동으로 생성하고 사용자를 구독하려고 합니다. 구성 파일에서 이 값을 설정할 수 있습니다.
또한, 특수한 속성을 정의할 수 있습니다. gRPC 클라이언트는 종종 이메일 전송과 같은 특별한 목적으로 kdump를 정의하는 것을 지원합니다. 사용자가 올바른 Webhook를 수동으로 선택하고 설정해야 하는 것을 방지하기 위해 CloudEvent 서버는 Bookinfo LIST
명령에서 특수 사용
특성을 보낼 수 있습니다. 그러면 클라이언트가 이 특성을 사용하여 전송된 이메일에 대한 kdump를 식별하고 설정할 수 있습니다.
사전 요구 사항
- dovecot가 구성되어 있습니다.
절차
/etc/dovecot/conf.d/15-mailboxes.conf
파일에서받은 편지함
네임스페이스 섹션을 업데이트합니다.사용자가 사용할 수 있어야 하는 각각의 특수한 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가 클라이언트에게특수 사용
속성에 전송하는 값을 정의합니다.선택 사항: 특수한 용도가 없는 다른 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를 생성하지도 않고 사용자를 구독하지 않습니다.
-
다시 로드 Dovecot:
# systemctl reload dovecot
검증
CloudEvent 클라이언트를 사용하고 사용자 name에 액세스할 수 있습니다.
auto = subscribe
설정이 있는 boxes가 자동으로 표시됩니다. 클라이언트가 특수한 사용 위치 및 정의된 목적을 지원하는 경우 클라이언트는 이를 자동으로 사용합니다.
추가 리소스
- RFC 6154: special-Use>-<es를 위한 CloudEvent LIST 확장
-
/usr/share/doc/dovecot/wiki/MailboxSettings.txt
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 암호화가 구성됩니다.
절차
LMTP 프로토콜이 활성화되어 있는지 확인합니다.
# doveconf -a | grep -E "^protocols" protocols = imap pop3 lmtp
출력에
lmtp
가 포함된 경우 프로토콜이 활성화됩니다.lmtp
프로토콜이 비활성화된 경우/etc/dovecot/dovecot.conf
파일을 편집하고 protocol 매개변수의 값에lmtp
를 추가합니다.protocols = ... lmtp
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 } ... }
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다시 로드 Dovecot:
# systemctl reload dovecot
검증
LMTP 소켓을 구성한 경우 Dovecot가 소켓을 생성하고 권한이 올바른지 확인합니다.
# ls -l /var/run/dovecot/lmtp srw-------. 1 postfix postfix 0 Nov 22 17:17 /var/run/dovecot/lmtp
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가 설치되어 있어야 합니다.
절차
/etc/dovecot/dovecot.conf
파일에서protocols
매개변수의 주석을 제거하고 필요한 프로토콜을 사용하도록 설정합니다. 예를 들어, POP3이 필요하지 않은 경우 다음을 설정합니다.protocols = imap lmtp
기본적으로
imap
,pop3
,lmtp
프로토콜이 활성화됩니다.다시 로드 Dovecot:
# systemctl reload dovecot
로컬 방화벽에 더 이상 필요하지 않은 포트를 닫습니다. 예를 들어, 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 프로토콜을 지원합니다.
절차
dovecot-pigeon absent 패키지를
설치합니다.# yum install dovecot-pigeonhole
/etc/dovecot/conf.d/20-managesieve.conf
에서 다음 줄의 주석을 제거하여sieve
프로토콜을 활성화합니다.protocols = $protocols sieve
이 설정은 이미 활성화된 다른 프로토콜 외에 Sieve를 활성화합니다.
firewalld
에서 ManageSieve 포트를 엽니다.# firewall-cmd --permanent --add-service=managesieve # firewall-cmd --reload
다시 로드 Dovecot:
# systemctl reload dovecot
검증
클라이언트를 사용하고 Sieve 스크립트를 업로드합니다. 다음 연결 설정을 사용합니다.
- 포트: 4190
- 연결 보안: SSL/TLS
- 인증 방법: PLAIN
- 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를 사용하여 로컬 호스트에서 출력할 수 있습니다. 이 호스트를 사용하여 네트워크에서 프린터를 공유하고 인쇄 서버 역할을 할 수도 있습니다.
절차
cups
패키지를 설치합니다.# yum install cups
CUPS를 출력 서버로 구성하는 경우
/etc/cups/cupsd.conf
파일을 편집하고 다음과 같이 변경합니다.CUPS를 원격으로 구성하거나 이 호스트를 출력 서버로 사용하려면 서비스에서 수신 대기하는 IP 주소와 포트를 구성합니다.
Listen 192.0.2.1:631 Listen [2001:db8:1::1]:631
기본적으로 CUPS는
localhost
인터페이스(127.0.0.1
및::1
)에서만 수신 대기합니다. 대괄호로 IPv6 주소를 지정합니다.중요인터넷과 같이 신뢰할 수 없는 네트워크에서 액세스를 허용하는 인터페이스에서 수신 대기하도록 CUPS를 구성하지 마십시오.
<
Location /> 지시문에서 각 IP 범위를 허용하여 서비스에 액세스할 수 있는 IP 범위를
구성합니다.<Location /> Allow from 192.0.2.0/24 Allow from [2001:db8:1::1]/32 Order allow,deny </Location>
<
;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.15
및2001:db8:1::22
가 있는 호스트만 관리 서비스에 액세스할 수 있습니다.선택 사항: 웹 인터페이스에서 구성 및 로그 파일에 액세스할 수 있는 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>
firewalld
서비스를 실행하고 CUPS에 대한 원격 액세스를 구성하려면firewalld
에서 CUPS 포트를 엽니다.# firewall-cmd --permanent --add-port=631/tcp # firewall-cmd --reload
여러 인터페이스가 있는 호스트에서 CUPS를 실행하는 경우 필요한 네트워크에 대한 액세스를 제한하는 것이 좋습니다.
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 인증서를 신뢰합니다.
절차
/etc/cups/cups-files.conf
파일을 편집하고 다음 설정을 추가하여 자체 서명된 인증서 자동 생성을 비활성화합니다.CreateSelfSignedCerts no
자체 서명된 인증서 및 개인 키를 제거합니다.
# rm /etc/cups/ssl/<hostname>.crt /etc/cups/ssl/<hostname>.key
선택 사항: 서버의 FQDN을 표시합니다.
# hostname -f server.example.com
개인 키와 서버 인증서를
/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를 사용하려면 개인 키 <
;fqdn > .key
및 서버 인증서 파일 <fqdn > .crt
를 지정해야 합니다. 별칭을 사용하는 경우 <alias>.key 및 <alias
>.crt 파일의
이름을 지정해야 합니다.root
사용자만 이 파일을 읽을 수 있는 개인 키에 대한 보안 권한을 설정합니다.# chown root:root /etc/cups/ssl/server.example.com.key # chmod 600 /etc/cups/ssl/server.example.com.key
인증서는 보안 연결을 설정하기 전에 클라이언트와 서버 간의 통신의 일부이므로 모든 클라이언트는 인증 없이 인증서를 검색할 수 있습니다. 따라서 서버 인증서 파일에 대한 엄격한 권한을 설정할 필요가 없습니다.
SELinux 컨텍스트를 복원하십시오.
# restorecon -Rv /etc/cups/ssl/
선택 사항: 인증서의
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 ...
서버 인증서의
CN
또는 SAN 필드에 서버의 FQDN과 다른 별칭이 포함된 경우ServerAlias
매개변수를/etc/cups/cupsd.conf
파일에 추가합니다.ServerAlias alternative_name.example.com
이 경우 절차의 나머지 부분에서 FQDN 대신 대체 이름을 사용합니다.
기본적으로 CUPS는 작업에 인증이 필요한 경우에만 암호화된 연결을 적용합니다(예: 웹 인터페이스의
/admin
페이지에서 관리 작업을 수행할 때).전체 CUPS 서버에 암호화를 적용하려면
/etc/cups/cupsd.conf
파일의 모든 <Location
> 지시문에Encryption
을 추가합니다. 예를 들면 다음과 같습니다.<Location /> ... Encryption Required </Location>
CUPS를 다시 시작합니다.
# systemctl restart cups
검증
-
브라우저를 사용하고
https:// <hostname> :631 /admin/
에 액세스합니다. 이렇게 하려면 브라우저가 CA 인증서를 신뢰해야 합니다. 연결에 성공하면 CUPS에서 TLS 암호화를 올바르게 구성했습니다. -
전체 서버에 암호화가 필요한 경우
http:// <hostname > :631/
에 액세스합니다. CUPS는Upgrade Required
오류를 반환합니다.
문제 해결
cups
서비스의systemd
저널 항목을 표시합니다.# journalctl -u cups
저널에 연결을 암호화할 수 없는
Unable이 포함된 경우 다음을 수행합니다. HTTPS 프로토콜을 사용하여 웹 인터페이스에 연결하지 못한 후 파일을 읽는 동안 오류가 발생했습니다. 개인 키 및 서버 인증서 파일의 이름을 확인합니다.
추가 리소스
- RHEL에서 CA 서명 TLS 인증서를 사용하도록 CUPS를 구성하는 방법 (Red Hat Knowledgebase)
10.3. 웹 인터페이스에서 CUPS 서버를 관리할 수 있는 관리 권한 부여
기본적으로 sys
,root
및 wheel
그룹의 멤버는 웹 인터페이스에서 관리 작업을 수행할 수 있습니다. 그러나 다른 서비스도 이러한 그룹을 사용합니다. 예를 들어 wheel
그룹의 멤버는 기본적으로 sudo
를 사용하여 root
권한으로 명령을 실행할 수 있습니다. CUPS 관리자가 다른 서비스에서 예기치 않은 권한을 얻지 않도록 하려면 CUPS 관리자 전용 그룹을 사용합니다.
사전 요구 사항
- CUPS가 구성되어 있습니다.
- 사용하려는 클라이언트의 IP 주소에는 웹 인터페이스의 관리 영역에 액세스할 수 있는 권한이 있습니다.
절차
CUPS 관리자 그룹을 생성합니다.
# groupadd cups-admins
웹 인터페이스에서 서비스를 관리해야 하는 사용자를
cups-admins
그룹에 추가합니다.# usermod -a -G cups-admins <username>
/etc/cups/cups-files.conf
파일에서SystemGroup
매개변수 값을 업데이트하고cups-admin
그룹을 추가합니다.SystemGroup sys root wheel cups-admins
cups-admin
그룹만 관리 액세스 권한이 있는 경우 매개 변수에서 다른 그룹 이름을 제거합니다.CUPS를 다시 시작합니다.
# systemctl restart cups
검증
브라우저를 사용하고
https:// <hostname_or_ip_address > :631/admin/
에 액세스합니다.참고HTTPS 프로토콜을 사용하는 경우에만 웹 UI의 관리 영역에 액세스할 수 있습니다.
-
관리 작업 수행을 시작합니다. 예를 들어
프린터 추가
를 클릭합니다. 웹 인터페이스에서 사용자 이름과 암호를 입력하라는 메시지를 표시합니다. 계속하려면
cups-admins
그룹의 멤버인 사용자의 자격 증명을 사용하여 인증합니다.인증이 성공하면 이 사용자는 관리 작업을 수행할 수 있습니다.
10.4. 프린터 드라이버가 있는 패키지 개요
RHEL(Red Hat Enterprise Linux)은 CUPS용 프린터 드라이버를 사용하여 다른 패키지를 제공합니다. 다음은 이러한 패키지에 대한 일반적인 개요와 드라이버를 포함하는 공급업체에 대한 개요입니다.
패키지 이름 | 프린터용 드라이버 |
---|---|
| Zebra, Dymo |
| Kodak |
| 대만, Canon, Epson, Gestson, Gestetner, HP, Infotec, Kyocera, Lanier, Lexmark, NRG, Ricoh, Cryostat, Savin, Sharp, Toshiba, Xerox 및 기타 |
| 대만, Canon, Epson, Fujitsu, HP, Infotec, Kyocera, Lanier, NRG, Oki, Minolta, Ricoh, Cryostat, Savin, Xerox 및 기타 |
| HP |
| HP |
| retries, Xerox 및 기타 |
일부 패키지에는 동일한 프린터 공급 업체 또는 모델에 대한 드라이버가 포함되어 있지만 기능이 다를 수 있습니다.
필수 패키지를 설치한 후 CUPS 웹 인터페이스에서 드라이버 목록을 표시하거나 lpinfo -m
명령을 사용하여 표시할 수 있습니다.
10.5. 프린터가 드라이버 없는 인쇄를 지원하는지 여부 확인
CUPS는 드라이버 없는 인쇄를 지원하므로 프린터 모델에 대한 하드웨어별 소프트웨어를 제공하지 않고 출력할 수 있습니다. 이를 위해 프린터는 고객에게 해당 기능에 대해 알리고 다음 표준 중 하나를 사용해야 합니다.
- AirPrint™
- IPP Everywhere™
- Mopria®
- Wi-Fi 직접 인쇄 서비스
ipptool
유틸리티를 사용하여 프린터가 드라이버 없는 인쇄를 지원하는지 확인할 수 있습니다.
사전 요구 사항
- 프린터 또는 원격 인쇄 서버는 IPP(Internet Printing Protocol)를 지원합니다.
- 호스트는 프린터 또는 원격 인쇄 서버의 IPP 포트에 연결할 수 있습니다. 기본 IPP 포트는 631입니다.
절차
ipp-versions-supported
및document-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
를 사용하여 원격 인쇄 서버에서 사용할 수 있는 많은 양의 인쇄 대기열을 자동으로 설치합니다.
사전 요구 사항
- CUPS가 구성되어 있습니다.
- CUPS에서 프린터를 관리할 수 있는 권한이 있습니다.
- CUPS를 출력 서버로 사용하는 경우 네트워크를 통해 데이터를 안전하게 전송 하도록 TLS 암호화를 구성했습니다.
- 이 기능을 사용하려면 프린터에서 드라이버 없는 인쇄를 지원합니다.
절차
브라우저를 사용하고
https:// <hostname> :631 /admin/
에 액세스합니다.HTTPS 프로토콜을 사용하여 웹 인터페이스에 연결해야 합니다. 그렇지 않으면 CUPS를 사용하면 보안상의 이유로 이후 단계에서 인증할 수 없습니다.
- 클릭합니다.
- 아직 인증되지 않은 경우 CUPS에서 관리자의 자격 증명을 입력하라는 메시지를 표시합니다. 권한이 부여된 사용자의 사용자 이름과 암호를 입력합니다.
- 드라이버 없는 인쇄를 사용하지 않고 추가할 프린터가 자동으로 감지되면 해당 프린터를 선택하고 를 클릭합니다.
프린터가 감지되지 않은 경우:
프린터에서 지원하는 프로토콜을 선택합니다.
프린터에서 드라이버 없는 인쇄를 지원하고 이 기능을 사용하려면
ipp
또는ipps
프로토콜을 선택합니다.- 를 클릭합니다.
프린터 또는 원격 인쇄 서버의 대기열에 대한 URL을 입력합니다.
- 를 클릭합니다.
이름 및 설명 및 위치를 입력합니다. CUPS를 출력 서버로 사용하고 다른 클라이언트가 이 프린터에서 CUPS를 통해 출력할 수 있어야 하는 경우 이 프린터 공유 도 선택합니다.
- Make 목록에서 프린터 제조업체를 선택합니다. 프린터 제조업체가 목록에 없는 경우 일반 을 선택하거나 프린터에 대한 PPD 파일을 업로드합니다.
- 를 클릭합니다.
프린터 모델을 선택합니다.
- 프린터가 드라이버 없는 인쇄를 지원하는 경우 IPP Everywhere 를 선택합니다. 이전에 프린터별 드라이버를 로컬에 설치한 경우 목록에 < Cryostat _name > - IPP Everywhere 와 같은 항목도 포함될 수 있습니다.
- 프린터에서 드라이버 없는 인쇄를 지원하지 않는 경우 모델을 선택하거나 프린터에 대한 PPD 파일을 업로드합니다.
프린터 옵션 설정 페이지의 설정 및 탭은 드라이버와 프린터에서 지원하는 기능에 따라 달라집니다. 이 페이지를 사용하여 문서 크기와 같은 기본 옵션을 설정합니다.
- 클릭합니다.
검증
- 웹 인터페이스에서 Cryo stat 탭을 엽니다.
- 프린터 이름을 클릭합니다.
- 유지 관리 목록에서 테스트 출력 페이지를 선택합니다.
문제 해결
-
드라이버 없는 인쇄를 사용하고 인쇄가 작동하지 않는 경우
lpadmin
유틸리티를 사용하여 명령줄에서 프린터를 추가합니다. 자세한 내용은 lpadmin 유틸리티를 사용하여 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가 구성되어 있습니다.
- 이 기능을 사용하려면 프린터에서 드라이버 없는 인쇄를 지원합니다.
- 프린터는 포트 631(IPP), 9100(소켓) 또는 515(LPD)에서 데이터를 허용합니다. 포트는 프린터 연결에 사용하는 방법에 따라 다릅니다.
절차
프린터를 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
로컬 드라이버 데이터베이스에 드라이버가 있는 프린터를 추가하려면 다음을 수행합니다.
데이터베이스의 드라이버를 나열합니다.
# lpinfo -m ... drv:///sample.drv/generpcl.ppd Generic PCL Laser Printer ...
데이터베이스의 드라이버에 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 파일의 경로를 설정합니다.
검증
사용 가능한 프린터를 표시합니다.
# lpstat -p printer Demo-printer is idle. enabled since Fri 23 Jun 2023 09:36:40 AM CEST
테스트 페이지를 인쇄합니다.
# lp -d Demo-printer /usr/share/cups/data/default-testpage.pdf
10.8. 웹 인터페이스를 사용하여 CUPS 프린터에서 유지 관리 및 관리 작업 수행
프린터 관리자는 인쇄 서버에서 다른 작업을 수행해야 하는 경우가 있습니다. 예를 들면 다음과 같습니다.
- 기술자가 프린터를 복구하는 동안 프린터를 일시적으로 일시 정지하는 것과 같은 유지 관리 작업
- 프린터의 기본 설정 변경과 같은 관리 작업
CUPS 웹 인터페이스를 사용하여 이러한 작업을 수행할 수 있습니다.
사전 요구 사항
- CUPS가 구성되어 있습니다.
- CUPS에서 프린터를 관리할 수 있는 권한이 있습니다.
- CUPS를 출력 서버로 사용하는 경우 네트워크를 통해 일반 텍스트로 인증 정보를 보내지 않도록 TLS 암호화를 구성했습니다.
- 프린터는 이미 CUPS에 있습니다.
절차
브라우저를 사용하고
https:// <hostname> :631 / Cryostats/ 에
액세스합니다.HTTPS 프로토콜을 사용하여 웹 인터페이스에 연결해야 합니다. 그렇지 않으면 CUPS를 사용하면 보안상의 이유로 이후 단계에서 인증할 수 없습니다.
- 구성할 프린터 이름을 클릭합니다.
- 유지 관리 또는 관리 작업을 수행할지 여부에 따라 목록에서 필요한 작업을 선택합니다.
- 아직 인증되지 않은 경우 CUPS에서 관리자의 자격 증명을 입력하라는 메시지를 표시합니다. 권한이 부여된 사용자의 사용자 이름과 암호를 입력합니다.
- 작업을 수행합니다.
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/
디렉터리에 저장됩니다.
절차
samba-krb5-printing
,samba-client
,krb5-workstation
패키지를 설치합니다.# yum install samba-krb5-printing samba-client krb5-workstation
선택 사항: 도메인 관리자로 인증하고 Windows 인쇄 서버에서 공유되는 프린터 목록을 표시합니다.
# smbclient -L win_print_srv.ad.example.com -U administrator@AD_KERBEROS_REALM --use-kerberos=required Sharename Type Comment --------- ---- ------- ... Example Printer Example ...
선택 사항: 프린터 PPD 이름을 식별하는 CUPS 모델 목록을 표시합니다.
lpinfo -m ... samsung.ppd Samsung M267x 287x Series PXL ...
다음 단계에서 프린터를 추가할 때 PPD 파일의 이름이 필요합니다.
프린터를 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는 프린터에 대한 작업을 허용합니다.
-
검증
- AD 도메인 사용자로 RHEL 호스트에 로그인합니다.
AD 도메인 사용자로 인증합니다.
# kinit domain_user_name@AD_KERBEROS_REALM
로컬 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 포트로 액세스할 수 있습니다.
절차
/etc/cups/cups-browsed.conf
파일을 편집하고 다음과 같이 변경합니다.폴링하려는 각 원격 CUPS 서버에 대해
BrowsePoll
매개변수를 추가합니다.BrowsePoll remote_cups_server.example.com BrowsePoll 192.0.2.100:1631
원격 CUPS 서버가 631과 다른 포트에서 수신 대기하는 경우 호스트 이름 또는 IP 주소에
:
<port>를 추가합니다.선택 사항: 로컬 CUPS 서비스에 표시되는 프린터를 제한하도록 필터를 구성합니다. 예를 들어 이름에
sales_
가 포함된 큐를 필터링하려면 다음을 추가합니다.BrowseFilter name sales_
다른 필드 이름으로 필터링하고 필터를 무효화하고 정확한 값과 일치시킬 수 있습니다. 자세한 내용은 시스템의
cups-browsed.conf(5)
도움말 페이지의 매개변수 설명 및 예제를 참조하십시오.선택 사항: 폴링 간격 및 타임아웃을 변경하여 검색 주기 수를 제한합니다.
BrowseInterval 1200 BrowseTimeout 6000
동일한 비율로
BrowseInterval
및BrowseTimeout
을 모두 늘리면 프린터가 검색 목록에서 사라지는 상황을 방지합니다. 즉,BrowseInterval
의 값을 5 또는 더 높은 정수로 곱하고,BrowseTimeout
에 대해 이 결과 값을 사용합니다.기본적으로
cups-browsed
는 60초마다 원격 서버를 폴링하고 시간 초과는 300초입니다. 그러나 큐가 많은 인쇄 서버에서 이러한 기본값은 많은 리소스가 필요할 수 있습니다.
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를 구성할 수 있습니다.
사전 요구 사항
절차
/etc/cups/cups-files.conf
파일을 편집하고AccessLog
,ErrorLog
및PageLog
매개변수를 이러한 로그 파일을 저장하려는 경로로 설정합니다.AccessLog /var/log/cups/access_log ErrorLog /var/log/cups/error_log PageLog /var/log/cups/page_log
/var/log/cups/
이외의 디렉터리에 로그를 저장하도록 CUPS를 구성하는 경우 이 디렉터리에cupsd_log_t
SELinux 컨텍스트를 설정합니다. 예를 들면 다음과 같습니다.# semanage fcontext -a -t cupsd_log_t "/var/log/printing(/.*)?" # restorecon -Rv /var/log/printing/
cups
서비스를 다시 시작하십시오.# systemctl restart cups
검증
로그 파일을 표시합니다.
# cat /var/log/cups/access_log # cat /var/log/cups/error_log # cat /var/log/cups/page_log
/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는 작업을 처리하고 프린터로 전송하는 출력 서버 중 하나로 작업을 라우팅합니다.
절차
두 개 이상의 서버에서 CUPS를 설정합니다.
- CUPS를 설치하고 구성합니다.
- TLS 암호화를 활성화합니다.
lpadmin 유틸리티 또는 웹 인터페이스를 사용하여 모든 CUPS 인스턴스에 출력 대기열을 추가합니다. 웹 인터페이스를 사용하는 경우 프린터를 추가하는 동안 이 프린터 공유 옵션을 선택해야 합니다.
lpadmin
유틸리티는 이 설정을 기본적으로 활성화합니다.중요고가용성 시나리오의 경우 한 출력 서버의 각 큐에 대해 다른 서버에서 정확히 동일한 큐 이름을 가진 큐가 필요합니다.
lpstat -e
명령을 사용하여 각 서버의 대기열 이름을 표시할 수 있습니다.선택 사항: 각 서버에서 다른 프린터를 참조하도록 큐를 구성할 수 있습니다.
인쇄 클라이언트의 경우:
/etc/cups/cups-browsed.conf
파일을 편집하고 각 CUPS 인쇄 서버에 대해BrowsePoll
지시문을 추가합니다.BrowsePoll print_server_1.example.com:631 BrowsePoll print_server_2.example.com:631
cups
및cups-browsed
서비스를 모두 활성화하고 시작합니다.# systemctl enable --now cups cups-browsed
검증
클라이언트에서 사용 가능한 프린터를 표시합니다.
# lpstat -t ... device for Demo-printer: implicitclass://Demo-printer/ Demo-printer accepting requests since Fri 22 Nov 2024 11:54:59 AM CET printer Demo-printer is idle. enabled since Fri 22 Nov 2024 11:54:59 AM CET ...
예제 출력에서는 Demo- Cryostat 대기열에서
암시적 클래스
백엔드를 사용함을 보여줍니다. 결과적으로cups-browsed
경로는 이 클라이언트의BrowsePoll
지시문에 지정된 호스트로 이 대기열에 대한 작업을 출력합니다.
10.14. CUPS 문서에 액세스
CUPS는 CUPS 서버에 설치된 서비스 문서에 대한 브라우저 기반 액세스를 제공합니다. 이 문서에는 다음이 포함됩니다.
- 명령줄 프린터 관리 및 회계와 같은 관리 문서
- 도움말 페이지
- 관리 API와 같은 프로그래밍 문서
- 참고 자료
- 사양
사전 요구 사항
- CUPS가 설치되어 실행 중입니다.
- 사용하려는 클라이언트의 IP 주소에는 웹 인터페이스에 액세스할 수 있는 권한이 있습니다.
절차
-
브라우저를 사용하고
http:// <hostname_or_ip_address > :631/help/
에 액세스합니다. -
온라인 도움말
문서에서 항목을 확장하고 읽을 문서를 선택합니다.