⚠️ 이 포스팅은 CentOS 7을 기준으로 작성되었습니다.
해당 명령어들은 모두 root를 기준으로 작성되어있으며,
sudo 유저로 진행되는 경우 root 권한이 필요할 때 sudo를 명령어 앞에 붙이며 진행하시면 됩니다.

 

0. 현재 언어 설정 확인
먼저 현재 언어 설정을 확인하려면 locale 명령어를 사용

[root@localhost ~] # locale

 

결과가 LANG=ko_KR.UTF-8 또는 LANG=ko_KR.eucKR와 같이 한글로 설정되어 있지 않다면

아래의 방법으로 설정을 변경한다.

 

 


1️⃣ 현재 세션 변경(비영구)

터미널에서 다음 명령어를 입력하여 현재 세션의 언어 설정을 변경

[root@localhost ~] # LANG=ko_KR.eucKR
[root@localhost ~] # LANG=ko_KR.UTF-8


​​

2️⃣ 재부팅 후에도 적용되는 영구 설정(루트 권한 필요)

1. 홈 디렉토리로 이동(root 계정으로 진행)

[root@localhost ~] # cd /root

 


2. .bash_profile 수정

[root@localhost root] # vi .bash_profile

 


3. 언어 설정 추가
파일의 마지막 줄에 다음 줄을 추가하고 파일을 저장.

# ...
LANG=ko_KR.eucKR


또는

# ...
LANG=ko_KR.UTF-8

 


4. 변경된 설정 적용

[root@localhost root] # source .bash_profile

 


🤔 위 방법이 작동하지 않는 경우

[root@localhost ~] # vi /etc/profile

 

파일의 마지막 줄에 다음 줄을 추가하고 파일을 저장

# ...
LANG=ko_KR.UTF-8


변경된 프로필을 다시 적용.

[root@localhost ~] # source /etc/profile
⚠️ 이 포스팅은 CentOS 7을 기준으로 작성되었습니다.
또한 해당 명령어들은 모두 root를 기준으로 작성되어있으며,
sudo 유저로 진행되는 경우 root 권한이 필요할 때 sudo를 명령어 앞에 붙이며 진행하면 됩니다.

 

SSH의 기본포트를 변경하고 SELinux 이용시 또는 이용하지 않을 시 설정하는 방법은 다음과 같다.

 


 

1. SSH 포트 변경
SSH 설정 파일을 열어서 포트를 변경한다. 

텍스트 에디터로 /etc/ssh/sshd_config 파일을 열기(다음의 방법은 vi를 기준으로 작성)

[root@localhost ~] # vi /etc/ssh/sshd_config


Port 항목을 찾아서 주석 처리(#)를 해제하고 원하는 포트로 변경
(예를 들어, 포트를 1234로 변경하려면 다음과 같이 설정)

Port 1234




2. 방화벽 설정(CentOS 7 기준)
방화벽 설정을 업데이트하여 새로운 SSH 포트를 허용
다음 명령어를 사용하여 방화벽에 새로운 포트를 추가한다.

[root@localhost ~] # firewall-cmd --permanent --add-port=1122/tcp


방화벽 설정을 적용한다.

[root@localhost ~] # firewall-cmd --reload




3. SSH 서비스 재시작
SSH 설정을 변경했으므로 SSH 서비스를 시작하거나 재시작한다.
이미 실행 중인 경우 다시 시작하고, 새로 설정한 포트를 사용하도록 한다.

[root@localhost ~] # systemctl start sshd
[root@localhost ~] # systemctl restart sshd


다음의 명령어를 통해 SSH를 확인할 수 있다.

[root@localhost ~] # systemctl status sshd




4-1. SELinux 설정 (선택 사항, SELinux를 사용하는 경우)
만약 SELinux를 사용하는 경우, SELinux가 관리하는 포트에 SSH 포트를 등록한다.

 

다음 명령어를 사용하여 SSH 포트를 SELinux에 등록

[root@localhost ~] # semanage port -a -t ssh_port_t -p tcp 1122


등록된 포트를 확인

[root@localhost ~] # semanage port -l | grep ssh_port_t

 



4-2. SELinux 상태 변경 (선택 사항, SELinux를 사용하지 않는 경우)
만약 SELinux를 사용하지 않는다면 다음과 같이 적용한다.


SELinux 상태를 permissive로 변경

[root@localhost ~] # setenforce 0

permissive 상태 : SELinux의 정책에 어긋나는 동작은 감사 로그를 남기고 허용

 

 

 

🤔 SELinux를 완전히 비활성화하려면?

SELinux를 완전히 비활성화하려면

[root@localhost ~] # vi /etc/sysconfig/selinux


파일을 편집하고 SELINUX=disabled로 설정.

SELINUX=disabled



⚠️ 이 포스팅은 CentOS 7, Tomcat 8.5.59을 기준으로 작성되었습니다.

 

CentOS 7 Linux 서버에서 톰캣이 리부트 되더라도 항상 자동으로 구동되게 서비스로 등록하고자 한다.

 


 

1. 서비스 파일 생성 및 등록

먼저 Tomcat 서비스를 관리할 서비스 파일을 생성하고 등록한다.

[user@localhost ~] $ vi /etc/systemd/system/tomcat.service

 

 


2. 서비스 파일에 다음 내용 입력

새로 생성한 서비스 파일에 아래 내용을 입력

[Unit]
Description=Tomcat 8.5.59
After=network.target syslog.target

[Service]
Type=forking
Environment="JAVA_HOME=/usr"
Environment="CATALINA_HOME=톰캣 패스"
User=서비스계정
Group=서비스계정그룹
ExecStart=톰캣 패스/bin/startup.sh
ExecStop=톰캣 패스/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
Description: 서비스의 설명
Environment JAVA_HOME과 CATALINA_HOME 환경 변수를 Tomcat이 설치된 디렉토리에 맞게 설정
User 및 Group Tomcat 서비스를 어떤 사용자와 그룹으로 실행할 것인지 설정
ExecStart Tomcat을 시작하는 스크립트의 경로
ExecStop Tomcat을 중지하는 스크립트의 경로

 

 

 

3. Daemon 재로드
서비스 파일을 생성한 후에는 systemd에 해당 파일의 변경 사항을 적용해야 한다.
다음 명령어를 사용하여 Daemon을 다시 로드한다.

[user@localhost ~] $ sudo systemctl daemon-reload

 

 

 

4. 시작 서비스로 등록
마지막으로 Tomcat 서비스를 서버 부팅 시 자동으로 시작하도록 등록

[user@localhost ~] $ sudo systemctl enable /etc/systemd/system/tomcat.service
[user@localhost ~] $ sudo systemctl start /etc/systemd/system/tomcat.service



⚠️ 이 포스팅은 CentOS 7을 기준으로 작성되었습니다.

 

폐쇄망에 설치된 서버에 프로그램을 설치하고자 할 때, 온라인 환경이 아니어서 의존 패키지를 한번에 설치해주는 yum과 같은 명령어를 사용하지 못해서 문제가 발생했다.

의존 패키지의 종류를 하나하나 다 확인하며 받기에는 어렵기 때문에 온라인 환경의 동일한 OS의 서버로 오프라인 환경의 서버에 패키지를 설치하고자 한다.

 


✅ yumdownload와 온라인 서버를 이용

⚠️ 사전 요구사항

  • 인터넷에 연결된 다른 CentOS 7 서버
  • 이동식 저장장치 (예: USB 드라이브)

다음의 방법은 기본적으로 온라인 환경인 CentOS 서버가 필요하다.

윈도우 PC에서 VMWare를 통해 동일한 OS의 서버를 생성하여 진행하기를 추천한다.

 

 

 

1. yumdownload를 설치하기 위한 준비 

네트워크가 연결된 CentOS 7 서버에 접속하여 yum-utils를 설치

[user@localhost ~] $ sudo yum install yum-utils

 

yum-utils를 설치하여 yumdownload 명령을 사용할 수 있도록 준비한다.

 

 

 

2. (옵션) 패키지들을 저장할 디렉터리 생성
패키지를 다운로드할 디렉터리를 만든다.
(패키지 이름에 따른 디렉터리를 생성하면 분류가 쉽다.)

[user@localhost ~] $ mkdir [패키지명]




3. 인터넷 연결 가능한 서버에서 패키지 다운로드
yumdownloader 명령을 사용하여 패키지를 다운로드
이때, --downloadonly, --resolve, 및 --destdir 옵션을 사용

[user@localhost ~] $ yumdownloader --downloadonly --resolve --destdir=[생성한패키지폴더경로] 패키지명
  • downloadonly : 패키지를 설치하지 않고 다운로드만 진행
  • resolve : 패키지의 의존성 패키지도 한꺼번에 다운로드
  • destdir : 다운로드한 패키지를 저장할 디렉터리를 지정 (기본값은 현재 위치)

다운로드 받는 패키지 및 의존성 패키지의 순서를 확인한다.
(해당 순서를 통해 설치 쉘스크립트를 만들면 좀 더 수월하게 문제를 해결할 수 있다.)

 

 

 

4. (옵션) 설치 쉘 스크립트 작성
패키지 및 의존성 패키지를 순서대로 설치하는 스크립트를 만든다.
자신이 편한 방식대로 작성하거나 쉘 스크립트를 작성하지 않고 바로 오프라인 환경에 rpm 파일들을 옮겨서 설치해도 상관없다.

다음의 설명 방법은 스크립트가 실행 중에 오류가 발생하면 오류를 확인하고 다음 명령을 실행할 수 있도록 키 입력을 받는 스크립트를 작성하는 것이다.


편집기로 패키지를 생성한다.
편집기는 편한 것을 사용해도 상관없으며, 이 포스팅은 vi를 기준으로 작성되었다.
해당 명령어를 그대로 사용​하려면 패키지들이 있는 위치와 스크립트의 위치가 동일해야 한다.

[user@localhost ~] $ cd 패키지폴더
[user@localhost 패키지폴더] $ vi 쉘스크립트명.sh


그런 다음 스크립트에 패키지 설치 명령을 추가

rpm -ivh 의존패키지1.rpm
read -s -n1 -p "Press any key ..."
rpm -ivh 의존패키지2.rpm
read -s -n1 -p "Press any key ..."
rpm -ivh 의존패키지3.rpm
read -s -n1 -p "Press any key ..."
# ...
rpm -ivh 설치할목표패키지.rpm


ivh로 설치하는 경우 다른 버전의 패키지가 설치되어 설치에 차질이 생길 수 있으니
해당 프로그램이 설치할 때, 꼭 특정 버전의 의존 패키지가 필요하다면 Uvh로 작성

필요한 모든 패키지를 위의 과정을 반복하여 다운로드하고 스크립트를 작성한다.

 

 

 

5. (옵션) 패키지가 저장된 디렉토리 압축

[user@localhost ~] $ zip -r 패키지명.zip [패키지와 .sh파일이 있는 디렉터리]/*

* 는 전체 파일을 의미

 

 


6. 필요한 파일을 오프라인 서버로 이동
모든 패키지 및 스크립트를 이동식 저장장치에 복사



7. (옵션) 압축된 파일들 풀기

[user@localhost ~] $ mkdir 해제할디렉터리
[user@localhost ~] $ unzip 패키지명.zip -d [해제할디렉터리]




8. 프로그램 설치
이동식 저장장치에 있는 패키지 파일을 인터넷 연결이 없는 서버로 이동

만약, 쉘 스크립트를 작성했다면 쉘스크립트를 실행한다.
앞서 작성한 쉘스크립트를 사용하려 한다면

[user@localhost ~] $ cd 패키지모음디렉터리
[user@localhost 패키지모음디렉터리] $ sh 쉘스크립트명.sh


쉘스크립트 없이 설치한다면

[user@localhost ~] $ rpm -ivh 패키지.rpm



⚠️ 이 포스팅은 CentOS 7을 기준으로 작성되었습니다.

 

윈도우에서 shell 스크립트를 작성한 후 linux 서버에서 실행할 때 $'\r': command not found 오류가 발생했다.

해당 문제는 윈도우와 리눅스의 개행문자가 다르기 때문에 발생한다.

 

윈도우의 개행문자는 CRLF (Carriage Return + Line Feed = \r\n)이며,

리눅스의 개행문자는 LF (Line Feed = \n)이다.

따라서 윈도우에서 쉘 스크립트를 작성하는 겨우 개행이 윈도우의 개행문자로 들어가게 되면서 위의 오류가 발생한다.

 


✅ sed 명령어 사용

1. sed 명령어 사용
sed 명령어를 사용하여 스크립트 파일에서 CRLF 개행문자(\r)를 제거하고 LF (\n)로 변경

[user@localhost ~] $ sed -i 's/\r$//' [파일명]

-i : 파일 내용을 직접 수정하는 옵션

💡 TIP

윈도우에서 스크립트를 작성할 때 텍스트 편집기의 개행문자 형식을 LF로 설정하고 스크립트를 작성하면

이러한 문제를 방지할 수 있다.

⚠️ 이 포스팅의 취약점 조치는 CentOS 7을 기준으로 작성되었습니다.

 

📌 정책에 따른 시스템 로깅 설정

  • 로그 기록 정책이 미흡하게 설정되어 있음
  • 기준 : 로그 기록 정책이 정책에 따라 설정되어 수립되어 있는 경우

시스템 로깅은 log를 통해 보안 문제를 확인할 수 있다.

따라서 보안을 위해 다음과 같은 로깅 설정이 권장된다.

 


✅ rsyslog.conf 파일 수정

해당 명령어들은 모두 root를 기준으로 작성되어있으며,
sudo 유저로 진행되는 경우 root 권한이 필요할 때 sudo를 명령어 앞에 붙이며 진행한다.

 

 

 

1. /etc/rsyslog.conf 파일 수정 (버전에 따라 이름이 다르니 확인)
먼저, /etc/rsyslog.conf 파일을 편집기로 연다.

[root@localhost ~] # vi /etc/rsyslog.conf

 

 

 

2. 로그 기록 정책 설정
해당하는 부분을 수정하거나 추가하여 로그 기록 정책을 설정

*.info;mail.none;authpriv.none;cron.none         /var/log/messages

authpriv.*                                       /var/log/secure

mail.*                                           /var/log/maillog

cron.*                                           /var/log/cron

*.alert                                          /dev/console

*.emerg                                          *


각 설정은 다음과 같다.

*.info;mail.none;authpriv.none;cron.none       /var/log/messages 정보 로그를 /var/log/messages 파일에 기록
authpriv.*    /var/log/secure 인증 및 권한 관련 로그를 /var/log/secure 파일에 기록
mail.*          /var/log/maillog  이메일 관련 로그를 /var/log/maillog 파일에 기록
cron.*         /var/log/cron cron 작업 로그를 /var/log/cron 파일에 기록
alert           /dev/console 경고 로그 를 콘솔로 출력
*.emerg     * 긴급 로그를 모든 로그 파일에 출력

 

 

 

3. rsyslogd 프로세스 재시작
로그 설정을 적용하려면 rsyslogd 프로세스를 재시작

 

먼저, rsyslogd 프로세스의 PID를 확인한다.

[root@localhost ~] # ps -ef | grep syslogd
root      1234     1  0 10월20 ?      00:00:03 /usr/sbin/rsyslogd -n
root     12345 11058  0 15:31 pts/0    00:00:00 grep --color=auto syslogd

위의 경우에는 rsyslogd의 pid는 1234다.

 

다음, PID를 사용하여 rsyslogd 프로세스를 재시작

[root@localhost ~] # kill -HUP [syslogd pid]

 

⚠️ 이 포스팅의 취약점 조치는 CentOS 7을 기준으로 작성되었습니다.

 

📌 at 파일 소유자 및 권한 설정

  • 취약한 소유자 또는 권한 설정이 존재함
  • 기준 : at 명령어 일반사용자 금지 및 at 관련 파일 소유자가 root이고, 권한이 640 이하인 경우

at은 crontab과 유사하게 예약 작업을 스케줄링할 수 있는 명령어이다. 해당 명령어와 관련 파일들의 소유자는 root로 지정되기를 권장한다.

 


✅ chmod, chown 명령어 이용

해당 명령어들은 모두 root를 기준으로 작성되어있으며,

sudo 유저로 진행되는 경우 root 권한이 필요할 때 sudo를 명령어 앞에 붙이며 진행한다.

 

 

 

1. at 명령어 권한 수정
먼저, at 명령어의 권한을 750 이하로 설정

which 명령어를 통해 at 명령어의 위치를 확인한다.

[root@localhost ~] # which at
/usr/bin/at

 

해당 위치의 권한을 750으로 변경

[root@localhost ~] # chmod 750 /usr/bin/at

 

만약 소유자가 root가 아니라면 다음의 명령어를 통해 소유자를 변경한다.

[root@localhost ~] # chown root:root /usr/bin/at

 

 

 

2. at 관련 파일 권한 수정

at 명령어와 관련된 파일 중 특정 파일에 대한 권한을 수정

[root@localhost ~] # chmod 640 /etc/at*


만약 소유자가 root가 아니라면 다음의 명령어를 통해 소유자를 변경한다.

[root@localhost ~] # chown root:root /etc/at*




⚠️ 이 포스팅의 취약점 조치는 CentOS 7을 기준으로 작성되었습니다.

 

📌 UMASK 설정 관리

  • UMASK가 022 이상으로 설정되지 않음
  • 기준 : UMASK 값이 022 이상으로 설정된 경우

umask(User File Creation Mask)는 파일 및 디렉터리를 생성할 때 적용되는 기본 권한을 제어하는 설정이다.

umask 02는 파일이 664, 디렉터리가 775로 설정되며 umask 022는 파일이 644, 디렉터리가 755로 설정된다.

따라서 보안을 위해 생성하는 파일의 권한을 022로 맞추고자 할 때 다음의 방법을 따른다.

 


✅ profile 파일의 수정

해당 명령어들은 모두 root를 기준으로 작성되어있으며,

sudo 유저로 진행되는 경우 root 권한이 필요할 때 sudo를 명령어 앞에 붙이며 진행한다.

 

umask의 설정을 022로 하고자 한다.

 

 

1. /etc/profile 파일 수정
먼저, /etc/profile 파일을 수정하여 UMASK 값을 설정

[root@localhost ~] # vi /etc/profile

 

 

 

2. UMASK 설정 변경
UMASK 설정 부분을 022로 추가 또는 수정

umask 022
export umask

만약 이미 설정되어 있는 경우 다음 그림의 부분을 모두 umask 022로 수정

 

 

 

3. 설정 적용

변경된 UMASK 설정을 적용하기 위해 아래 명령어를 실행

[root@localhost ~] # source /etc/profile




⚠️ 이 포스팅의 취약점 조치는 CentOS 7을 기준으로 작성되었습니다.

 

📌 Session Timeout 설정

  • Timeout 값이 기준대로 설정되지 않음
  • 기준 : Session Timeout이 600초(10분) 이하로 설정되어 있는 경우

세션 타임아웃은 ssh와 같은 세션 연결 중 특정 시간동안 아무런 이벤트가 없다면 세션의 연결을 끊게 한다.

다음의 과정을 통해 세션 타임아웃을 설정한다.

 


✅ profile 파일의 수정

해당 명령어들은 모두 root를 기준으로 작성되어있으며,

sudo 유저로 진행되는 경우 root 권한이 필요할 때 sudo를 명령어 앞에 붙이며 진행한다.

 

Session Timeout 값을 600초 이하로 설정

 

 

 

1. /etc/profile 파일 수정

먼저, /etc/profile 파일을 편집기로 연다.

[root@localhost ~] # vi /etc/profile

 

 

 

2. Session Timeout 설정 추가
2-1. export TMOUT가 있는 부분을 찾는다.

2-2. 만약 해당 부분이 없다면 파일의 하단에 export TMOUT=600를 추가한다.

export TMOUT=600

 

 

 

3. 설정 적용

변경된 설정을 적용하기 위해 아래 명령어를 실행

[root@localhost ~] # source /etc/profile

 

 

 

4. 설정 확인

Session Timeout 값이 600초로 설정되었는지 확인

[root@localhost ~] # echo $TMOUT
600

 

⚠️ 이 포스팅의 취약점 조치는 CentOS 7을 기준으로 작성되었습니다.

 

📌 불필요한 계정 제거

  • 불필요한 계정이 존재하고 있음
  • 기준 : 불필요한 계정이 존재하지 않는 경우

리눅스 OS를 처음 설치한 이후 생성되는 계정들이 있다. 이 계정들은 특수한 상황이 아니라면 보통 사용하지 않는다.

또한 추가된 계정들 중 퇴사 등 다양한 사유로 더이상 사용하지 않는 계정들이 있을 수 있다. 


해당 계정들은 시스템의 무결성을 위협하기 때문에 주기적으로 삭제하기를 권장한다.

 


✅ userdel 명령어로 유저 삭제

해당 명령어들은 모두 root를 기준으로 작성되어있으며,
sudo 유저로 진행되는 경우 root 권한이 필요할 때 sudo를 명령어 앞에 붙이며 진행한다.

 

 

 

1. 기본 생성 계정 확인 및 제거

먼저, 다음과 같은 기본 생성 계정을 확인한다. 

이 계정들은 보통 불필요하며, 사용이 불가피한 경우가 아니라면 삭제한다.
(CentOS7 기준)

  • adm
  • lp
  • sync
  • shutdown
  • halt
  • news
  • uucp
  • operator
  • games
  • gopher
  • nfsnobody (NFS)
  • squid

 

아래 명령어를 사용하여 계정을 삭제할 수 있다.

[root@localhost ~] # userdel [계정명]

 

 

 

2. 장기 미접속 계정 확인

해당 과정은 신중하게 이루어져야 하며 계정이 실제로 미사용되는지 확인하고 삭제한다.

lastlog 명령어를 사용하여 언제 마지막으로 로그인한 사용자를 확인한다.

[root@localhost ~] # userdel [계정명] lastlog -b [미접속일]


lastlog는 마지막 로그인 이후 미접속일 만큼 경과한 계정을 보여준다.

 

 

 

3. 사용하지 않는 서비스 계정 확인
시스템에서 사용하지 않는 서비스 계정을 확인

[root@localhost ~] # systemctl list-units | grep [계정명]

 

 

 

4. 로그 파일을 작성하는 계정 확인
계정으로 쌓이는 로그 파일이 있는지 확인

[root@localhost ~] # grep [계정명] /var/log/messages

 

 

 

5. 프로세스를 실행중인 계정 확인
해당 계정으로 실행 중인 프로세스를 확인

[root@localhost ~] # ps -ef | grep [계정명]

 

+ Recent posts