메뉴 건너뛰기

Hodol's Blog

Documents CentOS 7 Install Cheat Note

2016.10.11 00:02

Hodol 조회 수:151

CentOS 7 Install Cheat Note

 
들어가며
이 문서는 검색을 통해 쉽게 얻을 수 있거나 많은 사람들에게 알려진 내용들은 생략합니다. 기술적인 부분에 대해 깊이있는 내용은 다루지 않으며 서버 설치 및 설정에 어려움에 부딪혔을 때 도움이 될만한 실용적인 내용들만 요약하고자 합니다.
지난 2014년 4월에 서버에 Fedora 20을 설치하여 2년반 정도 사용해왔고 이제 새 버전의 OS로 업그래이드를 할 시기가 아닌가 생각이 들었습니다. 세상은, 특히 IT 분야는 매우 빠르게 변화하면서 다양하고 새로운 기술들이 등장합니다. 2년 동안 많은 리눅스 배포판이 새로운 버전들을 내어놓았고, Fedora 20도 이제 낡은 OS가 되어버린게 아닌가하는 생각이 들었습니다. 이에 새로운 OS를 설치하고 이전 서버에서 제공하던 서비스들을 복구하는 작업을 진행하기로 하였습니다. 이번에 선택한 OS는 CentOS 7이었습니다. 제가 처음 접한 OS가 Redhat 리눅스였습니다. 그래서 Redhat 계열을 좋아하고 심적으로도 편합니다. 이 후, Redhat이 상용화되면서 정식으로 Redhat 재단의 후원을 받는 무료 배포판인 Fedora를 사용해왔습니다만, Fedora에서 무엇인가 새롭긴한데 어딘가 어설픈 기능을 마주할 때면, 글로벌 호구 베타 테스터가 된 것 같은 느낌을 받으면서 역시 세상은 돈인건가?하는 서글한 생각이 들곤 하였습니다. 아무튼 이 번에는 Fedora와 정반대 편에 서있는 CentOS를 설치하기로 했습니다.
CentOS 7 Install
CentOS 다운로드 페이지를 방문하여 ISO 파일을 받아서 부팅 USB를 만들면 된다. 부팅 USB를 만드는데 여러가지 방법이 있지만, 이번에는 리눅스에서 dd 명령을 이용하여 부팅 USB를 제작하였다:
$ dd if=/path/to/CentOS.iso of=/dev/usb
이 후에 USB로 부팅하여 시키는대로 하면 된다.
SSHD 포트 바꾸기
일상에서 틈틈히 서버를 관리하려면 일단 SSH 통신을 해야한다. SSH 서버는 OS가 설치될 때 같이 설치되고 자동으로 실행된다. 따라서 별도의 설치나 구동 명령이 필요없다. 하지만, 예전에 SSH의 기본 통신 포트인 22번 포트로 루트 계정을 얻으려는 사전 대조 공격이 있었고 따라서 SSH 통신 포트를 바꾸기로 했다.
  1. SSH 데몬 포트 바꾸기: /etc/ssh/sshd_config 파일에 #Port 22라고 되어 있는 부분을 Port 1234로 바꾸어 준다.
  2. 방화벽 포트 열기: 바꿔준 1234 포트를 방화벽에서 열도록 설정해주어야 한다.
    # firewall-cmd --zone=public --permanent --add-port=1234/tcp
    # firewall-cmd --reload
  3. SELinux 정책 해제: 레드햇 계열에서 너의 아픔이자 나의 고뇌인 SELinux 설정을 해주어야 한다. 방화벽에서 포트를 열어줘도 SELinux가 보안의 이름으로 엄중히 22번이 아닌 포트로의 SSH 서비스를 막고 있다. 이를 해결하기 위해 semanage 명령이 필요한데 이게 기본 명령어가 아니라서 별도의 설치가 필요하다. yum을 통해 설치한 후, 이를 이용하여 SElinux에서 SSH 포트 설정을 해주자.
    # yum install policycoreutils-python
    # semanage port -a -t ssh_port_t -p tcp 1234
    참고로 22번 포트를 다음 명령으로 삭제하려해도 헛된 몸부림이니 에너지 낭비말고 대충 살자.
    # semanage port -d -t ssh_port_t -p tcp 22
SELinux Troubleshoot 설치
앞에서도 언급했지만, 현대 레드햇 계열 OS를 사용하려면 SELinux와 불편한 동거를 해야한다. SELinux가 수준 높은 보안 정책을 제공하지만 서버 운영을 어렵게 하기도 한다. 특히, 모든 설정을 다 해줬는데도 아무런 에러 메세지 없이 서비스가 정상 작동하지 않을 때는 난감하다. 설정을 잘못한 것인지, 하드웨어적인 문제인지, 소프트웨어나 라이브러리 버전 문제인지, 인터넷 메뉴얼이 잘못된 것인지를 의심하다 끝에 가서는 아, 맞다! SELinux!하곤 하는데 나중에는 SELinux 문제가 아닌 것도 SELinux 문제가 아닌가하며 햇갈리게 된다. 아무튼, SELinux 보안 정책이 서비스를 막고 있다는 것을 알아냈다하더라도 도대체 이를 어떻게 해결할지를 알 길이 없다. 이 때, 필요한 것이 SELinux Troubleshoot 도구이다. 인터넷에서 SELinux 관련된 한국어 문서들을 보면 /etc/selinux/config 파일을 수정하여 SELinux를 사용하지 않도록 설정하라는게 대부분인데, 그 심정이 이해는 되지만... SELinux를 끄는 나약한 짓 따위는 하지 말자. SELinux Troubleshoot 도구를 사용하면 그리 어렵지 않게 해결할 수 있다. 우선 설치부터 해보자.
# yum install setroubleshoot
이제부터 서버가 가끔씩 이유없는 반항을 할때면 다음 명령으로 SELinux 로그를 살펴보자.
# sealert -a /var/log/audit/audit.log
그러면 꽤 오랫동안 SELinux 이슈가 파싱이 되어 출력되는데 로그를 잘 읽어보면, 대충 다음과 같은 내용이다.
--------------------------------
서버에 이러이러한 보안 이슈가 있어서 내가 좀 막았어. 이는 어떠어떠한 종류의 문제야. 이런 문제의 원인에 대해서는 다음 시나리오들을 생각할 수 있어.
=================================
첫번째로 이러이러해서 저러저러한게 문제일 수도 있어. 해결하려면 다음 명령을 입력해봐.
setsebool -P selinux_config_name 1
=================================
두번째로 이러이러해서 저러저러한게 원인일 수도 있어. 해결하려면 다음 명령을 입력해봐.
setsebool -P another_config_name 1
=================================
세번째로 이러이러해서 저러저러한게 원인일 수도 있어. 이 경우엔 아직 정석적인 해결 방법이 없어. 그래도 해결하려면 다음과 같이 입력해봐.
..... semodule -i custom.pp
뭐 이런 식이다. 보는 바와 같이 친절하게 해결책을 알려준다. 그리고 적당한 걸 골라서 하라는대로 하면 왠만한 이슈는 해결할 수 있다. (https://www.lesstif.com/pages/viewpage.action?pageId=19857527)
웹 서버 설정
CentOS를 설치할 때, 웹 서버용으로 설치하면서 웹 서비스 3종 세트 Apache, PHP, MariaDB를 같이 설치하였...지만, 제대로 웹 서비스를 하려면 PHP는 추가 라이브러리를 설치해줘야하고, MariaDB는 아예 처음부터 다시 설치해줘야 한다. 여기서도 SELinux는 우리의 발목을 잡는다.
Apache 설정
  1. Apache 서버 설정: /etc/httpd/conf/httpd.conf (기본 설정), /etc/httpd/conf.d/userdir.conf (계정별 웹서비스 설정), /etc/httpd/conf.d/vhost.conf (가상 호스팅 설정) 등의 파일들을 적절히 수정한다.
  2. Apache 서버 실행: Apache 서버를 실행하고, 서버 부팅 시 자동으로 실행되도록 설정한다.
    # systemctl start httpd
    # systemctl enable httpd
  3. 방화벽 포트 열기: 이번에는 미리 정의된 HTTPD 기본 포트를 열도록 한다.
    # firewall-cmd --zone=public --permanent --add-service=http
    # firewall-cmd --reload
  4. (2017.05.29. 추가) SELINUX homedirs 설정: SELINUX 정책이 추가되었다. 계정별로 웹서비스를 하려면 다음과 같은 명령으로 SELINUX의 정책을 허용해주어야한다.
    # setsebool -P httpd_enable_homedirs 1
PHP 설정
  1. PHP 추가 라이브러리 설치:
    # yum install php-mbstring.x86_64 php-mysql
  2. php.ini 파일 설정: /etc/php.ini 파일에 date.timezone 설정의 주석을 풀고 "Asia/Seoul"로 설정하자.
  3. Apache 서버 재시작: Apache 서버를 재시작하여 바뀐 PHP 설정을 적용하도록 한다.
    # systemctl restart httpd
MariaDB 설치 및 설정
CentOS는 설치 시 기본으로 MariaDB를 설치를 할 수 있는데 버전이 5.5이다. 업그레이드도 안되고 -- 안된다기보다는 편리한 방법을 제공하지 않는다 -- 현재 MariaDB 안정 버전이 10.1이다. 새로 설치하는 것이 좋다. MariaDB 홈페이지에서는 yum을 통한 MariaDB 설치 메뉴얼을 제공한다. 설치 과정과 설정을 알아 보자:
  1. YUM repository 추가: /etc/yum.repos.d/MariaDB.repo 파일을 생성하고 다음과 같이 작성한다.
    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.1/centos7-amd64
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
    gpgcheck=1
  2. yum 명령을 사용하여 MariaDB 설치:
    # yum install MariaDB-server MariaDB-client
  3. 문자셋 설정하기: /etc/my.cnf.d/server.cnf 파일에 다음과 같이 추가한다.
    [mysqld]
    character-set-server=utf8
  4. MariaDB 실행:
    # systemctl start mariadb.service
  5. DB 설치 및 초기화: 다음 명령을 통해, DB 설치와 관리자 비밀번호를 설정한다.
    # mysql_secure_installation
  6. 기존 데이터 복원: 미리 DB 사용자와 관련 데이터베이스를 생성하고 권한을 부여한 후에 다음 명령을 실행하자.
    $ mysql -u[userId] -p [DB명] < backup.sql
    password:
    $ mysql -u[userId] -p [DB명]
    password:
    MariDB > source backup.sql
  7. SELinux 정책 해제: 웹에서 MariaDB에 접근이 안된다면 sealert 명령을 통해 해결해 보자. 참고로 필자는 sealert가 알려준 다음 명령으로 해결하였다.
    # setsebool -P httpd_can_network_connect 1
Xpress Engine 복구
기존에 백업을 해둔 Xpress Engine 웹 게시판 모듈을 복구 후 나타난 몇몇 문제점을 해결해보자.
  • Permission Forbbiden, 403 에러: 퍼미션 에러라서 디렉토리 권한 설정 문제이겠거니 생각할 수 있다. 그래서 xe 디렉토리와 그 상위 디렉토리에 권한을 수정했을 것이다. 인터넷에서 검색해보면 ./xe/files/ 디렉토리에 707 권한을 설정하라는 문서들이 많이 나온다. 옳은 해결법이지만 이것만이 전부가 아니다. 바로 아파치의 rewrite 모듈이 정상 작동하지 않아서 생기는 문제일 수 있다. rewrite 모듈은 간단한 url로도 웹 서비스에 접근할 수 있게 해주는 Apache의 모듈이다. XE 디렉토리에 이 모듈이 적용되지 않은 상태에서 ./xe/.htaccess 파일 상단에 RewriteEngine On라는 행이 있는 경우 퍼미션 에러가 발생한다. 검색해보면 그냥 RewriteEngine OnRewriteEngine Off로 수정하라는 글이 있는데, 정말 이런 글을 읽을 때면 짜증이 난다. SELinux를 꺼라, RewirteEngine 설정을 꺼라는 등의 글을 써놨는데 개발자들이 고심해서 설정해둔 것들을 멋대로 끄라고 써놓고, 그걸 따라했다가 나중에 문제들이 발생하면 책임져 줄 것도 아니지 않은가? 자세한 내용을 몰라서 궁여지책이라도 끄적여 놓은 것이라면 적어도 무언가 작동하지 않을 수 있다는 경고 메세지 정도는 같이 써둬야 한다고 생각한다. 아무튼 .htaccess 파일은 수정하지 않고, Apache 설정을 바꾸도록 한다. XE가 설치된 디렉토리가 포함된 디렉토리를 설정하는 부분에 다음과 같은 옵션을 추가하도록 하자.
    <Directory "/some/path">
    ...
    Options FollowSymLinks
    AllowOverride All
    Require method GET POST OPTIONS
    ...
    </Directory>
    이 후, Apache 서버를 재실행하도록 하자.
  • 일부 데이터를 받지 못하는 문제: 일부 게시물의 스타일이 깨진다던가, 로그인 시 이메일이 가진 사용자가 존재하지 않는다는 메세지를 출력하면서 로그인이 안된다던가, 첨부 파일 링크가 보이지 않거나, 검색이 안되는 문제점이 있을 수 있다. 이는 DB로부터 특정한 정보를 불러들이지 못하여 나타나는 문제로 역시(?) SELinux가 그 원인이다. SELinux로 인한 문제는 sealert로 해결하자. 필자는 다음과 같은 명령으로 해결할 수 있었다.
    # setsebool -P httpd_unified 1
vsFTPD 설정
설치는 YUM을 통해서 하고 /etc/vsftpd/vsftpd.conf 파일을 수정함으로 설정한다.
anonymous_enable=NO
...
ascii_upload_enable=NO
ascii_download_enable=NO
...
listen=YES
...
listen_ipv6=NO
...
use_localtime=YES
listen_port=12345
pasv_min_port=65000
pasv_max_port=65535
위의 설정값 중 파일에 기술된 것은 그 값을 수정해주고, 기술되지 않은 것은 파일의 마지막에 추가해주면 된다. =기호 양 옆에 공백이 있으면 안된다. listen_port는 FTP 서버가 명령을 받는 포트이고, pasv_min_portpasv_max_port는 데이터를 주고 받는 포트 번호의 최소값과 최대값을 가리킨다. vsftpd는 이 두 값 사이의 포트를 무작위로 선택하여 데이터 통신을 한다. 당연히 이 포트들을 방화벽에서 열어주어야 한다.
# firewall-cmd --zone=public --add-port=12345/tcp --permanent
# firewall-cmd --zone=public --add-port=65000-65535/tcp --permanent
# firewall-cmd --reload
그리고 역시 SELinux 정책 해제도 해주자.
# setsebool -P ftpd_full_access on
다음과 같이, 서버를 시작하고 부팅 시 자동으로 시작하도록 해준다.
# systemctl start vsftpd.service
# systemctl enable vsftpd.service
RTorrent와 RuTorrent 설치하기
RTorrent는 Command line에서 실행할 수 있는 토렌트 클라이언트이고 다른 클라이언트들에 비해 리소스를 적게 사용한다. RuTorrent는 RTorrent를 웹 UI로 관리할 수 있게 해준다. 설치와 구동을 알아본다.
RTorrent 설치 및 실행
RTorrent는 Centos의 YUM 레포지토리에서 찾을 수 없다. 따라서 RTorrent가 있는 YUM EPEL 레포지토리를 추가해야 한다. 다음과 같은 명령으로 EPEL 레포지토리를 받아서 설치하고 YUM 레포지토리가 정상 등록되었는지를 확인한다.
# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
# rpm -ivh epel-release-7-8.noarch.rpm
# yum repolist
(http://www.tecmint.com/how-to-enable-epel-repository-for-rhel-centos-6-5/) 이제 다음과 같이 yum 명령을 통해 설치할 수 있다. 설치 후 root 계정을 종료하고 일반 계정으로 rtorrent를 실행해서 설치가 잘 완료되었는지를 확인해 보자. (root 계정으로 실행해도 되지만 앞으로 데이터들을 관리하기 위해 매번 root 계정을 이용해야 한다. 이는 보안 상 바람직하지 않은 습관이고 처음부터 일반 계정으로 rtorrent를 실행하는 습관을 들이는게 좋다고 생각한다.)
# yum install rtorrent
# exit
$ rtorrent
Ctrl+q를 통해 RTorrent를 종료할 수 있다. rtorrent의 설정 파일을 작성하자. /usr/share/doc/rtorrent-0.x.x/rtorrent.rc의 설정 파일 샘플을 RTorrent를 실행할 계정 홈 디렉토리에 복사하여 수정한다.
$ cp /usr/share/doc/rtorrent-0.x.x/rtorrent.rc   ~/.rtorrent.rc
$ vi ~/.rtorrent.rc
필요한 설정들은 주석을 풀고 적절히 수정하면 된다. directory, session, schedule 설정은 한 번 고민해 볼 필요가 있다. 특히, session 설정은 토렌트 데이터 정보들이 담기는 곳인데 이게 없다면 나중에 복원할 때 경우에 따라서는, 시딩 정보를 일일히 복원해줘야 하는 상황이 발생한다. (https://wiki.archlinux.org/index.php/RTorrent) 데이터가 담긴 별도의 HDD가 있다면 마운트되어 있는 것을 꼭 확인하고 RTorrent를 실행하자. HDD에 든 파일을 찾을 수 없어서 해시 정보가 리셋될 수 있기 때문이다. 다시 해시 작업을 하는데 꽤 오랜 시간이 걸린다.
RuTorrent 설치 및 설정
xmlrpc-cmod_scgi 등의 패키지들이 필요하나 CentOS 7에 기본적으로 설치되어 있다. 없다면 설치하자. RuTorrent는 브라우저에서 구동되는 웹어플리케이션이므로 별도의 설치가 필요없이 다운받아서 적당한 디렉토리에 압축을 풀면된다. 3.6버전까지는 플러그인들을 별도로 다운받아서 설치해줘야 했으나, 3.7버전부터는 플러그인들이 포함되어 있다. 다음과 같이, RuTorrent를 다운받아서 압축을 풀고, 적당한 디렉토리에 옮기자.
$ wget https://bintray.com/novik65/generic/download_file?file_path=ruTorrent-3.7.zip
$ unzip ruTorrent-3.7.zip
$ mv ruTorrent-master/ /some/path/rutorrent
$ cd /some/path/rutorrent
$ rm -rf .htaccess
마지막의 명령줄의 .htaccess은 RuTorrent 설정을 확인하는데 방해가 되므로 삭제한 것이다. 이 파일을 담당했던 보안 역할은 별도로 설정해줄 것이다. 물론, .htaccess 파일을 이용하는 방식의 보안을 사용하고 싶은 분이라면 이를 사용하여도 된다. 이제 http://server.url/rutorrent라고 접속했을 때, RuTorrent 페이지가 나타나도록 설정해 보자. Apache 설정 파일 적당한 곳에 -- 가상 호스팅을 쓴다면 vhost.conf 파일의 해당 가상 호스팅 설정 부분을 추천한다 -- 다음과 같이 Alias 설정을 추가하자. 당연히 root의 권한이 필요하다.
Alias /rutorrent /some/path/rutorrent
이 후, 아파치를 재실행하면 아마도 정상 작동하.......지 않을 것이다. 그렇다. SELinux가 막고 있다. 이유는 다운 받아서 복사한 RuTorrent 소스 파일들이 검열(?)을 거치지 않아서 안전하지 않기 때문이다. sealeart 명령으로 확인하면 다음과 같은 솔루션을 제공할 것이다.
# /sbin/restorecon -v /some/path/rutorrent/index.html
위의 명령을 쓰면 RuTorrent의 index.html 파일의 제외한 다른 파일에서도 또 같은 문제가 발생한다. 따라서 다음과 같이 모든 파일에 위 명령을 적용하자.
# /sbin/restorecon -vR /some/path/rutorrent/
# setsebool -P httpd_read_user_content 1
두 번째 SELinux 설정도 아마 해주어야 나중에 정상 작동할 것이다. 귀찮으니 한번에 해버렸다. 해당 주소로 접속을 해보면 아마 RuTorrent UI를 볼 수 있을 것이다. 이제 RuTorrent와 RTorrent를 연결해주어야 한다. 아파치 설정 파일에 다음과 같은 라인을 추가하자. /etc/http/conf.module.d/00-proxy.conf 파일 마지막 줄에 추가하는 것을 추천한다. 왜냐하면 이 파일에서 관련 모듈을 로딩하고 있기 때문이다.
ProxyPass /RPC2 scgi://127.0.0.1:5000
이제 .rtorrent.rc 파일 마지막 줄에 다음과 같은 내용을 추가하자.
scgi_port = 127.0.0.1:5000
encoding_list = UTF-8
방화벽 설정에서 5000번 포트를 열어야 할 것 같지만 열지 않아도 정상 작동한다. 아마 로컬 통신이라서 관계가 없는 듯 하다. Apache 서버를 재실행하고 RTorrent를 실행한 후, RuTorrent로 접속하면 잘 작동하는 것을 확인할 수 있다.
# systemctl restart httpd.service
# exit
$ screen -S rtorrent
$ rtorrent
[ctrl+a],[ctrl+d] 입력
screen이 설치되어 있지 않다면 YUM을 통해서 설치하자. RTorrent를 돌리기 위해서는 필수이다. 브라우저를 통해 http://server.url/rutorrent로 접속하면 확인할 수 있다. 이제, 아까 지운 .htaccess 파일의 보안 설정을 복원하자. 필자는 .htaccess 파일을 관리하기가 귀찮아서 아파치 설정 파일로 관리하는 것을 선호하는 편이다. 아파치 설정 파일에 다음과 같이 입력한다.
<Directory "/some/path/rutorrent">
    AuthType Basic
    AuthName "Something you want"
    AuthUserFile /some/path2/.htpasswd
    Require valid-user
</Directory>
(https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-14-04) 위 설정 코드에서 나타난 /some/path2/.htpasswd 파일을 만들어야 한다. 다음과 같이, htpasswd을 이용한다. 중요한 점은 생성할 .htpasswd 파일의 절대 경로를 입력해야 한다는 점이다.
# htpasswd /some/path2/.htpasswd loginId
명령이 실행되면 두번의 암호 입력을 거쳐 .htpasswd 파일을 생성할 수 있다. 이 후, Apache 서버를 재시작하고 RuTorrent로 접속하면 암호를 묻는 창이 뜰 것이다.
phpMyAdmin
yum명령으로 설치한다.
# yum install phpMyAdmin
설치를 완료하면 /etc/httpd/conf.d/phpMyAdmin.conf 파일이 생성되어 있다. 이 파일은 로컬에서만 접속할 수 있도록 제한 설정을 하고 있다. 원격에서 접속하려면 다음과 같이 수정해준다.
...
<IfModule mod_authz_core.c>
    <RequireAny>
        AuthType Basic
        AuthName "Something you want"
        AuthUserFile /some/path2/.htpasswd
        Require valid-user
    </RequireAny>
</IfModule mod_authz_core.c>
<IfModule !mod_authz_core.c>
        AuthType Basic
        AuthName "Something you want"
        AuthUserFile /some/path2/.htpasswd
        Require valid-user
</IfModule !mod_authz_core.c>
...
아니면 phpMyAdmin 자체적으로 로그인 시스템이 있으니 다음과 같이 모두 개방해서 사용해도 괜찮을 듯 하다.
... <IfModule mod_authz_core.c>
    <RequireAny>
         Require all granted
    </RequireAny>
</IfModule mod_authz_core.c>
<IfModule !mod_authz_core.c>
        Order Allow,Deny
        Allow from All
</IfModule !mod_authz_core.c>
...
(http://stackoverflow.com/questions/23704674/phpmyadmin-allow-remote-users) 역시 Apache 서버를 재시작한 후 원격 접속을 시도해 보자.
기타
마운트할 때, 파티션이 하나더라도 파티션 넘버 넣어줘야 한다. 안 그러면 에러 뜬다.
# mount /dev/sdb /mnt/
# mount /dev/sdb1 /mnt/