이 수업의 핵심은 Tomcat이 아니라 systemctl이다. 패키지 매니저로 설치하면 자동으로 서비스 파일이 등록되지만, 수동 설치한 소프트웨어는 직접 서비스 파일을 만들어야 한다. 그 과정을 Tomcat으로 실습한다.
dnf install httpd -y
systemctl status httpd
패키지 매니저(dnf)로 설치하면 /usr/lib/systemd/system/httpd.service에 서비스 파일이 자동 생성된다.
서비스 파일은 3개 섹션으로 구성된다.
| 섹션 | 역할 |
|---|---|
[Unit] | 서비스 설명, 의존성 정의 |
[Service] | 실행 방식, 사용자, 시작/중지 명령어 |
[Install] | 부팅 시 자동 시작 설정 |
wget https://...apache-tomcat-10.1.54.tar.gz
tar xzvf apache-tomcat-10.1.54.tar.gz
dnf install java-17-openjdk -y
useradd --home-dir /opt/tomcat/ --shell /sbin/nologin tomcat
/opt/: 패키지 매니저가 아닌 수동 설치 소프트웨어를 두는 표준 경로--shell /sbin/nologin: 프로세스 실행 전용 계정으로, SSH 로그인을 차단tomcat: 생성할 사용자 이름cp -r apache-tomcat-10.1.54/* /opt/tomcat/
chown -R tomcat.tomcat /opt/tomcat
chown: change owner(소유자 변경)-R: 하위 파일/폴더 전부 재귀 적용tomcat.tomcat: 사용자.그룹 형식Tomcat 프로세스가 tomcat 사용자로 실행되므로, 해당 사용자가 파일을 읽고 쓸 수 있어야 한다.
수동 설치이므로 관리자가 직접 서비스 파일을 만든다. /etc/systemd/system/은 관리자가 직접 만든 서비스 파일을 두는 곳이다.
vim /etc/systemd/system/tomcat.service
[Unit]
Description=Tomcat
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
WorkingDirectory=/opt/tomcat
Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
| 항목 | 의미 |
|---|---|
After=network.target | 네트워크 준비 후에 시작. network.target은 systemd의 부팅 단계 이름 |
Type=forking | 시작 프로세스가 자식 프로세스를 fork하고 종료되는 방식 |
User / Group | 이 사용자/그룹 권한으로 프로세스 실행 |
ExecStart / ExecStop | 시작/중지 시 실행할 명령어 |
WantedBy=multi-user.target | CLI(non-GUI) 모드로 부팅 시 자동 시작 |
systemctl daemon-reload
systemctl start tomcat
systemctl enable tomcat
daemon-reload는 서비스 파일을 새로 만들거나 수정한 후 systemd에게 다시 읽으라고 알려주는 명령어다.
Q. 왜 전용 사용자로 실행하는가?
root로 실행하면 보안 취약점 발생 시 시스템 전체가 위험해진다. 전용 사용자로 실행하면 피해 범위가 해당 사용자의 접근 범위(/opt/tomcat/)로 제한된다. 이것이 **최소 권한 원칙(Principle of Least Privilege)**이다.
리눅스에서 "사용자"는 사람뿐 아니라 프로세스에 권한을 부여하기 위한 단위로도 쓰인다. tomcat, mysql, www-data 등 서비스마다 전용 사용자를 만들어 각자의 영역만 접근하도록 격리하는 것이 기본 패턴이다.
Q. Type=forking에서 fork란?
GitHub fork와 비슷하다. 원본 레포를 fork하면 독립된 복사본이 생기듯, 프로세스 fork도 부모 프로세스가 자신의 독립된 복사본(자식 프로세스)을 만드는 것이다. startup.sh(부모)가 실행되면 Tomcat 서버(자식)를 fork해서 띄우고, 자기 자신은 종료된다. Type=forking은 systemd에게 "부모가 종료되더라도 자식이 실제 서비스니까 그걸 추적해라"고 알려주는 설정이다.
Q. tomcat 사용자/그룹으로 실행하는 게 어떤 의미인가?
root로 Tomcat을 실행하면, 보안 취약점이 생겼을 때 공격자가 시스템 전체를 장악할 수 있다. tomcat 전용 사용자로 실행하면 피해 범위가 /opt/tomcat/으로 제한된다. 이것이 최소 권한 원칙이다.
Q. 왜 --shell /sbin/nologin으로 사용자를 만드는가?
이 사용자는 프로세스 실행 전용이지 사람이 쓸 계정이 아니다. 로그인이 가능하면 공격자가 이 계정으로 SSH 접속을 시도할 수 있다. /sbin/nologin으로 설정하면 로그인 자체가 불가능하므로 그 경로를 차단한다. 권한은 주되, 사람이 접속할 수 있는 문은 닫는 것이다.
Q. 리눅스의 사용자/그룹은 웹서비스의 사용자 개념과 다른가?
다르다. 웹서비스에서 "사용자"는 로그인하는 사람이지만, 리눅스에서 "사용자"는 프로세스에 권한을 부여하기 위한 단위로도 쓰인다. 서비스마다 전용 사용자를 만들어 각자의 영역만 접근하도록 격리하는 것이 리눅스 보안의 기본 패턴이다.