[Apache2] 보안 서버 구축을 위한 노력 ㅠㅠ

Ubuntu Server 11.10, apache2 기준 작성.
(참고: 운영체제나 apache 버전에 따라 경로가 조금씩 다를 수 있으니, 터미널에서 grep 명령어를 사용해 검색해보자.)


POSTECH 웹 서버 취약점 점검..에서 발췌.

1. 서버 컴퓨터 OS는 최신 패치를 적용합시다.

2. 서버 컴퓨터에는 필요한 최소한의 프로그램만 설치합시다. 컴파일러 같은 거 깔아두면 최악..
우분투 서버 에디션을 갓 설치한 경우라면, 확인차 sudo apt-get remove gcc g++ python python3.. 정도만 해줘도 될 듯.

3. 관리자 PC의 IP만 접근 가능하게 설정해 두자.
/etc/apache2/sites-available/default 파일에서,
<Directory /var/www/관리자페이지>  # 관리자용 웹페이지, 혹은 관리자만 접근 가능해야 하는 디렉토리
  order deny,allow
  deny from all
  allow from 100.100.100.100
</Directory>
또한 시스템 루트 디렉토리는 allow from none, deny from all. 웹을 통해선 시스템을 헤집고 다닐 수 없어야 한다.
<Directory />
  AllowOverride None
  Order allow,deny
  allow from none
  deny from all
</Directory>

4. 패스워드는 강력한 것으로.

5. apache2 권한은 최소한으로.
기본적으로 www-data의 권한은 별로 없는 걸로 안다;

6. apache2 의 로그 파일이 노출되면 안됨.
기본적으로 /var/log/apache2/error.log 에 위치

7. 웹 서비스 루트 디렉토리는 OS 디렉토리의 루트 디렉토리와 다르게 설정한다.
/etc/apache2/sites-available/default 파일에 DocumentRoot 는 기본적으로 /var/www로 설정되어 있다.
이걸 고치지 않고 내버려둔다면 상관 없다.
7.1. 이왕이면 로그 디렉토리 및 컨텐츠 디렉토리는 웹 서비스 루트 디렉토리 밖에 위치시키자.
log는 위에서 설명했듯이 어차피 다른 위치여서 상관 없는데..
웹 컨텐츠 디렉토리를 옮긴 뒤 설정하는 방법은 사용하고자 하는 웹 서비스마다 다르다.

8. 웹 컨텐츠 디렉토리 안에서 Symbolic Link (파일 바로가기) to outer directory 사용 금지.

9. 자동 디렉토리 리스팅 사용 중지.
/etc/apache2/sites-available/default 파일에 모든 Options에서 Indexes를 지워준다.

10. 샘플 파일, 메뉴얼 파일, 임시 파일 제거. 불필요한 정보 제공 방지. 동적 컨텐츠도 제거.

11. 웹 서버 종류, 사용 OS, 계정 이름 등도 노출 방지.
/etc/apache2/conf.d 파일에 ServerTokens 라는 항목이 있다. Prod[uctOnly]라고 써주자.
ServerTokens ProductOnly  # 웹 서버가 apache라는 것 빼고는 아무런 정보도 알려주지 않는다.
그 연장선상에서, Error 시에도 에러 정보를 주지 않는 것이 좋다 한다. (몇 번 에러가 났는지 알려주면 안됨.)
사용자 정의 Error 메시지는 ErrorDocument 404 "사용자 정의" 와 같이 써주면 된다.
이 경우, 404번 Error 발생 시 사용자 정의 메시지가 뜬다.
메시지 말고 특정 웹문서로 연결시킬 수도 있다. Error 404 /error.html 과 같이.

12. 업로드 제어: 대량 업로드 금지, 업로드한 파일엔 실행 권한 주지 않기.
.htaccess 파일을 사용하는데.. 이는 apache 옵션 설정 파일 중 하나이다.
/var/www 디렉토리와 혹은 그 하위 디렉토리에 위치시키면, 디렉토리별 apache 옵션 설정이 가능한 것 같다.
기본적으로 /etc/apache2/apache2.conf 파일에 보면
AccessFileName .htaccess 라고 설정되어있고, ".ht" 로 시작하는 이름의 파일들엔 접근 금지 설정도 되어있다.

여하튼, .htaccess 파일은 웹 서비스 루트 디렉토리에 위치시키면 충분.
파일 내용은 이정도로.
<FilesMatch "\.(ph|inc|lib)">
  Order allow,deny
  deny from all
</FilesMatch>
이런 식으로 Server side script 파일들은 접근 금지된다.

13. 설정 파일은 백업.



[Apache2] 서버 구축을 위한 노력 ㅠㅠ (server install tutorial) Computer makes me Crazy

Apache2 는 Apache1.x 버전과 많이 다른 것 같던데;
인터넷에 있는 수많은 자료들에는 설정파일이 /etc/apache2/httpd.conf 라고 주장하지만
..실제 그 파일을 쓰긴 쓰는데 /etc/apache2/apache2.conf 파일에서 Include httpd.conf 할 뿐이고..
apache2에선 사용자 정의 옵션 몇몇을 넣어주는 용도로 전락해버린 httpd.conf 파일 -_-..

각종 옵션 설정의 중심은 apache2.conf 이고
apache1.x 에서 쓰던 옵션들은 여러 파일에 분산되었다.
가령 /etc/apache2/sites-available/default 라든지..
따라서 인터넷에서 찾은 옵션 설정 명령이 apache1.x 의 것으로 의심된다면,
 $ grep "명령어" /etc/apache2 -r 
을 통해 어떤 파일에서 해당 명령어를 다루고 있는지 찾아보자.
grep은 정규표현실을 이용한 내용 검색 명령어인데, 여기선 grep은 인터넷 게시판들의 '내용' 검색과 비슷하게 사용했다.
-r 은 recursively 옵션. 하위 디렉토리까지 전부 검색.



여튼 서버에 apache2 설치는..
 $ sudo apt-get install apache2 
(우분투 11.10 기준)
이거면 깔끔하게 끝나고.

처음 설치하면 기본 웹 디렉토리가 /var/www 로 설정되어있다.
(/etc/apache2/sites-available/default 파일의 DocumentRoot에서 설정 가능.)
여기에 .html 파일을 올려두면 웹 브라우저를 통해 확인해볼 수 있는 것이다.
(.php 파일을 보고 싶다면, 서버에  $ sudo apt-get install php5  로 php를 설치하자. php가 설치 안되어있는데 웹 브라우저를 통해 .php 파일에 접근하려 하면 파일이 다운로드된다 -_-;)
가령 /var/www/welcome.html 파일이 존재하고, DocumentRoot가 /var/www/ 로 설정되어있다면
웹 브라우저 주소창에 다음과 같이 쳐보자. "서버주소/welcome.html"
(예: http://myhomepage.com/welcome.html)
(서버에 웹 브라우저가 깔려있어 서버에 설치된 웹 브라우저를 통해 접근하려면, localhost/welcome.html 라고만 쳐도 된다. 물론, 서버에 GUI를 비롯한 웹 브라우저, 기타 서버에 필요 없는 프로그램들을 설치한다는 것은 보안상 좋지 못한 처사랜다.)

음? 근데 막상 웹 파일들을 해당 위치에 갖다놔도 웹 브라우저를 통해 접근하려 하면 접근 권한이 없다면서 문제가..
그건 파일 권한 문제 때문인데, chown 명령어를 통해 해결해줘야 한다.
리눅스는 프로세스도 하나의 사용자와 같이 취급하고,
다른 PC에서 웹 브라우저를 통해 서버의 파일에 접근을 요구하면
서버에 설치된 apache2 프로세스가 그 파일을 열어보려 시도한다.
근데 apache2 프로세스가 그 파일에 접근 권한이 없다면 Fail, Error..
참고로 apache2 프로세스의 name은 www-data이다. 따라서,
 $ sudo chown www-data:www-data 파일명 
또는
$ sudo chown www-data:www-data 디렉토리명 -r  (-r 옵션은 recursively, 디렉토리 내의 내용물까지 전부 다 바꾸라는 의미)
을 통해 해결.
기본 설정 상태의 apache2 라면, $ sudo chown www-data:www-data /var/www -r 정도로 하면 될 것이다.

이정도만 해도 서버는 잘 돌아가는 것 같다.

[Server] Ubuntu Server Edition Computer makes me Crazy

Ubuntu Server Edition 11.10

CD로 구워서 꼬진 컴퓨터에 설치했는데.. CD-ROM 드라이버가 맛이 갔는지,
Ubuntu 설치 과정 중에 아무 프로그램도 설치 못하고; (정말 OS만 깔았다. vim 안깔림, apache2 안깔림.. cd, ls, cp, mv만 해야함..)
한글판으로 깔았더니 한글도 깨지고
apt-get install 명령하면 암것도 커서만 껌뻑껌뻑 하길래 일단 우분투 서버 한글 깨짐 검색해서 적당히 해결했더니
깨진 글씨가 바로 apt-get install 할 때 설치 CD를 넣어달라는 말이었네;
CD 넣어줬더니 CD 저장된 프로그램 깔고 앉았고 ㅋㅋㅋ
다행인 것은, CD를 통해 ssh 와 vsftpd 정도는 깔 수 있었다는 것. 이로써 원격 작업은 가능해졌었고-

저장소 파일을 수정해줘야 한단다.
/etc/apt/sources.list
확인해보니 Server Edition은 저장소 파일에 저장소가 CD-ROM 하나만 설정되어 있었던 것;
..어찌 수정해줘야 할지 몰라, 내 PC에서 쓰던 우분투의 sources.list 파일을 그냥 가져다 덮어썼더니 잘 된다. ㅋ

공유 라이브러리 만들기 - Test 목적으로.. Computer makes me Crazy

$ g++ -fPIC -c test.cpp
$ g++ -shared -Wl,-soname,libtest.so.0 -o libtest.so.0.0.0 test.o
$ ln -s libtest.so.0.0.0 libtest.so  # g++ 링크를 위한 Symbolic link 생성
$ ln -s libtest.so.0.0.0 libtest.so.0  # 동적 링크를 위한 Symbolic link 생성

..위까지는 여기저기 많이들 설명되어있는 내용. 동적 라이브러리 libtest.so.0.0.0과 그 심볼릭 링크는 완성되었다.
이제 그 라이브러리와 심볼릭 링크들을 /etc/ld.so.conf 파일에 정의된 경로들 (ex. /usr/lib.. 과 같은 system path..) 에 옮겨야만 쓸 수 있댄다.
혹은, /etc/ld.so.conf 에 내 라이브러리가 있는 경로를 추가하고
$ ldconfig
를 실행하란다.

나는 여기서 나의 양심에 귀 기울이지 않을 수가 없다.
고사리손으로 깨작깨작 맹근 라이브러리를 감히 어디다가 두겠다는 것인가! -,.-

그래서 뒤져본 결과,
$ export LD_LIBRARY_PATH=(libtest.so 파일이 있는 경로)
를 하면 저 경로를 임시로 포함할 수 있다는 거. Test 목적으로 딱.
현재 경로를 출력하는 명령어 pwd와 조합해서 쓰려면
$ export LD_LIBRARY_PATH=`pwd`
이때 ' 가 아니라 ` 이다... ESC키 바로 아래 있는 키..

최종 컴파일은 이렇게.
$ g++ main.cpp -L. -ltest
# -L 옵션은 lib파일들 경로 찾는 옵션이고, 바로 뒤에 붙인 '.'은 현재 경로를 의미.
# -l 옵션은 라이브러리에 link하기 위함. main.cpp 에는 #include "test.h" 구문이 있을 것..
# -L 옵션 달아준다고 라이브러리를 쓸 수 있는 건 아니고, /etc/ld.so.conf 에 현재 경로가 추가되어 있거나 export LD_LIBRARY_PATH=`pwd` 해준 곳이어야 -L. 옵션이 유효하게 됨.

[CMake] 초심자를 위한 예제 Computer makes me Crazy

예제 찾기가 힘들어 빡치므로 포스팅. (백만 년 만에 찾아온 이유 -_-.)


$ ls
DBMaker.h   TableTree   DBMaker.cpp   Utility   main.cpp
(directory TableTree: TableTree.h, TableTree.cpp 포함.)
(directory Utility: util.h, util.cpp 함유.)

$ vim main.cpp
#include <표준적인것들>
#include "util.h"
#include "DBMaker.h"
...

$ vim DBMaker.h
#include <아무거나>
#include "util.h"
#include "TableTree.h"
...

$ vim TableTree/TableTree.h
#include <이것저것>
...   // TableTree.h 는 별다른 dependency가 없다.

$ vim Utility/util.h
#include <와구와구>
...   // util.h 또한 사용자 정의 헤더파일을 포함하지 않는다.

$ vim CMakeLists.txt  (아래 내용은 CMakeLists.txt 파일에 들어가야 할 내용들)
cmake_minimum_required (VERSION 2.8)  # 필수 정보

project (DBManager)  # 필수 정보

include_directories ("${PROJECT_SOURCE_DIR}/Utility" "${PROJECT_SOURCE_DIR}/TableTree") # to find header files
#add_subdirectory (Utility)  # if this directory has CMakeLists.txt file.
#add_subdirectory (TableTree) 
add_library (Utility SHARED "${PROJECT_SOURCE_DIR}/Utility/util.cpp")  # (생성할 라이브러리 이름, [속성], 파일명 또는 경로)
add_library (TableTree SHARED "TableTree/TableTree.cpp")  # this type of path name is also possible.
add_library (DBMaker SHARED DBMaker.cpp)
target_link_libraries (DBMaker Utility TableTree)  # (DBMaker는 Utility 라이브러리와 TableTree 라이브러리를 include한다..)

add_executable (dbm main.cpp)  # (생성할 실행파일 이름, 파일명)
target_link_libraries (dbm DBMaker Utility)



감각이 있는 분들이라면 아시겠지만 #은 주석 기호.
필수 정보라 표시해둔 것들은 cmake 홈페이지에 튜토리얼 첫 번째 예제에서도 언급되는 것들이다.

제일 처음 두 개의 필수정보를 채워넣은 뒤 필요한 것은 add_executable () 또는 add_library ().
add_library () 만 넣어준다면
$ cmake .
$ make
를 실행해 줬을 때 라이브러리 파일 하나가 생성될 것이다.
물론 add_executable () 을 넣어주면 똑같은 과정을 밟았을 때 실행파일이 생성된다.

dependency가 있을 경우 target_link_libraries 커맨드를 사용한다.
이 커맨드의 첫 번째 argument는 뒤의 모든 argument들을 include하는 관계임을 알 수 있다.
이때, add_library() 나 add_executable() 을 통해 연관된 라이브러리나 실행파일을 모두 생성한 뒤 target_link_libraries()를 써줘야 한다.
(target_link_libraries 문법: 여기서부턴 위 링크된 메뉴얼에서 Ctrl+F 해서 찾아보세요ㅋ)

add_subdirectory는 주석해놨는데.. 저 상태에서 봉인 해제해봤자 동작하지 않을 거다.
해당 directory가 별도로 빌드될 수 있는 모듈인 경우 그 directory에도 CMakeLists.txt 파일을 만들어주고
(이 파일에서도 project(DBManager) 로 프로젝트 이름은 같게 설정한다.)
상위 directory의 CMakeLists.txt 파일(즉, 지금 보여주는 예제 파일)에서 add_subdirectory를 통해 하위 모듈을 포함함을 명시해줘야 한다.

마지막으로 변수(Variable)
변수는 같은 프로젝트 내에선 공유됨.
하위 모듈에서도 ${PROJECT_SOURCE_DIRECTORY}는 같은 값을 가지더라.
변수 목록 역시 Cmake 공식 문서에서 알 수 있고 클릭하면 설명도 볼 수 있다.

더 상세한 설정을 원하면 공식 문서를 뒤져봐야 하는데, 일단 가닥이 잡히니 좀 더 쉽겠지 싶다.



이정도만 알면 웬만한 프로젝트 빌드는 가능할 것 같다..고 현재 생각 중이다;
실전에 앞서 하는 포스팅. 별 문제 없으면 수정하지 않을 듯.

1 2 3 4 5 6 7 8 9