CentOS7 설치후 기본설정 #6(보안설정)

1. 방화벽 설정

> 방화벽 역할을 하는 장비가 없다면 리눅스 iptables을 활용하여 구축해야한다.

>>> 설치
?
001
002
003
yum -y install iptables
chkconfig iptables on
service iptables start
>>>>>> description
– iptables : 프로토콜의 상태 추적, 패킷 애플리케이션 계층검사, 속도 제한, 필터링 정책을 명시하기 위한 매커니즘을 제공한다.
– 기본적으로 설치되어 있으나 그렇지 않다면 위와 같이 설치한다.
>>> 설정확인
?
001
iptables -L -v
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
 104K   21M ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  any    any     anywhere             anywhere
 8799  530K ACCEPT     all  --  lo     any     anywhere             anywhere
    1    52 ACCEPT     tcp  --  any    any     anywhere             anywhere            state NEW tcp dpt:ssh
...
 2018  204K REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     all  --  any    any     anywhere             anywhere            reject-with icmp-host-prohibited
 
Chain OUTPUT (policy ACCEPT 114K packets, 20M bytes)
 pkts bytes target     prot opt in     out     source               destination
>>>>>> description
> Chain(체인) : 패킷을 구분
— INPUT : 호스트를 향한 모든 패킷
— OUTPUT : 호스트에서 발생하는 모든 패킷
— FORWARD : 라우트로 사용되는 호스트를 통과하는 패킷
> Match(매치) : 패킷의 조건
–source (-s) : 출발지 IP주소나 네트워크와의 매칭
–destination (-d) : 목적지 ip주소나 네트워크와의 매칭
–protocol (-p) : 특정 프로토콜과의 매칭
–in-interface (i) : 입력 인테페이스
–out-interface (-o) : 출력 인터페이스
–state : 연결 상태와의 매칭
–string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
–comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
–syn (-y) : SYN 패킷을 허용하지 않는다.
–fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
–table (-t) : 처리될 테이블
–jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
–match (-m) : 특정 모듈과의 매치
> Target(타겟) : 패킷을 처리하는 방식
— ACCEPT : 패킷을 받아들임
— DROP : 패킷을 버림(전송되지 않은 것으로 처리)
— REJECT : 패킷을 버리고 적절한 응답제공
— LOG : 패킷을 syslog에 기록
— RETURN : 호출 체인 내에서 패킷처리 계속
> Connection Tracking(연결 추적) : 연결 상태에 따른 패킷 제어
— NEW : 새로운 연결을 요청하는 패킷
— ESTABLISHED : 기존 연결의 일부패킷
— RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷
— INVALID : 어떤 연결에도 속하지 않는 패킷
>>> 설정
?
001
iptables {옵션} {설정값}
>>>>>> description
-A (–append) : 새로운 규칙을 추가
-D (–delete) : 규칙을 삭제
-C (–check) : 패킷을 테스트
-R (–replace) : 새로운 규칙으로 교체
-I (–insert) : 새로운 규칙을 삽입
-L (–list) : 규칙을 출력
-F (–flush) : chain으로부터 규칙을 모두 삭제
-Z (–zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만듬
-N (–new) : 새로운 chain을 만듬
-X (–delete-chain) : chain을 삭제
-P (–policy) : 기본정책을 변경
>>> 설정예제
?
001
002
003
004
005
006
# CentOS 7 미만
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
service iptables restart
# CentOS 7 이상
firewall-cmd --zone=public --permanent --add-port=80/tcp
firewall-cmd --reload
>>>>>> description
– CentOS 7 이상부터 iptables 가 firewall-cmd로 대체 되었다
– 기존과 동일하게 사용하기 위해서는 firewall을 제거 하고 iptables-services를 설치

2. SSH 보안설정

> 서버 접속에 대한 보안룰을 적용한다.

?
001
002
003
004
005
006
007
008
## 루트 로그인 방지를 위한 일반관리계정 추가
useradd -G wheel admin
passwd admin
## 일반관리계정에 root 계정 권한 부여
chmod 600 /etc/sudoers
vi /etc/sudoers
## SSH 접속 제한설정
vi /etc/ssh/sshd_config
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
# /etc/sudoers : 다음내용 주석해제
%wheel        ALL=(ALL)       NOPASSWD: ALL
# /etc/ssh/sshd_config
## 접속포트 변경 : 22번이 아닌 다른포트
Port {포트번호}
## 인증없이 서버로 접속하는 rhost를 금지
IgnoreRhosts yes
## root로 직접로그인 금지
PermitRootLogin no
## wheel 그룹만 로그인가능
AllowGroups wheel
### 특정 계정 또는 그룹에 대해서 접속을 허용 또는 거부
AllowGroups {그룹}
AllowUser {계정}
DenyGroups {그룹}
DenyUser {계정}
## 서비스 재시작
service sshd restart
## 서비스 재시작 : CentOS 7 이상
systemctl restart sshd.service
>>>>>> description
– root로 직접로그인 하지 못하도록하여 비정상적인 접근시 복잡도를 증가시킴
– 시스템 운영의 중요한 부분은 wheel그룹만 가능토록함

3. 퍼미션 설정

> 보안에 문제가 될 수 있는 명령어는 root계정 또는 wheel그룹에게만 권한을 부여한다.

?
001
002
003
004
005
006
007
008
009
010
011
012
013
## 컴파일러 퍼미션 변경
chmod 100 /usr/bin/gcc /usr/bin/g++
chattr +i /usr/bin/gcc /usr/bin/g++
## su명령은 wheel그룹만 가능
chown root.wheel /bin/su
chmod 4750 /bin/su
chattr +i /bin/su
## 기타 명령 퍼미션 변경
chmod 750 /usr/sbin/useradd
chmod 750 /usr/bin/top
chmod 750 /sbin/fdisk
chmod 750 /sbin/mkfs*
chmod 750 /sbin/fsck*
>>>>>> description
– 퍼미션 변경으로 기본적인 보안이 가능

4. SELInux(Security-Enhanced Linux) 설정

> 보안정책이 적용되면 다음과 같은 문제점이 발생하는데 사용하지 않도록 설정(setenforce 0)한다기 보다 정책에 맞추어 설정하여 운영할 수 있도록 한다.

?
001
002
003
004
005
006
007
008
009
010
## [ERROR 1] apache 실행시 에러가 발생한다.
Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:88
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:88
no listening sockets available, shutting down
Unable to open logs
                                                           [FAILED]
## [ERROR 1 - 해결]
### 88번 포트는 SELinux 정책에서는 기본적으로 허용하지 않는포트이다.
yum -y install policycoreutils-python
semanage port -a -t http_port_t -p tcp 88
>>>>>> description
– SELinux에서 기본적으로 허용하는 포트는 다음 8개포트 이다.
==> 80, 81, 443, 488, 8008, 8009, 8443, 9000

[참고]
http://myblog.opendocs.co.kr/archives/238