
방화벽은 외부 네트워크에서 내부 시스템에 접근하는 인가되지 않은 네트워크 패킷을 차단해주는 보안 솔루션이다.
systemd와 함께 도입된 방화벽 서비스로 동적으로 방화벽 설정을 변경할 수 있어 네트워크 변화에 제한없이 대응할 수 있다. 주요 특징은 다음과 같다.
저 방화벽이 활성화 되어 있는지 여부와 기본으로 설정된 zone의 정보를 확인한다.
--set옵션을 통해 기본으로 설정된 zone을 다른 zone으로 바꿀 수 있다.
--add옵션으로 http 서비스를 work zone에 추가할 수 있다.
--reload 옵션을 통해 방화벽을 초기화 시킬 수 있다. 이때 --permanent옵션을 넣지 않으면 runtime에만 설정한 규칙들이 적용되고, 초기화하면 사라진다. 
vm의 enp0s8인터페이스의 ip주소로 물리 머신에서 ping을 보내면 잘 보내지는 것을 확인할 수 있고, SSH 연결도 잘 되는 것을 확인할 수 있다.
관리자인 root는 막강한 권한이 있어 지속적인 권한 탈취 문제가 있어 사용자별 접근통제 및 제어를 통해 시스템을 보호하기 위해 사용하는 것이 SELinux이다.
접근 제어 모델에서 주체(Subject)와 객체(Object)
- 주체: 시스템 자원에 접근하는 프로세스 또는 사용자
- 객체: 파일 또는 포트와 같은 시스템 자원
MAC모델은 강제 접근 제어 모델로 Context라고 불리는 보안 레이블과 Boolean이라고 불리는 정책 허용 스위치를 통해 접근 제어를 한다. MAC 모델은 주체가 객체에 접근할 수 있는 권한이 있는지 확인하고, Context까지 확인한다.
SELinux의 동작 원리를 간단히 나타낸 그림이다. SELinux는 MAC 모델을 사용하는데 이로 인해 모든 프로세스와 파일에는 Context가 부여되고, Subject가 Object에 접근할 때 설정된 Context를 확인하여 접근 관리를 한다. 하지만 Context에 의해 차단이 돼도 접근할 수 있는 경우가 있는데, 이는 정책 허용 스위치인 Boolean이 활성화 된 것이다.
SELinux는 Disabled, Enforcing, Permissive 세 가지 모드가 있다. Disabled는 말 그대로 비활성화 된 상태로 MAC 모델보다 취약한 DAC 모델을 사용하는 것이고, Enforcing은 활성화 상태로 MAC 모델이 적용, Permissive는 SELinux가 활성화 되어 있지만 정책을 따르지 않는 모드를 의미한다. 보통 Enforcing모드로 전환하기 전 문제 해결 용도로 사용한다.
예를 들어 httpd 서비스의 기본 포트 번호가 80번인데 임의로 8900번으로 변경하여 사용한다고 해보자. 이를 시도 해보면 서비스 제공이 안되는데 이는 SELinux에서 지원하는 기능 중 Port Label에 변경하고자 하는 포트번호가 등록되어 있지 않기 때문이다.
따라서 임의로 기존 서비스의 기본 포트 외 다른 포트를 이용하려고 할 때는 Port Label에 추가, 수정이 필수적이고 그렇지 않으면 SELinux MAC 모델의 정책에 따라 차단이 된다. Port Label설정은 실습을 통해 확인하자.
getenforce 명령으로 SELinux의 활성화 상태를 확인할 수 있고, 현재 활성화 되어 있음을 확인할 수 있다. setenforce명령에 0 | 1을 설정하면 각각 permissive, enforcing 상태로 설정 가능하다. 단, 이는 런타임에만 적용되고 reboot하면 초기 설정으로 돌아간다.
SELinux 영구 설정은 /etc/sysconfig/selinux파일에 담겨 있고 세 가지 모드를 설정하고 저장하면 적용된다.
ls명령에 -Z옵션을 이용해서 Context 확인이 가능하다. 나는 /tmp디렉토리 안에 디렉토리를 하나 더 만들어 확인했고, 현재 user_tmp_t로 context가 설정되어 있음을 알 수 있다. context는 생성한 사용자의 umask에 따라 달라진다.
/etc/passwd파일을 생성한 디렉토리에 복사한 후 원본 파일과 복사한 파일의 context를 확인 해봤다. 원본 파일의 context는 passwd_file_t 복사본은 user_tmp_t임을 확인할 수 있었고, 복사한 사용자에 따라 context가 설정됨을 확인할 수 있다. 만약 원본 그대로 복사하고 싶다면 -a옵션을 추가해서 복사하면 된다.
restorecon -vR 명령으로 시스템에서 기본으로 정의 된 context로 되돌리기가 가능하다. 하지만 /tmp디렉토리 내에는 default로 설정되어 있는 값이 없어 Warning 메세지가 뜨게 된다.
semange명령을 이용해서 context 기본값을 설정할 수 있다. 하이라이팅 된 곳 /tmp/my-workspace밑에 생성되는 모든 파일을 의미한다. 즉, 설정한 디렉토리 밑에 생성되는 모든 파일, 디렉토리는 설정값을 따른다는 의미이다.
이후 다시 restorecon명령을 시도 해보면 warning 메세지가 뜨지 않고 default값으로 설정됨을 확인할 수 있다.
22번 포트를 사용하는 서비스는 ssh이고, 해당 서비스의 Port Label은 ssh_port_t임을 알 수 있다. 22번 대신에 2020번 포트를 사용하려고 한다면 위와 같이 semanage명령에 -a옵션을 주면 추가할 수 있다.
ssh 서비스에 설정한 2020 포트를 http 서비스에서 사용하기 위해 변경한 결과다. 마찬가지로 semange명령에 -m옵션을 주면 Port Label 설정이 가능하다.
설정한 포트를 삭제할 때는 semange명령에 -d옵션을 주면 된다. 해당 명령 수행 후 레이블을 확인 해보면 삭제가 됐음을 알 수 있다.
/etc/httpd/conf/httpd.conf에 http 관련 설정을 할 수 있는데, port를 8888번으로 변경하고 httpd 서비스를 재시작하면 사진과 같이 에러 메시지가 발생한다. 
로그를 확인해보면 Port Label에 등록 되어 있지 않아 Permission Deny가 발생한 것이다.
Port Label 설정 후 다시 시행 해보면 오류 메세지가 뜨지 않고 정상적으로 active 상태로 들어온 것을 확인할 수 있다.
방화벽 설정까지 하고나면 접속이 가능하다.
FreeIPA는 통합 인증을 위해 여러 오픈소스를 통합한 솔루션으로 다음과 같은 오픈소스로 구성된다.
cli, gui 모두 지원하고 ID관리와 인증을 동시에 처리할 수 있다. 일반적으로 네트워크를 통한 서비스는 다수의 시스템으로 구성되어 있고, 각각 로그인을 해야하지만 FreeIPA는 SSO(Single Sign On)을 지원하여 한번 로그인 한 사용자는 다시 로그인을 할 필요가 없다. 이는 LDAP과 Kerberos가 지원한다.

클라이언트가 네트워크를 통해 디렉토리 정보에 접근할 때 사용하는 TCP/IP 기반 프로토콜이다. 계층형 구조로 각 계층을 구성하는 노드는 Entry라고 하고, 다수의 속성이 포함되어 있다. 즉, Entry는 목록이고 속성은 Entry 관련 정보, 데이터를 의미한다.
네트워크 인증 프로토콜로 사용자 인증시 대칭키를 사용하고 네트워크를 통해 패스워드를 전송하지 않기 때문에 Sniffing 같은 공격을 방지할 수 있다는 장점이 있다. Kerberos는 클라이언트, 서버, KDC(Key Distribution Center) 등으로 구성되어 있다. 인증 과정은 위 그림과 같고 간단히 정리하면 아래와 같다.
74 sudo hostnamectl hostname ipa.toss.example.com
76 nmcli con show
77 dnf install ipa-server iap-server-dns
78 sudo dnf install ipa-server ipa-server-dns
81 sudo nmcli con add type ethernet con-name ipa-net ifname enp0s8 ipv4.addresses 10.0.2.100/24 ipv4.gateway 10.0.2.1 ipv4.method manual
82 sudo nmcli con up ipa-net
83 nmcli con show
84 sudo nmcli con up 4028441d-774a-45c1-a14e-bac697df4b72
87 nmcli con show
88 sudo vim /usr/local/
89 sudo vim /etc/host
90 tail -n1 /etc/host
91 sudo chronyc sources
92 ip addr
93 sudo ipa-server-install --setup-dns
95 sudo firewall-cmd --add-service={freeipa-ldap,freeipa-ldaps,dns,ntp}
96 sudo firewall-cmd --list-all
97 sudo firewall-cmd --add-service={freeipa-ldap,freeipa-ldaps,dns,ntp} --permanent
98 ls
99 sudo ls /root
100 kinit admin
101 klist
102 ipa
103 ipa config-show
먼저 ipa-server, ipa-server-dns를 설치 해주고 진행하자. 
IPA 서버 구성을 위해 먼저 호스트 이름과 네트워크 IP를 설정하고 up옵션을 통해 설정한 네트워크 인터페이스를 활성화 시킨다.
/etc/host파일에 설정한 ip와 host를 추가 해준다. 그 후 sudo ipa-server-install --setup-dns 명령으로 서버를 설치한다. 이때 관리자 계정, 주요 서버 설정들을 하게 된다. 계정 설정 부분 외에는 그냥 다 yes로 넘어가면 된다.
설정이 완료되면 위와 같은 화면을 확인할 수 있다.
이후 방화벽 설정에도 ipa 관련 서비스들을 --permanent옵션으로 추가하면 서버 설정이 끝난다.
그리고 사용자를 위와 같이 추가할 수 있다.
75 sudo dnf -y install ipa-client
76 nmcli con show
77 hostnamectl hostname nfs.toss.example.com
78 sudo nmcli con add type ethernet ifname enp0s3 con-name static ipv4.addresses 10.0.2.200/24 ipv4.gateway 10.0.2.1 ipv4.dns 10.0.2.100 ipv4.method manual
79 nmcli con show
85 sudo nmcli con up 2cc638a9-cd19-49f7-816b-cc5568c1258e
86 nmcli con show
87 ipa-client-install --mkhomedir
88 sudo ipa-client-install --mkhomedir
Client 측 설정은 더 간단하다. 먼저 ipa-client를 설치하도록 하자.
설치가 완료되면 서버와 마찬가지로 호스트 이름을 등록하고 네트워크 인터페이스를 설정한다. 이때 Gateway는 서버와 동일하게 설정 해야한다.
이제 FreeIPA 서버에 클라이언트를 연결하는 작업을 해야한다. 이때 ipa-client-install --mkhomedir명령을 사용하고 User authorized to enroll computers: 에 설정한 admin의 이름을 넣고 패스워드를 입력하면 끝난다.
getent명령으로 서버측에서 확인해보면 클라이언트가 잘 등록됐음을 확인할 수 있다.
keytab 파일은 FreeIPA 서버에 연결된 시스템 간 인증시 서비스 목록과 암호화 방법을 담고 있는 파일이다.
먼저 kerberos 인증 사용을 위해 ipa service-add 명령으로 서비스를 등록 해준다.
ipa-getkeytab명령으로 등록한 서비스에 대한 keytab 파일을 생성 해준다.
klist명령에 -k옵션을 주면 등록된 서비스에 대한 keytab파일 정보를 확인 가능하고 -e옵션까지 입력하면 각 파일의 암호화 방식에 대해 확인도 가능하다.
Data가 폭발적으로 증가함에 따라 저장, 관리의 필요성이 대두되었고 Storage라는 개념이 등장했다. 물리적 연결을 통해 Data를 관리하는 DAS(Direct Attached Storage) 방식을 사용했지만 접근성 향상에 필요가 증가하면서 NAS(Network Attached Storage), SAN(Storage Area Network)를 주로 사용하게 됐다.
네트워크를 통해 연결된 Storage 장치를 의미하고, 파일 단위로 접근해서 사용할 수 있도록 전용 파일 서버로 파일 I/O에 최적화 된 서버다.

Storage전용 네트워크를 별도로 가져 신뢰성이 높고 처리 속도가 빠르다. 블록 기반으로 동작하기 때문에 디스크를 인식하는 거처럼 사용하고, 파티셔닝 후 파일 시스템 생성하여 사용한다.
SAN방식은 크게 FC-SAN, IP-SAN으로 나뉘고 물리적인 케이블을 통한 연결을 지원하는 게 FC-SAN 방식이지만 비용과 거리적 제한 때문에 사용하지 않는다.
IP-SAN방식은 또 여러가지로 나뉘지만 iSCSI 방식만 볼거고, 이 방식은 TCP/IP 기반으로 동작하여 비용, 거리적인 문제를 해결했다.
iSCSI 용어
- Target: iSCSI 서버
- Initiator: Client
- IQN(iSCSI Qualified Name): Target과 Initiator 이름
Target 용어
- TPG(Target Portal Group): Target 설정 값들을 하나의 그룹으로 만든 연결에 대한 설정
- ACL(Access Control List): 스토리지에 연결에 대한 접근 제어 리스트
- LUN(Logical Unit Number): 스토리지 장치에 대한 id
- Portal: Initiator가 Target에 연결할 때 사용하는 IP, Port
Initiator 용어
- Discovery: 연결 대상 검색
- Login: Discovery 단계 결과에 대한 연결 과정