1. 방화벽 설정
> 방화벽 역할을 하는 장비가 없다면 리눅스 iptables을 활용하여 구축해야한다.
>>> 설치
yum -y install iptables chkconfig iptables on service iptables start
>>>>>> description
– iptables : 프로토콜의 상태 추적, 패킷 애플리케이션 계층검사, 속도 제한, 필터링 정책을 명시하기 위한 매커니즘을 제공한다.
– 기본적으로 설치되어 있으나 그렇지 않다면 위와 같이 설치한다.
– 기본적으로 설치되어 있으나 그렇지 않다면 위와 같이 설치한다.
>>> 설정확인
iptables -L -v
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 : 어떤 연결에도 속하지 않는 패킷
— 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 : 어떤 연결에도 속하지 않는 패킷
>>> 설정
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) : 기본정책을 변경
-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) : 기본정책을 변경
>>> 설정예제
# 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를 설치
– 기존과 동일하게 사용하기 위해서는 firewall을 제거 하고 iptables-services를 설치
2. SSH 보안설정
> 서버 접속에 대한 보안룰을 적용한다.
## 루트 로그인 방지를 위한 일반관리계정 추가 useradd -G wheel admin passwd admin ## 일반관리계정에 root 계정 권한 부여 chmod 600 /etc/sudoers vi /etc/sudoers ## SSH 접속 제한설정 vi /etc/ssh/sshd_config
# /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그룹만 가능토록함
– 시스템 운영의 중요한 부분은 wheel그룹만 가능토록함
3. 퍼미션 설정
> 보안에 문제가 될 수 있는 명령어는 root계정 또는 wheel그룹에게만 권한을 부여한다.
## 컴파일러 퍼미션 변경 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)한다기 보다 정책에 맞추어 설정하여 운영할 수 있도록 한다.
## [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
==> 80, 81, 443, 488, 8008, 8009, 8443, 9000