
init 프로세스를 대체한 PID 1번 프로세스이다. 시스템, 로그, 서비스 등 시스템 관리의 전반적인 작업을 수행한다. 이는 부팅시에 최초로 실행되고 이후 다른 프로세스들이 순차적으로 실행되며 시스템 부팅이 완료된다.

systemd는 unit 단위로 시스템을 관리하고 /etc/systemd/system, /run/systemd/system, /usr/lib/systemd/system 총 세 곳의 디렉토리에 저장된다.
/etc/systemd/system
시스템 관리자가 수동으로 생성 및 관리하는 유닛들이 저장되는 공간. 부팅시 해당 디렉토리를 참고하여 서비스를 실행한다. 위 사진은 multi-user.target 이름으로 된 디렉토리 정보다./run/systemd/system/usr/lib/systemd/systemsystemctl은 systemd 유닛을 관리하는 명령어다. 기존 init에선 service라는 명령을 썼다.
systemclt의 명령어 구조는 다음과 같다.
systemclt subcommand [option] unit name
예시로 list-units라는 subcommand를 실행했다. 해당 보조 명령은 시스템에 존재하는 유닛 중 실행 상태인 유닛을 확인할 수 있다. 여기서 -a옵션을 주면 비활성화 상태인 유닛의 정보도 확인 가능하다.
status 보조 명령은 지정한 유닛의 자세한 정보를 확인할 수 있다. 위 사진에선 sshd를 확인했고 활성화 상태, 경로, PID, Cgroup과 같은 정보들을 확인할 수 있다.
시스템 로그 관리에 대한 흐름을 나타낸 그림이다. 시스템 이벤트가 발생하면 systemd-journald로 모두 전달된다. 부팅이 시작 되는 순간부터 로그를 수집하고 이후 rsyslogd로 전달하여 각 파일별로 저장한다.
로그 수집 데몬에 따라 저장되는 위치가 다르다. 우선 시스템 로그, 서비스 로그, 커널 로그는 모두 systemd-journald로 전달되고, journal이라는 로그 저장 파일을 생성, 그 중 syslog는 rsyslogd로 전달한다. 이후 rsyslogd는 /var/log에 별도로 로그 파일을 생성하고 저장한다.
/var/log/messages: 대부분 로그 기록 (인증, 메일, cron, booting, debugging 관련 로그는 제외)/var/log/secure : 인증 관련 로그/var/log/maillog : 메일 관련 로그/var/log/cron : 예약 작업 관련 로그/var/log/boot.log : 부팅 관련 로그수집된 로그인 jounal은 /run/log/journal에 .bin형태로 저장된다. /run 디렉토리는 메모리 기반 파일 시스템에 마운트 되어 있어 재부팅 되면 삭제된다. 
로그 파일에 계속 저장하게 되면 크기가 과도하게 커지고 분석하기 어려워지며 파일을 읽어 오는데 메모리 사용량이 많아지게 되어 일정 기간, 크기에 달하면 로그 파일을 백업하고, 백업 파일도 마찬가지로 일정 기준에 따라 삭제하도록 설정하는 것을 로그 파일 순환이라고 한다.
log rotate 설정은 위 logrotate.conf파일을 이용한다. 순환 주기, 보관 기간과 같은 옵션이 담겨 있고 이를 통해 새로운 로그 파일을 만들어 관리하게 된다. 실습은 logrotate 기준을 기간으로 잡을 경우 오랜 시간이 걸리므로 크기를 기준으로 진행하겠다.
# history
mkdir /var/log/testLog
touch /var/log/testLog/testLog.log
dd if=/dev/zero of=/var/log/testLog/testLog.log bs=512 count=10
ls -l /var/log/testLog
실습에 사용할 디렉토리와 로그 파일을 생성하고 5kb 크기의 데이터를 추가했다.
/etc/logrotate.d/testLog라는 이름으로 순환 시킬 로그 파일, 순환 조건, 순환 파일 개수, 로그 파일의 이름을 설정한다.
logrotate명령으로 수동으로 로그를 순환시켰다. 기존에 생성했던 testLog.log파일은 testLog.log.1`로 수정되었고, 새로운 로그 파일이 생성된 것을 확인할 수 있다.
rsyslogd는 시스템 로그 표준 프로토콜로 syslog를 사용하여 로그를 저장하는 프로세스다. /etc/rsyslog.conf를 사용해 저장할 로그 파일을 설정하고 수신 로그를 /var/log의 각 파일로 전달한다.
rsyslog.conf파일에 로그 규칙 관련 내용이다. 공백 기준 앞이 Filter, 뒤가 동작이다.
필터를 만약 cron.err로 설정했다면 선택한 로그 레벨은 err이 되고, emerge ~ err까지의 모든 로그를 다 저장하겠다는 의미가 된다. 이를 그림으로 표현하면 위와 같다.
시스템 부팅부터 발생하는 모든 이벤트를 수집하여 바이너리 형태의 journal을 저장한다. 일반적인 파일 조회 명령으로는 확인이 불가하여 journalctl이라는 명령을 사용하여 데이터를 조회한다.
journalctl 명령을 옵션과 인자 없이 실행하면 현재 저장된 저널 데이터를 확인할 수 있다. 여기서 가장 먼저 출력되는 것은 부팅 관련 로그이다.
우선 순위 지정 출력, 날짜 지정 출력과 같이 다양한 옵션이 있지만 최근 로그와 현재 발생하고 있는 이벤트에 대한 로그를 실시간으로 모니터링 할 수 있는 -f옵션이 있다.
위 사진과 같이 실시간으로 로그를 확인할 수 있다.
위에서 말한거처럼 메모리 기반 파일 시스템에 저장되기 때문에 재부팅시 사라지게 된다. 이때 설정을 통해 로그 파일을 영구 저장할 수 있다. 영구 저장 설정 방법은 다음과 같다.
# history
ls -ld /run/log/journal/
mkdir /var/log/journal
chown root:systemd-journal /var/log/journal/
chmod g+s /var/log/journal/
systemctl restart systemd-journald
기존 /run/log/journal/ 디렉토리 소유권을 변경하고 setgid설정을 하고 시스템 데몬을 재시작한다.
영구 저장을 항상 할 수 있는건 아니고 저널 데이터 파일 크기가 현재 파일 시스템 전체 사이즈의 10%를 초과하면 안되고 현재 파일 시스템 여유공간 중 15%를 초과하면 안된다라는 조건이 따른다.
기본적인 네트워크 내용은 다뤘으니 인터페이스를 서로 다른 vm에 설정하여 동일 네트워크에서 통신하는 것만 확인 해보도록 하자. 네트워크 관리자 도구는 nmcli를 사용하도록 하겠다.
먼저 nmcli connection add명령으로 dynamic이라는 이름의 enp0s3 네트워크 연결을 생성하고 host 이름을 설정한 후 생성된 연결 정보를 확인한다.
dynamic의 연결을 활성화 시켰다.
두 번째 vm에는 다음과 같이 설정한다.
static도 마찬가지로 연결을 활성화 시킨다. 이제 client -> server, server -> client로 ping test를 진행한다. 
ping이 모두 잘 가는 것을 확인할 수 있다.
server라는 이름으로 ip를 등록하고 마찬가지로 client도 등록 해주자.
등록하면 이름으로도 ping을 보낼 수 있다.
외부에서 원격 접속시 telnet과 같은 remote shell을 사용했었지만 Sniffing, Spoofing과 같은 공격 가능성이 있어 안전하지 않다. 이에 암호키를 사용해 데이터 암호화를 지원하는 ssh를 기본으로 사용하고 있다.
SSH 연결시 대칭키, 비대칭키 암호화, Hash를 사용하여 인증 및 암호화를 진행한다.
대칭키 방식은 클라이언트-서버 간 전체 연결을 암호화에 사용되며, 비대칭키 방식은 키 교환, 클라이언트 인증, 서버 인증에 사용되고, 해시 알고리즘은 패킷의 무결성을 확인하기 위해 사용한다.
SSH 연결 동작은 다음과 같다.
Linux OpenSSH 설정 파일은 /etc/ssh에 존재한다. 서버 설정, 암호키에 대한 정보들을 확인할 수 있다. 
sshd_config 파일의 일부이다. 주석 처리되어 있지만 포트번호, sshd 서비스 대기 주소, 버전과 같은 정보를 확인할 수 있고, 키 파일 관련 설정에서 암호화 알고리즘을 통해 /etc/ssh에 저장하도록 설정되어 있다.
또한 로그 파일 생성시 로그 파일 종류를 지정하고 있고, 로그의 우선순위도 지정하고 있다. 해당 로그는 /var/log/secure에서 확인할 수 있다. 인증 관련에서 로그인 실패시 연결을 끊는 시간, 루트 사용자 허용여부, 원격 로그인 인증 시 패스워드 인증 사용 여부 같은 것들도 설정 가능하다.