웹서버의 ssl(https)설정은 무척 복잡하다.
ssl_module관련된 directive들이 자세히 나와있는 글들이 별로 없는데, 아주 좋은 블로그를 발견하여서 참고해서 작성하였다. (사실 거의 똑같다..) 존경합니다.
(출처 : https://golmong.tistory.com/170)
설정 지시자(configuration directive)
SSLPassPhraseDialog
Apache가 시동될 때 SSL이 적용된 각 virtualhost에 대한 Certificate와 Private Key를 읽어온다. 보안을 위해서 Private Key들은 암호화되어 있으며, 따라서 mod_ssl은 관리자에게 암호화된 PrivateKey를 복호화하기 위해서 Pass Phrase를 요구한다.
- Builtin
- exec:/path/to/program
- Apache 시동 시에 호출할 각 암호화된 Private Key에 대한 external program을 설정한다.
example : SSLPassPhraseDialog exec:/usr/local/apache/sbin/pp-filter
SSLMutex
이 directive는 fork되어진 Apache 서버 프로세스 간의 동기화되어 실행되어야 할 오퍼레이션들의 상호배제(mutual exclusion)에 사용되는 SSL 엔진의 세마포어(semaphore)를 설정한다. 하나의 global mutex만 유효하기 때문에 이 directive는 global server context에서만 사용할 수 있다.
none
Mutext를 사용하지 않으며, 기본 설정(default)이다. 그러나 현재 Mutex는 SSL Session Cache에 대한 write access를 동기화(Synchronizing)하는데 주로 사용되기 때문에 Session Cache의 변경이 드물게 일어나는 경우에만 이 설정을 사용한다. 따라서 이 directive를 default로 설정하는 것은 바람직하지 않으며, real Mutex를 설정하는 것이 좋다.
file:/path/to/mutex
이 설정은 portable and always provided Mutex variant를 지정하며, 물리적인 파일이 Mutext로 사용된다. /path/to/mutex는 로컬 디스크 파일시스템을 사용해야 하며, NFS나 AFS 파일시스템에 위치하는 파일을 사용해서는 안된다.
Notice: 내부적으로, Apache 부모 프로세스(parent process)의 Process ID(PID)는 그 PID를 유일하게 만들기 위해 자동으로 /path/to/mutext에 덧붙여(appended)짐으로써 PID의 충돌을 막아준다.
sem
이 설정은 가장 훌륭한(elegant) 방법이지만 가장 non-portable한 Mutex variant이며, SysV IPC Semaphore (under Unix)와 Windows Mutex (under Win32)가 사용된다. 이 경우 해당 platform(OS)가 이 설정을 지원하여야만 한다.
example : SSLMutex file:/usr/local/apache/log/ssl_mutex
SSLRandomSeed
서버가 시동할 때(context가 startup인 경우) 혹은 새로운 SSL 연결이 이루어질 때 SSLeay의 Pseudo Random Number Generator(PRNG)의 seeding을 위한 하나 혹은 그 이상의 seed source를 설장한다.
- ssleay : it is a form of open-source secure sockets layer implementation.
- PRNG : 유사난수 생성기,
- 유사난수: 난수를 흉내내기 위해 알고리즘으로 생성되는 값
가능한 source variant
builtin
언제든지 사용 가능한 builtin seeding secure로서 이 경우 실행 시에 최소한의 CPU cycle을 소비하며, 아무런 결점없이 사용할 수 있다.
단점은 실질적으로 그다지 강력하지 못한 소스이기 때문에, 부가적인 seeding source를 지정하는 것이 좋다.
file:/path/to/source
PRNG의 seeding을 위해 /path/to/source로 지정한 외부 파일을 사용한다.
Bytes가 명시된 경우에는 지정된 byte 수만큼의 파일의 첫번째부분터의 바이트가 entropy를 생성하는데 사용되며, Bytes가 명시되지 않은 경우에는 파일 전체가 entropy를 형성한다. 이 설정은 특히 startup time의 seeding에 사용되며, /dev/random 이나 /dev/unrandom device를 사용한다.
- /dev/random, /dev/unrandom : 유닉스 계열 운영 체제에서 차단 방식의 유사난수 발생기의 역할을 수행하는 특수 파일.
exec:/path/to/program
PRNG의 seeding을 위한 소스로서 /path/to/program에 지정된 실행가능한 외부 프로그램을 사용한다. 이 설정은 단지 startup time에만 사용하며, 매우 강력한 seeding을 필요로 하는 경우에 사용된다. 이 설정을 connection context에 사용하는 것은 서버의 속도를 매우 저하시키기 때문에 보통 connection context에 외부 프로그램을 사용하는 것은 피해야 한다.
example:
SSLRandomSeed startup builtin
SSLRandomSeed startup file:/dev/random
SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed startup exec:/usr/local/bin/truerand 16
SSLRandomSeed connect builtin
SSLRandomSeed connect file:/dev/random
SSLRandomSeed connect file:/dev/urandom 1024
SSLSessionCache
이 directive는 global/inter-process SSL Session Cache의 storage type을 지정하며, 이 cache는 병렬적인 요청 프로세스(parallel request processing)의 속도를 개선해주는 역할을 한다.
동일한 서버 프로세스(HTTP keep-alive를 통한)에 대한 요청에 대해서 SSLeay는 SSL session information을 로컬에 저장을 한다. 그러나 modern client는 이미지나 다른 데이터들을 parallel request를 통하여 요청하기 때문에 (보통 4개까지의 parallel request), 이런 요청들은 서로 다른 pre-forked process에 의해 처리된다. inter-process cache는 필요없는 session handshake를 피할 수 있게 해준다.
⇒ process 및 thread가 공통으로 세션 캐시를 사용할 수 있도록 shared memory에 저장하도록 설정하고 세션캐시 메모리 공간을 설정한다.
storage type
- none
- Global/inter-process Session Cache를 사용하지 않으며, 기본 설정(default)이다. 기능 상의 문제는 없으나, 현저한 속도 저하가 생긴다.
- dmb:/path/to/data/file
- 서버 프로세스들에 대한 local SSLeay memory cache를 동기화(synchronizing)하기 위해 로컬 디스크에 있는 DBM hashfile을 사용한다. 클라이언트의 요청에 대한 현저한 속도 향상이 생기며, 이 설정을 사용하는 것이 권장된다. (mod_socache_dbm)
- shmcb:/path/to/datafile[(size)]
- This make use of a high-performance cyclic bufer inside a shared memory segment in RAM to synchronzie the local Open SSL memory caches of the server processes. This is the recommended session cache. To use this, ensure that mod_socache_shmcb
example
SSLSessionCache "dbm:/usr/local/apache/logs/ssl_gcache_data"
SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_gcache_data(512000)"
SSLSessionCacheTimeout
이 directive는 global/inter-process SSL Session Cache와 SSLeay internal memory cache에 저장된 정보들에 대한 timeout을 초단위로 지정한다. 설정 값은 최저 15초이며 실제로 실행될 서버에서는 보통 300초 이상을 지정한다.
example
SSLSessionCacheTimeout 600
SSLCipherSuite
이 directive는 SSL handshake phrase 단계에서 클라이언트와 협상(negotiation)할 수 있는 Cipher Suite를 설정하며, 이를 위해 콜론(: )으로 구분되는 SSLeay cipher specification들로 이루어진 스트링을 directive의 값으로 지정한다.
- none: 리스트에 cipher를 포함시킨다
- : cipher를 리스트에 포함시키며 또한 리스트의 현재 위치로 가져다 놓는다
- : 리스트로부터 cipher를 제거한다(이후에 다시 포함시킬 수 있다)
- ! : 리스트로부터 cipher를 완전히 제거한다 (이후에 다시 포함시킬 수 없다)
SSLCertificateFile
서버에 대한 PEM-encoding되어진 증명서(Certificate) 파일을 지정하며, 부가적으로(optionally) 그 증명서에 대응하는 RSA 개인키를 지정한다(같은 파일에 개인키가 포함되어 있는 경우). 만약 증명서에 포함되어 있는 개인키가 암호화되어져 있는 경우 startup 시에 Pass Phrase를 입력받는 dialog가 실행된다.
SSLCertificateKeyFile
서버에 대한 PEM-encoding되어진 개인키를 지정한다. 개인키가 SSLCertificateFile directive에서 지정한 증명서에 포함되어져 있지 않은 경우 따로 개인키를 저장하고 있는 파일을 지정하기 위해 이 부가적인 directive를 사용하게 된다. 만약 SSLCertificateFile directive가 사용되고 증명서 파일에 개인키도 포함되어 있는 경우에는 이 directive를 사용할 필요가 없다. 그러나 증명서에 개인키를 포함하는 것은 실질적인 면에서 권장되지 않으며, 증명서와 개인키를 따로 분리해서 저장하는 것이 좋다. 만약 지정된 개인키가 암호화되어져 있다면 startup 시에 역시 Pass Phrase를 물어보는 dialog가 실행되게 된다.
⇒ SSLPassPhraseDialog 를 사용하여 자동화할 수 있다.
SSLCACertificatePath
Certificate Authority(CA)의 증명서가 위치한 디렉토리를 지정하며, 이 CA 증명서는 Client Authentication을 할 때 클라이언트의 증명서를 확인(verify)하기 위해 사용된다.
이 디렉토리에 있는 파일들은 PEM-encoding되어져야 하며, hash filename을 통하여 접근되어진다. 따라서 증명서 파일을 이 위치에 꼭 두어야 하는 것은 아니다. 이 경우 hash-value.N이라는 이름을 가지는 심볼릭 링크를 생성해야 하며, 항상 이 디렉토리가 적절한 심볼릭 링크를 가지고 있는가를 확인해야 한다. 이를 위해서는 mod_ssl에 포함되어 있는 Makefile을 사용한다.
SSLCACertificateFile
이 directive는 설정하고자 하는 모든 CA들의 증명서들을 모아둘 수 있는 all-in-one 파일을 지정하며, 그 증명서들은 Client Authentication에 사용된다. 실제로 이 파일은 PEM-encoding되어 있는 여러 개의 증명서 파일들을 선호도(preference)에 따라 연달아 덧붙여둔 것이다.
'프로그래밍 노트 > 인프라' 카테고리의 다른 글
[nginx] mac os에 nginx를 설치해보자!! (0) | 2020.04.10 |
---|---|
Reverse Proxy, Forward Proxy (프록시란?) (2) | 2020.03.03 |
Apache <Directory> 태그 (0) | 2019.11.03 |
Apache2.4 httpd.conf 설정파일 완전 분석 (0) | 2019.11.03 |
Apache 2.4 접근제어(Access Control) (0) | 2019.11.03 |