서버 운영/APM 서버 구축

[Ubuntu 20.04 - Apache2 서버] security.conf의 기본값에 사용된 지시어 설명

씨실과 날실 2020. 10. 15. 09:00

 

[관련 게시물]

Ubuntu 20.04 LTS에서 APM 설치

2020/09/14 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - 아파치(Apache2 설치

2020/09/16 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - 마리아DB(MariaDB) 10.3 설치

2020/09/18 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - 마리아DB(MariaDB) 10.5 설치

2020/09/20 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - PHP 7.4 설치

2020/09/22 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - APM 설치 후 방화벽 설정

2020/09/24 - [서버 운영/APM 서버 구축] - MariaDB 10.4 이후의 계정 인증 관련 변화(unix_socket, mysql_native_password 인증 / 계정, 암호 및 전역 권한 정보 저장 테이블 변경 등)

2020/09/26 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 기본 환경 파일 설정 - apache2.conf 기본 설정

2020/09/28 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 기본 환경 파일 설정 - php.ini 기본 설정

 

Ubuntu 20.04에서 설치한 Apache2 서버 주요 설정 파일 원문

2020/09/30 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 목록

2020/10/05 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 원문 - Apache2

2020/10/07 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 원문 - PHP 7.4 - php.ini

Ubuntu 20.04에서 설치한 Apache2 서버 주요 설정 파일 내 지시어 설명

2020/10/09 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] apache2.conf의 기본값에 사용된 지시어 설명

2020/10/11 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] ports.conf 의 기본값에 사용된 지시어 설명

2020/10/13 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] envvars의 기본값에 사용된 지시어 설명

2020/10/15 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] security.conf의 기본값에 사용된 지시어 설명

2020/10/17 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] 000-default.conf의 기본값에 사용된 지시어 설명

2020/10/19 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] default-ssl.conf의 기본값에 사용된 지시어 설명


Ubuntu 20.04에서 phpMyAdmin 설치 및 설정

2021.02.20 - [서버 운영/APM 서버 구축] - 우분투 20.04에서 phpMyAdmin 설치 01 - 저장소 설치

2021.03.15 - [서버 운영/APM 서버 구축] - 우분투 20.04에서 phpMyAdmin 설치 02 - Apache 서버 관리자를 위한수동 설치(버전 5.1.0 기준)

2021.03.17 - [서버 운영/APM 서버 구축] - 우분투 20.04에서 phpMyAdmin 설치 03 - 보안강화 작업

2021.03.19 - [서버 운영/APM 서버 구축] - phpMyAdmin 설치 04 - 웹호스팅 사용자를 위한 수동 설치(버전 5.1.0 기준)

2021.03.21 - [서버 운영/APM 서버 구축] - phpMyAdmin 설치 05 - setup 페이지를 통한 구성 파일 생성

Ubuntu 18.04 LTS에서 APM 설치

2018/11/09 - [서버 운영/APM 서버 구축] - Apache 서버 설치

2018/11/14 - [서버 운영/APM 서버 구축] - MariaDB 설치

2018/11/16 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 1

2018/11/16 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 2 - ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded

2018/11/16 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 3

2018/11/19 - [서버 운영/APM 서버 구축] - PHP7 설치

2018/11/21 - [서버 운영/APM 서버 구축] - 서버 환경 파일 수정 - php.ini, apache2.conf

 

Ubuntu 18.04 LTS에서 MariaDB 백업 및 업그레이드

2019/01/15 - [서버 운영/APM 서버 구축] - MariaDB & MySQL 백업과 복원 - Nextcloud 14

2019/06/27 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 (Upgrading from MariaDB 10.3 to MariaDB 10.4)

 

Ubuntu 18.04 LTS에서 PHP 버전 전환

2019/07/05 - [서버 운영/APM 서버 구축] - Apache와 Shell에서 PHP 버전 전환하기(How to Switch between Multiple PHP Version)

 

Ubuntu 18.04 LTS에서 phpmyadmin 설치 및 운용

2018/11/23 - [서버 운영/APM 서버 구축] - phpmyadmin 설치 - APT 패키지 관리자를 통한 설치

2019/06/18 - [서버 운영/APM 서버 구축] - APT 패키지 관리자를 통해 설치한 phpMyAdmin 업그레이드 방법(업그레이드 버전 4.9.0.1)

2019/07/01 - [서버 운영/APM 서버 구축] - phpMyAdmin 수동 설치 01 - 일반 설치

2019/07/03 - [서버 운영/APM 서버 구축] - phpMyAdmin 수동 설치 02 - 심볼릭 링크를 이용한 보안 접속

2019/06/16 - [서버 운영/APM 서버 구축] - phpMyAdmin 4.6.6deb5와 PHP 7.2 간 호환성 문제 해결 - Warning in ./libraries/sql.lib.php#613

 

XAMPP 설치 및 운용

2019/04/20 - [서버 운영/서버 구축 꾸러미] - XAMPP에 대하여(버전 7.1.28 / 7.2.17 / 7.3.4)

2019/04/22 - [서버 운영/서버 구축 꾸러미] - XAMPP for Windows 7.3.4 인스톨러 설치

2019/04/25 - [서버 운영/서버 구축 꾸러미] - XAMPP for Windows 설정

2019/06/03 - [서버 운영/서버 구축 꾸러미] - XAMPP 포터블(portable) 사용법

2019/06/05 - [서버 운영/서버 구축 꾸러미] - XAMPP for Linux 4.3.5 설치 및 사용법

 

서버 운영을 위한 관련 연재글

2018/11/07 - [리눅스/Ubuntu] - 방화벽 설정 - ufw

2018/11/12 - [서버 운영/버추얼박스(VirtualBox)] - 가상머신(Virtualbox) 내 서버 외부접속

2019/01/05 - [미디어위키/미디어위키 설치 및 관리] - 호스트 컴퓨터에서 가상머신 내 미디어위키 접속 및 작업을 위한 버추얼박스 포트포워딩 설정

2019/03/15 - [서버 운영/APM 서버 구축] - PHP 7.3으로의 업그레이드 및 사용 연기 권장 안내 - PHP Notice: compact(): Undefined variable:

 

 

 

security.conf  파일에 대한 개략적인 설명

Apache2 서버의 보안 관련 설정을 하는 파일입니다.

 

security.conf 원문

2020/09/30 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 목록

2020/10/05 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 원문 - Apache2

 

지시어 사용 안내 설명 주석 제거 후 원문


#<Directory />
#   AllowOverride None
#   Require all denied
#</Directory>


#ServerTokens Minimal
ServerTokens OS
#ServerTokens Full


#ServerSignature Off
ServerSignature On


TraceEnable Off
#TraceEnable On


#<DirectoryMatch "/\.svn">
#   Require all denied
#</DirectoryMatch>


#Header set X-Content-Type-Options: "nosniff"


#Header set X-Frame-Options: "sameorigin"


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

 


 

#<Directory />
#   AllowOverride None
#   Require all denied
#</Directory>

위 구문은 주석처리로 비활성화되어 있습니다.

주석을 제거하면 추후에 명시적으로 허용되는 디렉토리를 제외하고 전체 파일 시스템에 대한 액세스를 비활성화합니다.

이 구문은 일부 웹 애플리케이션 데비안 패키지와 함께 제공되는 구성을 중단합니다.

 

지시어 : Directory

요약 설명 : 지정한 디렉터리와 하위 디렉터리 및 해당 내용에만 적용되는 지시어 모음 작성

구문 : <Directory directory-path> ... </Directory>

기본값 :

사용 장소 : 주서버 설정(server config) - httpd.conf 또는 apache2.conf

   가상호스트 (virtual host) 섹션 안

상태 : Core

모듈 : core

<Directory> ~ </ Directory> 컨테이너는 지정한 디렉터리와 하위 디렉터리 및 각 디렉터리 내 파일에만 적용되는 지시어 모음을 작성하는 데 사용됩니다.

 

<Directory> 컨테이너 사용 주의점

<Directory> 지시어는 중첩될 수 없으며 <Limit> 또는 <LimitExcept> 섹션에 나타날 수 없습니다.

 

디렉터리 지정 방법

디렉터리 경로는 명시적으로 경로를 지정해주거나, Unix 셸 스타일의 패턴 일치를 지원하는 와일드 카드 문자열을 이용해 지정하거나 또는 정규표현식을 이용해 지정할 수 있습니다.

 

Unix 셸 스타일의 패턴 일치를 지원하는 와일드 카드 문자열을 이용한 디렉터리 지정

Unix 셸 스타일의 패턴 일치를 지원하는 와일드 카드 문자열

? : 단일 문자 일치

* : 일련의 모든 문자 일치

[] : 문자 범위 지정

 

<Directory "/usr/local/httpd/htdocs">
  Options Indexes FollowSymLinks
</Directory>

위와 같은 <Directory> 컨테이너를 작성한다고 합시다. 위 지정 디렉터리를 와일드카드를 이용하여 다르게 표현해봅시다.

<Directory "/usr/local/*/htdocs"> (O)

<Directory "/usr/*/htdocs"> (X)

앞에서 알아본 패턴 일치 와일드 카드문자열 중 어떤 것도 '/(슬래시)' 문자와는 일치하지 않습니다. 따라서 위 상자의 아래 구문은 지정하고자 하는 디렉터리와 일치하지 않습니다.

 

<Directory "/usr/local/httpd/htdocs"> (O)

<Directory /usr/local/httpd/htdocs> (O)

<Directory "/usr/local/httpd/ht docs"> (O)

<Directory /usr/local/httpd/ht docs> (X)

 일반적으로 디렉터리 경로를 지정할 때 경로를 따옴표로 감쌀 필요는 없지만 경로에 공백이 있는 경우에는 반드시 따옴표로 감싸주어야 합니다. 셸스크립트에서 공백은 인수의 끝으로 이해하여 오류를 발생하기 때문입니다.

 

정규표현식을 이용한 디렉터리 지정

디렉터리 경로는 정규표현식으로 지정할 수도 있습니다.

<Directory "^/www/[0-9]">

</Directory>

위 구문의 경우 아래와 같이 '/www/세자리 숫자'로 지정된 경우의 디렉터리를 의미합니다.

/www/012

/www/345

/www/678

 

구성 파일 안에 정규표현식으로 지정한 <Directory> 컨테이너가 포함되어 있는 경우, 명시적으로 디렉터리 경로를 지정하거나 패턴 일치를 사용하여 디렉터리 경로를 지정하여 작성한 <Directory> 컨테이너 지시어나  .htaccess 문서 안에 작성한 <Directory> 컨테이너를 먼저 적용한 다음에 정규표현식으로 지정한 컨테이너의 지시어를 먼저 작성된 순으로 적용하게 됩니다. 

 

지시어 적용 순서

디렉터리를 정규표현식으로 지정하지 않은 여러 <Directory> 섹션이 문서를 포함하는 디렉토리 (또는 상위 디렉터리들 중 하나)와 일치하는 경우, 섹션 안의 지시어는 여러 디렉터리에 산재되어 있는 .htaccess 파일의 지시어와 함께 <Directory> 섹션의 지정 디렉터리와 경로가 가까운 순서대로 적용됩니다.

<Directory "/">
  AllowOverride None
</Directory>

<Directory "/home">
  AllowOverride FileInfo
</Directory>

예를 들어 구성 파일에 위와 같은 <Directory> 컨테이너 섹션이 있다고 가정합시다.

/home/web/dir/doc.html 문서에 액세스하기 위한 단계는 다음과 같습니다.

01. 지시어 AllowOverride None를 적용합니다.

☞ 이 지시어는 .htaccess 파일이 비활성화되어 있을 때 순서입니다. 만약 .htaccess 파일이 존재하여 활성화되어 있다면 .htaccess 파일 안의 지시어가 먼저 적용됩니다.

 

02. 지시어 AllowOverride FileInfo를 적용합니다.

☞ FileInfo가 포함되어 있는 디렉터리와 <Directory> 섹션의 지정 디렉터리가 일치한 경우 해당 섹션 안의 지시어 AllowOverride FileInfo를 적용합니다.

 

03. home/.htaccess, /home/web/.htaccess 및 /home/web/dir/.htaccess의 모든 FileInfo 지시어를 순서대로 적용합니다.

☞ <Directory> 섹션의 지정 디렉터리와 경로가 가까운 순서대로 .htaccess 파일을 적용합니다.

 

<Directory "/"> 액세스 기본 설정값

<Directory "/">에 대한 기본 액세스 설정값은 모든 액세스 허용으로 설정되어 있습니다. 즉, Apache2 서버는 URL에서 매핑된 모든 파일을 제공합니다. 다음과 같이 변경하는 것이 좋습니다.

<Directory "/">
  Require all denied
</Directory>

그 다음 액세스를 허용할 디렉터리만 따로 재정의해야 합니다.

 

우분투에서 저장소를 통해 Apache를 설치한 경우 위 구문이 # 기호로 주석처리되어 있습니다. # 기호를 지워 주석 처리를 제거하고 활성화해주시면 됩니다.

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/core.html#directory

 


 

#   AllowOverride None

해당 디렉터리에서 .htaccess 파일의 지시어 구문을 무시합니다.

 

지시어 : AllowOverride

요약 설명 : .htaccess 파일에서 허용되는 지시어 유형

구문 : AllowOverride All|None|directive-type [directive-type] ...

기본값 : AllowOverride None (2.3.9 이후), AllowOverride All (2.3.8 이전)

사용 장소 : <Directory> 컨테이너 섹선 안에서만 사용 가능

상태 : Core

모듈 : core

서버가 지시어 AccessFileName에 지정된 파일(일반적으로 .htaccess 파일)을 찾으면 해당 파일에 선언된 지시어가 이전 구성 지시어를 대체할 수 있는지 확인합니다.

AllowOverride 지시어는 정규표현식 없이 지정된 <Directory> 섹션에서만 유효하며 <Location>, <DirectoryMatch> 또는 <Files> 섹션에서는 유효하지 않습니다.

 

AllowOverride None
AllowOverrideList None

<Directory> 컨테이너 섹선 안에 위 상자와 같이 설정된 경우 .htaccess 파일이 완전히 무시됩니다. 즉 .htaccess 파일이 비활성화됩니다.

 

AllowOverride All

<Directory> 컨테이너 섹선 안에 위 상자와 같이 설정된 경우 .htaccess 컨텍스트가 있는 모든 지시어가 .htaccess 파일에서 허용됩니다.

 

사용 가능한 지시어 유형은 아래와 같은 것들이 있습니다.

AuthConfig

(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, etc.)

 

 

 

FileInfo

문서 유형

(ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, 그리고 mod_mime Add* 와 Remove* 지시어)

 

문서 메타 데이터

(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)

 

mod_rewrite 지시어

(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)

 

mod_alias 지시어

(Redirect, RedirectTemp, RedirectPermanent, RedirectMatch), 와  mod_actions 지시어의  Action)

 

 

Indexes

(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, etc.)

 

 

Limit

(Allow, Deny and Order)

 

 

Options[=Option,...]

특정 디렉터리 기능

(Options and XBitHack).

 

각 지시어 유형에 의해 활성화되는 지시어에 대한 자세한 내용은 링크를 참고하시기 바랍니다.

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride

 


 

#   Require all denied

 

지시어 : Require

요약 설명 : 인증된 사용자에게 권한이 있는지 테스트

구문 : Require [not] entity-name [entity-name] ...

기본값 : 

사용 장소 : 디렉터리 섹션 안

   .htaccess 파일

상태 : Base

모듈 : mod_authz_core

이 지시어는 인증된 사용자에게 권한이 있는지 여부를 확인합니다.

mod_authz_core 모듈은 다음과 같은 일반 권한 부여 공급자를 제공합니다.

일반 액세스 조건

Require all granted

무조건 액세스가 허용됩니다.

Require all denied

무조건 액세스가 거부됩니다.

Require env env-var [env-var] ...

주어진 환경 변수 중 하나가 설정된 경우에만 액세스가 허용됩니다.

Require method http-method [http-method] ...

주어진 HTTP methods를 통해서만 액세스가 허용됩니다.

Require expr expression

표현식이 참일 때만 액세스를 허용합니다.

 

 

아래는 mod_authz_user, mod_authz_host, 그리고 mod_authz_groupfile 모듈에서 제공하는 허용 구문들 중 일부입니다.

 

Require user userid [userid] ...

지정된 사용자만 리소스에 액세스할 수 있습니다.

Require group group-name [group-name] ...

지정된 그룹의 사용자만 리소스에 액세스할 수 있습니다.

Require valid-user

모든 유효한 사용자들이 액세스할 수 있습니다.

Require ip 10 172.20 192.168.2

지정된 IP 주소 범위의 클라이언트만이 리소스에 액세스할 수 있습니니다.

Require 옵션을 구성케 하는 다른 인증 모듈에는 mod_authnz_ldap, mod_authz_dbm, mod_authz_dbd, mod_authz_owner 및 mod_ssl이 있습니다.

대부분의 경우 완벽한 인증 및 권한 부여 구성을 위해서는 Require는 AuthName, AuthType 및 AuthBasicProvider 또는 AuthDigestProvider 지시어 그리고 AuthUserFile 및 AuthGroupFile (사용자 및 그룹 정의용)과 같은 지시어들을 반드시 수반해야 합니다.

그 예는 아래와 같습니다.

AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile "/web/users"
AuthGroupFile "/web/groups"
Require group admin

위 지시어들을 해석하면 다음과 같습니다.

AuthType Basic

인증 유형을 Basic으로 설정합니다. 이 인증은 mod_auth_basic 모듈의 HTTP Basic Authentication을 사용하여 지정된 제공자에서 사용자를 검색하여 액세스를 제한합니다.

Digest 인증 유형은 mod_auth_digest 모듈을 이용하여 HTTP MD5 Digest Authentication을 구현하여 암호를 MD5로 변환해 전송합니다. 그러나 이 인증 유형이 암호를 평문으로 보내는 Basic 인증 유형에 비해 보안상 커다란 이점을 제공한다고 보기는 어렵습니다.

 Apache 개발진은 그보다는 Basic 인증을 사용하고 mod_ssl을 사용하여 전체 연결을 암호화할 것을 권장하고 있습니다.

SSL 암호화는 아래 링크를 참고하시기 바랍니다.

 

Form 인증 유형은 od_auth_form 모듈을 이용하여 HTML로 짜인 로그인 양식을 사용하여 주어진 제공자에서 사용자를 조회하여 액세스을 제한할 수 있습니다.

 

AuthName "Restricted Resource"

디렉터리에 대한 인증용 별명을 "Restricted Resource"로 설정합니다.

이 지시어는 해당 디렉터리에 대한 인증용 별명을 설정합니다. 이것은 사용자가 액세스하고자 하는 디렉터리에 어떤 사용자 이름과 암호를 보낼지 식별할 수 있는 디렉터리별 별명을 클라이언트에 보냅니다.

 

AuthBasicProvider file

해당 디렉터리 위치에서 사용자를 인증할 제공자를 지정합니다. 값이 On이면 기본제공자(file)를 선택합니다.

 

AuthUserFile "/web/users"

인증 사용자 조회에 사용할 파일로 "/web/users"를 지정합니다.

이 지시어는 사용자 인증에 사용할 사용자명와 암호 목록을 저장하는 파일을 지정합니다.

 

AuthGroupFile "/web/groups"

인증 사용자 그룹 조회에 사용할 파일로 "/web/groups"를 지정합니다.

이 지시어는 사용자 인증에 사용할 사용자 그룹 목록을 저장하는 파일을 지정합니다.

 

Require group admin

admin 그룹 사용자들에게 액세스 권한을 부여합니다.

이러한 방식의 액세스 제어는 대부분의 서버 구성에 효과적이며 권장됩니다.

 

Require 지시어의 결과는 앞서 기술한 구문에서처럼 not 옵션을 사용하여 부정할 수 있습니다. 다른 부정 인증 지시어 <RequireNone>과 마찬가지로 Require 지시문이 부정되면 실패하거나 중립적 인 결과만 반환할 수 있으므로 요청을 독립적으로 인증할 수 없습니다.

<Directory "/www/docs">
    <RequireAll>
        Require group alpha beta
        Require not group reject
    </RequireAll>
</Directory>

위의 예에서는 reject 그룹에 있는 사용자를 제외하고 alpha 와 beta 그룹의 모든 사용자에게 /www/docs 디렉터리에 대한 액세스 권한이 부여됩니다.

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

 


 

    Options FollowSymLinks

 

지시어 : Options

요약 설명 : 특정 디렉토리에서 사용할 수있는 기능을 구성

구문 : Options [+|-]option [[+|-]option] ...

기본값 : Options FollowSymlinks

사용 장소 : 주서버 설정(server config) - httpd.conf 또는 apache2.conf

   가상호스트 (virtual host) 섹션 안

   디렉터리 섹션 안

   .htaccess 파일

상태 : Core

모듈 : core

Options 지시어는 특정 디렉토리에서 사용할 수 있는 서버 기능을 제어합니다.

옵션을 없음으로 설정하면 추가 기능이 활성화되지 않거나 다음 중 하나 이상이 활성화됩니다.

All

MultiView를 제외한 모든 옵션을 허용합니다.

 

ExecCGI

mod_cgi를 사용한 CGI 스크립트의 실행을 허용합니다.

 

FollowSymLinks

서버가 이 디렉토리의 심볼릭 링크를 따릅니다. 이것이 기본 설정입니다.

FollowSymLinks 및 SymLinksIfOwnerMatch 옵션은 <Directory> 섹션 또는 .htaccess 파일에서만 작동합니다.

 

Includes

mod_include에서 제공하는 서버 측 Includes가 허용됩니다.

 

IncludesNOEXEC

서버 측 Includes은 허용되지만 #exec cmd 및 #exec cgi는 비활성화됩니다.

 

Indexes

디렉터리에 매핑되는 URL이 요청되고 해당 디렉터리에 DirectoryIndex (예 : index.html)가 없는 경우 mod_autoindex는 형식화된 디렉터리 목록을 반환합니다.

 

MultiViews

mod_negotiation을 사용하여 처리(내용협상(Content Negotiation))된 "MultiViews"는 허용됩니다.

 

SymLinksIfOwnerMatch

서버는 링크와 동일한 사용자 ID가 대상 파일 또는 디렉토리를 소유한 심볼릭 링크만 따릅니다.

FollowSymLinks 및 SymLinksIfOwnerMatch 옵션은 <Directory> 섹션 또는 .htaccess 파일에서만 작동합니다.

일반적으로 여러 옵션이 디렉터리에 적용 가능한 경우 가장 구체적인 옵션이 사용되고 다른 옵션은 무시됩니다.

Options 지시어의 모든 옵션 앞에 + 또는 - 기호가 있으면 옵션이 병합되거나 제거됩니다. +가 앞에 오는 모든 옵션은 현재 시행중인 옵션에 추가되고 - 기호 앞에 있는 모든 옵션은 현재 시행중인 옵션에서 제거됩니다.

 

<Directory "/web/docs">
  Options Indexes FollowSymLinks
</Directory>

<Directory "/web/docs/spec">
  Options Includes
</Directory>

위는 +, - 기호를 사용하지 않는 경우의 예입니다. 그러면 /web/docs/spec 디렉터리에 Includes만 설정됩니다.

 

<Directory "/web/docs">
  Options Indexes FollowSymLinks
</Directory>

<Directory "/web/docs/spec">
  Options +Includes -Indexes
</Directory>

위는 +, - 기호를 사용한 경우의 예입니다. /web/docs/spec 디렉터리에 대해 FollowSymLinks 및 Include 옵션이 설정되었습니다.

 

다른 설정이 없는 경우 기본값은 FollowSymlinks입니다.

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/core.html#options

 


 

ServerTokens OS
#ServerTokens Full
#ServerTokens Minimal

이 지시문은 서버 HTTP 응답 헤더로 반환하는 내용을 구성합니다.

기본값은 OS-Type에 대한 정보를 전송하는 'OS'입니다.

 

# The default is 'Full' which sends information about the OS-Type and compiled in modules.

 

원문에는 아래와 위같이 설명되어있습니다만 이는 Apache2의 소스 파일을 다운받아 컴파일 설치할 경우 적용되는 기본값이고 지금처럼 우분투 저장소를 통해 패키지 설치하는 경우에는 우분투를 유지보수하는 측에서 자신들의 리눅스 배포판에 맞게 커스터마이징한 기본 설정값이 적용되는데 그 값이 OS입니다.

물론 다른 설정값과 마찬가지로 서버 관리자가 얼마든지 수정할 수 있습니다. 

 

지시어 : ServerTokens

요약 설명 : 서버 HTTP 응답 헤더를 구성

구문 : ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

기본값 : ServerTokens Full

사용 장소 : 주서버 설정(server config) - httpd.conf 또는 apache2.conf

상태 : Core

모듈 : core

이 지시어는 서버 HTTP 응답 헤더로 반환하는 내용을 구성합니다. 좀더 자세히 설명하자면 클라이언트의 요청에 따라 반환되는 서버 응답 헤더 필드가 컴파일된 모듈에 대한 정보뿐만 아니라 서버의 일반 OS 유형에 대한 설명을 포함하는지 여부를 제어하는 지시어입니다.

설정 가능한 값들은 아래와 같습니다.

Full | OS | Minimal | Minor | Major | Prod

 

각 설정값별 전송 내용의 예는 아래와 같습니다.

ServerTokens Full (또는 미 지정시)

    Server: Apache/2.4.2 (Unix) PHP/4.2.2 MyMod/1.2

 

ServerTokens OS

    Server: Apache/2.4.2 (Unix)

 

ServerTokens Min[imal]

    Server: Apache/2.4.2

 

ServerTokens Minor

    Server: Apache/2.4

 

ServerTokens Major

    Server: Apache/2

 

ServerTokens Prod[uctOnly]

    Server: Apache

이 설정은 서버 전체에 적용되며 가상 호스트별로 활성화하거나 비활성화 할 수는 없습니다.

이 지시어는 또한 아래에 서술할 ServerSignature 지시어가 제공하는 정보를 제어하기도 합니다.

 

인터넷을 돌아다녀 보면 Apache2 서버 보안 설정을 안내하는 블로그 글들을 볼 수 있습니다. 그때 보안을 위해 ServerTokens Prod로 설정했다거나 혹은 그렇게 설정할 것을 권장하는 글들을 볼 수 있습니다.

그러나 Apache2 개발진 또는 문서화 기여진들은 아래와 같이 말하고 있습니다.

 

Setting ServerTokens to less than minimal is not recommended because it makes it more difficult to debug interoperational problems. Also note that disabling the Server: header does nothing at all to make your server more secure. The idea of "security through obscurity" is a myth and leads to a false sense of safety.

 

위 내용을 번역하면 다음과 같습니다.

ServerTokens를 Min[imal] 이하로 설정하면 상호 운용 문제를 디버깅하기가 더 어려워지므로 권장되지 않습니다.

서버 보안 강화 목적으로 Server : header를 비활성화하는 것은 그다지 도움이 되지 않습니다. 이른바 "모호함을 통한 보안"이라는 개념은 서버 관리자로 하여금 오히려 안전불감증으로 이끌게 할 수도 있습니다.

즉 전송되는 서버 정보를 가능한 최소화하는 설정만 믿고 그외 보안 관련 작업을 소홀히 하는 경향에 대한 경각심을 고취하는 말입니다.

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/core.html#servertokens

 


 

#ServerSignature Off
ServerSignature On

ServerSignature 지시어는 서버 생성 페이지에 바닥글을 출력할지 설정합니다.

 

지시어 : ServerSignature

요약 설명 : 서버 생성 문서에서 바닥 글을 구성

구문 : ServerSignature On|Off|EMail

기본값 : ServerSignature Off

사용 장소 : 주서버 설정(server config) - httpd.conf 또는 apache2.conf

   가상호스트 (virtual host) 섹션 안

   디렉터리 섹션 안

   .htaccess 파일

Override 옵션 : All

상태 : Core

모듈 : core

# 선택적으로 서버 생성 페이지 (내부 오류 문서, FTP 디렉토리 목록, mod_status 및 mod_info 출력 등)에 서버 버전 및 가상 호스트 이름이 포함된 행을 추가합니다. 단 CGI 생성 문서 또는 사용자 정의 오류 문서 등은 제외합니다.

 

예를 들어 서버에 존재하지 않는 웹문서를 요청하면 아래와 같은 문구가 출력됩니다.

Not Found

The requested URL was not found on this server.
Apache/2.4.41 (Ubuntu) Server at virtualhost01.net Port 443

 

해당 페이지의 소스를 까보면 아래와 같은 내용을 확인할 수 있습니다.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Server at virtualhost01.net Port 443</address>
</body></html>

위와 같이 존재하지 않는 웹문서를 요청하는 경우 404 오류 페이지(Not Found)를 표시합니다.

 

ServerSignature 지시어는 서버 생성 문서 (내부 오류 메시지, mod_proxy ftp 디렉터리 목록, mod_status 및 mod_info 출력 등)에 서버 버전 및 가상 호스트 이름 등이 포함된 바닥글 행을 구성합니다. 단 CGI 생성 문서 또는 사용자 정의 오류 문서 등은 제외합니다.

이러한 바닥글 줄을 사용하려는 이유는 프록시 체인에서 사용자가 체인으로 연결된 서버가 실제로 반환된 오류 메시지를 생성했는지 알 수 없기 때문입니다.


아래의 값들 중 하나로 설정합니다.

On | Off | EMail

기본값인 Off 설정은 바닥글 행을 억제합니다.

On 설정은 단순히 서버 버전 번호와 서버 가상 호스트의 ServerName을 포함하는 행만을 추가합니다. 이때 제공되는 서버 버전 번호의 세부 사항은 ServerTokens 지시어 설정에 의해 제어됩니다.

위에 올라가 있는 바닥글의 예의 경우 ServerTokens 설정값이 OS임을 알 수 있습니다.

 

EMail 설정은 추가적으로 ServerAdmin에 대한 "mailto :"참조 링크를 생성합니다. 따라서 ServerAdmin으로 메일을 보낼 수 있는 mailto: link를 포함하려면 "EMail"로 설정하십시오.

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/core.html#serversignature

 


 

TraceEnable Off
#TraceEnable On

TraceEnable 지시어는 TRACE method의 허용 여부를 설정하는 부분입니다.

TRACE는 쉽게 설명하자면 클라이언트가 보낸 요청을 그대로 반환하는 기능입니다.

 

지시어 : TraceEnable

요약 설명 : Trace requests에 따른 동작 설정

구문 : TraceEnable [on|off|extended]

기본값 : TraceEnable on

사용 장소 : 주서버 설정(server config) - httpd.conf 또는 apache2.conf

   가상호스트 (virtual host) 섹션 안

상태 : Core

모듈 : core

TraceEnable 지시어는 주 서버와 mod_proxy 모두에 대한 TRACE의 동작을 재정의합니다.

아래의 값들 중 하나로 설정합니다.

On | Off | extended

기본값인 TraceEnable on은 RFC 2616에 따른 TRACE를 허용하되, requests에 requests body가 수반하는 것을 허용하지 않습니다.

TraceEnable off는 주 서버와 mod_prox가 405 (비허용 메서드) 오류 메시지를 클라이언트에 전송합니다.

마지막으로 TraceEnable extended 지시어을 사용하여 requests body를 반영해 전송할 수 있습니다.

그러나 이 extended는 오로지 서버 테스트 테스트 및 진단 목적으로만 사용해야 합니다.  왜냐하면 HTTP TRACE/TRACK method는 XST(Cross-site Tracing) 공격에 취약하기 때문입니다.

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://webhack.dynu.net/?idx=20161111.001

 

TRACE 메서드를 사용(TraceEnable on)한다고 해서 Apache httpd의 보안 취약점이 노출되지는 않습니다. TRACE 메서드는 HTTP/1.1 규격에 의해 정의됩니다.

그러나 TraceEnable extended는 앞서 언급한 바와 같이 XST(Cross-site Tracing) 공격에 취약하므로 반드시 테스트와 진단 목적으로만 사용해야 하며 실 서비스에는 적용하면 안 됩니다.

 

TraceEnable 설정값별 Trace requests 확인 예시

TraceEnable Off

study@study-VirtualBox:~$ curl -v -X TRACE http://virtualhost01.net
*   Trying 127.0.2.1:80...
* TCP_NODELAY set
* Connected to virtualhost01.net (127.0.2.1) port 80 (#0)
> TRACE / HTTP/1.1
> Host: virtualhost01.net
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Date: Tue, 20 Oct 2020 03:35:07 GMT
< Server: Apache/2.4.41 (Ubuntu)
< Location: https://virtualhost01.net/
< Content-Length: 293
< Content-Type: text/html; charset=iso-8859-1
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://virtualhost01.net/">here</a>.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Server at virtualhost01.net Port 80</address>
</body></html>
* Connection #0 to host virtualhost01.net left intact
study@study-VirtualBox:~$

 

위는 curl 패키지를 이용해 http:// 프로토콜로 웹사이트를 Trace한 경우의 모습입니다.

 

study@study-VirtualBox:~$ curl -v -X TRACE https://virtualhost01.net
*   Trying 127.0.2.1:443...
* TCP_NODELAY set
* Connected to virtualhost01.net (127.0.2.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* error:1408F10B:SSL routines:ssl3_get_record:wrong version number
* Closing connection 0
curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number
study@study-VirtualBox:~$

위는 curl 패키지를 이용해 https:// 프로토콜로 웹사이트를 Trace한 경우의 모습입니다.

 

TraceEnable On

study@study-VirtualBox:~$ curl -v -X TRACE http://virtualhost01.net
*   Trying 127.0.2.1:80...
* TCP_NODELAY set
* Connected to virtualhost01.net (127.0.2.1) port 80 (#0)
> TRACE / HTTP/1.1
> Host: virtualhost01.net
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Date: Tue, 20 Oct 2020 03:39:55 GMT
< Server: Apache/2.4.41 (Ubuntu)
< Location: https://virtualhost01.net/
< Content-Length: 293
< Content-Type: text/html; charset=iso-8859-1
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://virtualhost01.net/">here</a>.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Server at virtualhost01.net Port 80</address>
</body></html>
* Connection #0 to host virtualhost01.net left intact
study@study-VirtualBox:~$

위는 curl 패키지를 이용해 http:// 프로토콜로 웹사이트를 Trace한 경우의 모습입니다.

 

study@study-VirtualBox:~$ curl -v -X TRACE https://virtualhost01.net
*   Trying 127.0.2.1:443...
* TCP_NODELAY set
* Connected to virtualhost01.net (127.0.2.1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: self signed certificate
* Closing connection 0
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
study@study-VirtualBox:~$

위는 curl 패키지를 이용해 https:// 프로토콜로 웹사이트를 Trace한 경우의 모습입니다.

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/core.html#traceenable

 


 

#<DirectoryMatch "/\.svn">
#   Require all denied
#</DirectoryMatch>

/.svn 디렉터리에 대한 모든 요청을 거부하는 구문입니다.

위는 버전 관리 디렉토리에 대한 접근 금지 관련 구문입니다. 보다 정확히 설명하자면 형상관리/버전관리툴 중 하나인 Subversion을 사용하는 경우의 구문 예시입니다.

문서 루트(Document Root) 디렉터리에서 버전 제어 시스템을 사용하는 경우 해당 디렉토리에 대한 액세스를 거부해야합니다.

SVN(Subversion)에 대한 보다 자세한 설명은 아래 링크를 참고하시기 바랍니다.

생활코딩의 서브버전에 대한 동영상 강의

https://www.opentutorials.org/course/305/1962

 

SVN에 대한 인터넷 백과사전별 설명

https://ko.wikipedia.org/wiki/서브버전

https://en.wikipedia.org/wiki/Apache_Subversion

 

지시어 : DirectoryMatch

요약 설명 : 정규식과 일치하는 파일 시스템 디렉터리의 내용에 적용되는 지시어 모음 작성

구문 : <DirectoryMatch regex> ... </DirectoryMatch>

기본값 :

사용 장소 : 주서버 설정(server config) - httpd.conf 또는 apache2.conf

   가상호스트 (virtual host) 섹션 안

상태 : Core

모듈 : core

<DirectoryMatch> 섹션은 <Directory> 섹션과 동일하게 지정된 디렉터리 (및 그 안의 파일)에만 적용되는 지시어 그룹을 묶는 데 사용됩니다. 그러나 정규식을 인수로 사용합니다.

<DirectoryMatch "^/www/(.+/)?[0-9]/">
    # ...
</DirectoryMatch>

위 예시에서 디렉터리 지정에 사용된 졍규표현식을 해석하면 다음과 같습니다.

^/www/ : /www/로 시작하고

(.+/) : / 앞에 임의의 문자 하나 이상 있고

? : 바로 앞의 문자열이 존재하지 않거나 하나 있고

[0-9] :  0부터 9까지의 숫자들 중 하나가 존재하고

: 바로 앞의 문자가 출현하는 수가 셋

위 조건을 충족하는 디렉터리의 예를 나열하면 다음과 같습니다.

/www/012/
/www/h/345/
/www/html/678/

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/core.html#directorymatch

 


 

#Header set X-Content-Type-Options: "nosniff"

이 헤더 지시문을 위와 같이 설정하면 MSIE가 HTTP 헤더의 내용 유형에 의해 선언된 파일이 아닌 다른 것으로 해석하지 못하게 됩니다.

이 기능을 사용하기 위해서는 mod_headers 모듈이 활성화되어 있어야 합니다.

 

지시어 : Header

요약 설명 : HTTP 응답 헤더를 구성

구문 : Header [condition] set|append|add|unset|echo header [value] [early|env=[!]variable]

기본값 :

사용 장소 : 주서버 설정(server config) - httpd.conf 또는 apache2.conf

   가상호스트 (virtual host) 섹션 안

   디렉터리 섹션 안

   .htaccess 파일

Override 옵션: FileInfo

상태 : Extension

모듈 : mod_headers

Header 지시어는 HTTP 응답 헤더를 병합, 대체, 제거합니다. 내용 핸들러와 출력 필터가 실행된 직후에 헤더를 수정하기 때문에 보낼 헤더를 수정할 수 있습니다.

옵션 사양인 condition 인수는 사용 여부는 선택적이며 사용하는 경우 값으로 onsuccess(기본값, 생략 가능) 혹은 always를 사용합니다. 이는 어떤 내부 헤더표에 동작할지를 결정합니다.

 두 옵션의 차이점은 후자에 포함된 헤더가 오류 발생 시에도 응답에 추가되고 내부 리디렉션(예: 오류 문서 핸들러)에서 유지된다는 것입니다.

 

두 번째 인수에 따라 기능이 달라집니다. 두 번째 인수로 아래값 중 하나를 사용할 수 있습니다.

add

응답 헤더를 설정합니다.

append

응답 헤더가 동일한 이름의 기존 헤더에 추가됩니다.

echo

이 이름의 요청 헤더는 응답 헤더에 다시 표시됩니다.

edit/edit*

이 응답 헤더가 있는 경우 해당 값은 정규식을 통한 검색 및 교체에 의해 변환됩니다.

merge

이 응답 헤더는 추가되는 값이 쉼표로 구분된 헤더의 값 목록에 이미 표시되지 않는 한 존재하는 모든 동명의 헤더에 추가됩니다.

set

응답 헤더가 설정되면 이전 헤더를 이 이름으로 교체됩니다.

setifempty

요청 헤더가 설정되지만 이 이름의 이전 헤더가 없는 경우에만 해당됩니다.

unset

이 이름의 응답 헤더가 있으면 제거됩니다. 동일한 이름의 헤더가 여러 개 있는 경우 모두 제거됩니다.

note

이름이 지정된 응답 헤더의 값은 값별로 이름이 지정된 내부 메모에 복사됩니다.

위에 나열된 인수들 뒤에는 header 이름이 뒤따르는데 이때 :(쌍점 - colon)을 포함할 수도 있지만 반드시 요구되는 것은 아닙니다.

 

특징별 응답 헤더

대소문자 무시 : set, append, merge, add, unset, edit

value 인수 필요 : add, append, set

대소문자 구별 및 정규표현식 사용 : echo의 header 이름

 

value 인수에서 지원하는 형식기술자는 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/en/mod/mod_headers.html#header

 

Header 지시어에는 다음과 같은 옵션 인수가 있습니다.

early

조기 처리를 지정합니다.

env=[!]varname

환경변수 varname이 존재하는 경우에만 적용됩니다. varname 앞에 있는 !는 수행을 반전시키므로 varname이 설정되지 않은 경우에만 적용됩니다.

expr=expression

정규표현식이 참인 경우에만 적용됩니다. 표현 구문 및 평가의 세부사항은 ap_expr 문서에 기록되어 있습니다.

 

보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

https://httpd.apache.org/docs/2.4/mod/mod_headers.html#header

 

 


 

#Header set X-Frame-Options: "sameorigin"

이 헤더 지시문을 위와 같이 설정하면 다른 사이트에서 이 사이트의 페이지를 프레임으로 삽입하지 못하게 됩니다.

이것은 클릭 재킹(= 클릭 납치) 공격을 방어합니다. 클릭재킹에 대한 보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

클릭재킹에 대한 인터넷 백과사전별 설명

https://ko.wikipedia.org/wiki/클릭재킹

https://en.wikipedia.org/wiki/Clickjacking

 

클릭재킹에 대한 기사

https://zdnet.co.kr/view/?no=00000039173575

 

클릭재킹에 대한 추천 블로그 문서

https://webhack.dynu.net/?idx=20161117.003

이 기능을 사용하기 위해서는 mod_headers 모듈이 활성화되어 있어야 합니다.