Skip to main content

3 posts tagged with "linux"

View All Tags

DevOps - Bash Linux

· 6 min read

1. 쉘 스크립팅에 사용되는 다양한 유형의 변수는 무엇입니까?

쉘 스크립팅에는 다음과 같은 두 가지 유형의 변수가 사용됩니다.

1. 시스템 생성 변수 - 이름에서 알 수 있듯이 운영 체제에서 생성된 변수입니다. 이러한 변수는 Set 명령을 호출하여 볼 수 있습니다.

2. 사용자 정의 변수 - 사용자가 생성한 변수로, echo 명령을 호출하여 볼 수 있습니다.

2. 이름이 example인 파일이 경로에 존재하는지 여부를 어떻게 확인합니까?

및 명령 [은 test본질적으로 스위치입니다. trueor 응답을 내보내 false지만 둘 다 성공으로 간주합니다. 명령을 &&및 같은 논리 연산자와 쌍을 이루어 이를 사용할 수 있습니다 ||. &&응답이 다음과 같을 때 연산자가 실행 됩니다 true.

$ touch example
$ test -e example && echo "foo"
foo
$ test -e notafile && echo "foo"
$

|| 응답이 다음과 같을 때 연산자가 실행 됩니다 false.

$ touch example
$ test -e example || echo "foo"
$ test -e notafile || echo "foo"
foo
$

원하는 경우 대신 대괄호를 사용할 수 있습니다 test. 모든 경우에 결과는 동일합니다.

$ touch example
$ [ -e example ] && echo "foo"
foo
$ [ -e notafile ] && echo "foo"
$

 

3. 파일이 생성될 때 파일의 기본 권한은 무엇입니까?

Linux 또는 UNIX에서 생성된 모든 파일에는 기본 권한이 있으며 파일 권한을 보려면 새로 생성된 파일에 대해 unmask 또는 user 마스크 명령이 사용됩니다. 기호값을 설정하고 표현하는데 사용되는 4자리 8진수입니다. 새로 생성된 파일의 기본 권한은 rw-rw-r 이며 664 입니다 .

4. CRONTAB이란 무엇입니까?

CRON 테이블을 표현하는데 사용됩니다. CRON 일정을 사용하여 작업을 실행합니다. 정기적인 스케줄러 작업을 실행하는 데 사용되는 명령 목록입니다. 스케줄러의 이름은 CRONTAB입니다.

5. 쉘 스크립트와 쉘 프로그램에서 발생한 문제를 어떻게 디버깅합니까?

  1. 첫 번째 방법은 쉘 스크립트 프로그램에 디버그 명령을 넣어 프로그램의 오류나 버그를 출력하거나 표시하는 것입니다.
  2. 두 번째 방법은 set –x를 사용하여 스크립트를 디버깅하는 것입니다.

6. 쉘 스크립트 명령을 사용하여 디스크 사용량을 어떻게 알 수 있습니까?

쉘 스크립트 명령을 사용하여 디스크 사용량을 확인하는 세 가지 방법이 있습니다.

  • dfspace 명령: — 이는 여유 디스크 사용량을 메가바이트 단위로 확인하는 데 사용됩니다.
  • df 명령: — 여유 디스크 공간을 확인하는 데 사용됩니다.
  • du 명령: — 디렉터리별 디스크 사용량을 확인하는 데 사용됩니다.
    예: du -sh /data01/*

7. 쉐뱅라인의 목적을 알려주세요.

shebang 라인은 엔진의 위치를 ​​결정하는 데 사용되는 각 스크립트의 상단에 있으며 스크립트를 실행하는 데 사용됩니다.

8. Linux 프로세스의 4단계에 대해 설명하세요.

4단계에는 다음이 포함됩니다.

  • 대기 중 - Linux 프로세스가 리소스를 기다리고 있습니다.
  • 실행 중 - Linux 프로세스가 현재 실행 중입니다.
  • 중지됨 - 성공적인 실행 후 Linux 프로세스가 중지되었습니다.
  • 좀비 - Linux 프로세스가 프로세스 테이블에서 계속 활성화되어 있지만 중지되었습니다.

9. 메타문자란 무엇입니까?

메타문자는 프로그램이나 쉘의 데이터 필드에 포함된 고유한 문자입니다. 다른 캐릭터에 대한 정보를 제공합니다. 예를 들어, 문자 's'로 시작하는 모든 파일을 나열하려면 'ls s*' 명령을 사용하십시오.

10. 경로에서 모든 .txt 파일의 이름을 .log로 바꿉니다.

ls | cut -d. -f1 | xargs -i mv {}.txt {}.log

11. 쉘 스크립트에서 명령줄 인수를 읽는 방법은 무엇입니까?

Bash 쉘에는 쉘 스크립트를 통해 전달하는 인수를 가리키도록 예약된 특수 변수가 있습니다. Bash는 이러한 변수를 숫자로 저장합니다($1, $2, $3, … $n).

위치 매개변수인 특수 문자도 있지만 해당 기능은 명령줄 인수와 밀접하게 연결되어 있습니다.

특수 문자 $#는 총 인수 수를 저장합니다. 또한 모든 인수를 나타내는 데 사용되는 와일드카드 문자로 $@ 및 $* 가 있습니다 . $$를 사용하여 현재 쉘 스크립트의 프로세스 ID를 찾는 반면, $? 스크립트의 종료 코드를 인쇄하는 데 사용할 수 있습니다.

#!/bin/sh
echo "Script Name: $0"
echo "First Parameter of the script is $1"
echo "The second Parameter is $2"
echo "The complete list of arguments is $@"
echo "Total Number of Parameters: $#"
echo "The process ID is $$"
echo "Exit code for the script: $?"
./PositionalParameters.sh learning command line arguments

image

12. Linux에서 표준 스트림의 이름을 지정합니다.

Linux의 표준 스트림은 표준 입력, 표준 출력 및 표준 오류입니다.

13. $@와 $*를 구별하세요

$*는 전체 위치 인수 집합을 단일 문자열로 간주하는 반면, $@는 각 인용 인수를 별도의 인수로 처리합니다.

14. 조건문을 사용하여 파일 시스템에 파일이 존재하는지 확인하는 방법

if [ -f /var/log/messages ]
then
echo "File exists."
fi

15. echo 명령을 사용하여 문자열 변수의 일부를 가져옵니다.

echo ${variable:x:y} 여기서 X는 시작 위치이고 y는 문자열 길이입니다.

variable="Her name is Jen, and she is a developer."
echo ${variable:12:6}

#Output:
#Jen, a
#As J is at index 12 start from 0, and followed by 6 characters

16. [[ $string == “efg*” ]] 와 [[ $string == efg* ]] 사이의 차이점은 무엇입니까?

[[ $string == efg* ]] > 문자열이 efg로 시작하는지 확인합니다.

[[ $string == “efg*” ]] > 문자열이 efg인지 확인합니다.

17. SSH 인증

tail -n 10 /var/log/secure 
tail -n 10 /var/log/auth.log

home 또는 ~/.ssh 디렉토리에 그룹 쓰기 권한이 있는 경우 SSH는 이를 좋아하지 않습니다. 홈 디렉토리는 본인만 쓸 수 있어야 하며 ~/.ssh 는 700, Authorized_keys 는 600 이어야 합니다.

chmod 700 /home/user 
chmod 700 /home/user/.ssh
chmod 600 /home/user/.ssh/authorized_keys

[

SSH 인증 거부됨: 잘못된 소유권 또는 디렉터리 모드

수정 방법 알아보기: 공개 설정을 시도할 때 "SSH 인증 거부됨: 잘못된 소유권 또는 디렉토리 모드" 오류…

chemicloud.com

](https://chemicloud.com/kb/article/ssh-authentication-refused-bad-ownership-or-modes-for-directory/?source=post_page-----7e22928a1486--------------------------------)

18. 특수 쉘 변수는 무엇입니까**$?**

Bash의 특수 쉘 변수는 $?마지막 명령이나 가장 최근에 실행된 프로세스의 종료 상태를 가져오는 데 사용됩니다. 변수 를 사용하여 $?명령이 성공적으로 실행되었는지 여부를 확인하고 결과에 따라 적절한 조치를 취할 수 있습니다. 0이 아닌(1–255) 종료 상태는 실패를 나타냅니다.

#!/bin/bash

# Try to copy a file that does not exist
cp foo.txt bar.txt

# Check the exit status of the cp command
if [ $? -eq 0 ]; then
echo "Copy successful"
else
echo "Copy failed"
fi

# Output:
# cp: foo.txt: No such file or directory
# Copy failed

[## Bash에서 종료 상태 코드를 반환하는 방법

Bash에서 종료 코드(반환 코드 또는 상태 코드라고도 함)는 실행된 명령에 의해 반환되는 숫자 값입니다.

byby.dev](https://byby.dev/bash-exit-codes?source=post_page-----7e22928a1486--------------------------------

19. 무엇을 **grep -oP '\d+'**합니까?

grep -oP '\d+'텍스트의 숫자만 검색하여 출력하는 데 사용됩니다. \d+하나 이상의 숫자와 일치하는 정규식 패턴입니다. 플래그 -o는 일치하는 패턴만 인쇄되도록 보장하고 -P플래그는 Perl 호환 정규식을 활성화합니다.

echo "finnone-integration [Version=RevNo.201963]" | grep -oP '\d+'
# Output: 201963

20. 목록 방식으로만 파일 이름을 나열하는 방법.

ls -1다른 속성 없이 파일 이름만 표시됩니다.

ls -1a다른 속성 없이 모든 파일 이름만 표시됩니다.

나중에 사용할 수 있도록 출력을 변수에 저장합니다.filelist=`ls -1 /somedir/`

21. zip 파일에 디렉토리가 포함되어 있는지 확인하는 방법

unzip -l yourfile.zip | grep -q "/$"

image

설명:

  • 이 unzip -l명령은 zip 파일의 내용을 나열합니다.
  • 이 grep -q "/$"명령은 디렉터리를 나타내는 슬래시로 끝나는 줄을 검색합니다.
  • 이 -q옵션은 출력을 억제하는 데 사용되며 반환 코드에만 관심이 있습니다.

zip 파일에 디렉터리가 포함되어 있으면 명령은 반환 코드 0으로 종료됩니다. zip 파일에 디렉터리가 없으면 명령은 0이 아닌 반환 코드로 종료됩니다.

예:

if unzip -l yourfile.zip | grep -q "/$"; then
echo "The zip file contains a directory."
else
echo "The zip file does not contain a directory."
fi

22. 쉘 변수 주위에 중괄호가 필요한 경우는 언제입니까?

변수에서 읽으 려면 (즉, 변수를 확장하려면 ) 다음을 사용해야 합니다.$

$var      # use the variable
${var} # same as above
${var}bar # expand var, and append "bar" too
$varbar # same as ${varbar}, i.e expand a variable called varbar, if it exists.

중괄호는 다음과 같은 경우에도 무조건 필요합니다.

  • 다음과 같이 배열 요소를 확장합니다.${array\[42\]}
  • ${filename%.\*}(확장 제거) 와 같이 매개변수 확장 작업을 사용하여
  • 위치 매개변수를 9개 이상으로 확장:"$8 $9 $10 $11"

Linux에서 Network 명령어 마스터하기!

· 4 min read

image

Linux에서 네트워크 명령어는 시스템 관리, 네트워크 관리 및 DevOps 영역에서 필수적으로 알아야 합니다. DevOps 전문가, 네트워크 관리자, 시스템 관리자는 물론 초보자도 네트워크를 효과적으로 관리하고 문제를 해결할 수 있도록 지원하는 상위 10개 명령을 살펴봅시다.

1. ping

  • 기능: 네트워크 연결에 대한 테스트로 pingICMP 에코 요청을 지정된 호스트 이름 또는 IP 주소로 보냅니다.
  • 사용법
ping google.com  # Check reachability to Google
ping 192.168.1.10 # Test a specific IP address
  • 결과: 응답 시간(왕복 시간) 및 패킷 손실 통계는 네트워크 연결에 대한 체크에 도움이 됩니다.

2. nslookup

  • 기능: 도메인 이름 뒤에 숨은 ip를 알려줍니다. nslookupDNS 서버에 쿼리하여 호스트 이름(예: google.com)을 해당 IP 주소로 변환합니다.
  • 사용법
nslookup google.com  # Discover the IP address behind Google
  • 출력: 호스트 이름과 연결된 IP 주소가 표시되어 도메인 이름이 물리적 시스템에 매핑되는 방식을 이해하는 데 도움이 됩니다.

3. ifconfig(or ip addr)

  • 기능: 네트워크 인터페이스 세부 정보를 보려면 ifconfig(이전 시스템의 경우) 또는 ip addr(최신 시스템의 경우) 이동 명령을 사용하세요. IP 주소, MAC 주소, 인터페이스 상태 등 네트워크 인터페이스에 대한 정보를 표시합니다.
  • 사용법
ifconfig  # (older systems)
ip addr # (newer systems)
  • 출력: 네트워크 구성 및 문제 해결에 중요한 네트워크 인터페이스 목록 및 관련 세부 정보가 제공됩니다.

4. netstat

  • 기능: netstat 네트워크 활동에 대한 포괄적인 보기를 제공합니다. 활성 연결, 수신 포트 및 트래픽 통계를 표시하여 네트워크 활용도 및 잠재적인 문제에 대한 통찰력을 제공합니다.
  • 사용법
netstat -a  # View all network connections (TCP and UDP)
netstat -ltpn # List listening TCP ports with process IDs and names
  • 결과: 네트워크 연결에 대한 풍부한 정보를 통해 리소스 집약적인 프로세스를 식별하고 연결 문제를 진단할 수 있습니다.

5. traceroute(or tracert)

  • 기능: 네트워크 경로가 흐려지면 traceroute(또는 tracert일부 시스템에서는) 도움을 받습니다. 이는 패킷이 대상에 도달하는 데 걸리는 경로를 추적하여 관련된 네트워크 홉을 드러냅니다.
  • 사용법
traceroute google.com  # Trace the route to Google's servers
  • 출력: 경로를 따라 중간 홉 목록이 표시되어 시스템과 대상 대상 간의 잠재적인 병목 현상이나 연결 문제를 정확히 찾아내는 데 도움이 됩니다.

6. ip

  • 기능: 인터페이스 정보 외에도 ip 주소 할당, 경로 설정, 방화벽 규칙 조작 등 네트워크 구성 관리를 위한 강력한 명령 모음을 제공합니다.
  • 사용법
ip route add default via 192.168.1.1  # Add a default route
ip address add 10.0.0.1/24 dev eth0 # Assign an IP address to an interface
  • 출력: 사용된 특정 명령에 따라 다르지만 ip구성 변경에 대한 실시간 피드백을 제공합니다.

7. tcpdump(or wireshark)

  • 기능: 심층 패킷 검사 tcpdump(또는 그래픽 도구 Wireshark)를 사용하는 것이 좋습니다. 지정된 인터페이스에서 네트워크 트래픽을 캡처하여 개별 패킷을 검사하고 네트워크 프로토콜을 분석할 수 있습니다.
  • 사용법
tcpdump -i eth0  # Capture packets on interface eth0
  • 출력: 캡처된 패킷이 자세한 형식으로 표시되므로 네트워크 동작을 진단하고 보안 위협을 식별할 수 있습니다.

8. ssh

  • 기능: Secure Shell 또는 ssh은 원격 시스템 관리를 위한 도구입니다. 이를 통해 다른 Linux 시스템에 대한 보안 연결을 설정하고 로컬로 로그인한 것처럼 명령을 실행할 수 있습니다.
  • 사용법
ssh user@remote_server_ip  # Connect to a remote server as user
  • 출력: 직접 출력은 없지만 연결에 성공하면 서버 관리를 위한 원격 셸이 부여됩니다.

9. nmap(Network Mapper)

  • 기능: 포괄적인 네트워크 정찰 및 보안 감사를 위한 nmap최고의 기능입니다. 대상 시스템을 검사하여 다음을 식별합니다.
  • 개방형 포트: 이는 통신을 위한 잠재적인 진입점입니다.
  • 해당 포트에서 실행되는 서비스: 포트를 사용하고 있는 애플리케이션이나 프로토콜이 표시됩니다.
  • 운영 체제(OS) 및 장치 유형: nmap응답을 기반으로 대상 시스템의 OS를 식별할 수 있는 경우가 많습니다.
  • 사용법
# Basic scan to identify open ports on a target
nmap scanme.nmap.org
# Scan with additional options:
nmap -sS -T4 scanme.nmap.org # Use SYN scan with faster timing template
nmap -A scanme.nmap.org # Aggressive scan for detailed OS and service detection
  • 결과: 다음을 포함한 풍부한 정보를 제공합니다.
  • 열린 포트 및 관련 서비스 목록입니다.
  • OS 감지 세부정보(성공한 경우)
  • 특정 서비스 또는 프로토콜과 관련된 보안 취약성(고급 사용)

10. iptables/nftables (firewalls)

  • 기능: 네트워크 보안을 위해서는 iptables(레거시) 또는 nftables(최신)과 같은 Linux 방화벽이 필수적입니다. 사전 정의된 규칙에 따라 들어오고 나가는 네트워크 트래픽을 제어하여 무단 액세스로부터 시스템을 보호합니다.
  • 사용법 (iptables example):
iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # Allow incoming SSH connections
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT # Allow outgoing traffic to port 80 (HTTP)
  • 출력: 사용된 특정 명령에 따라 다르지만 방화벽은 규칙 생성 및 상태에 대한 피드백을 제공합니다.

+ curl

  • 기능: 네트워크 진단을 넘어 curl HTTP(S)를 통해 데이터를 전송하는 다목적 도구입니다. 이를 통해 파일을 다운로드하고, 웹 API와 상호 작용하고, 명령줄에서 기본 웹 요청을 수행할 수 있습니다.
  • 사용법
curl https://google.com  # Download the Google homepage
curl -o index.html https://website.com/index.html # Download a specific file
  • 출력: 요청이 실패하면 다운로드한 콘텐츠 또는 오류 메시지를 표시합니다.

위의 상위 10가지 명령을 숙지하면 Linux 네트워킹의 문제를 효과적으로 해결해 자신 있게 네트워크를 관리할 수 있는 준비를 갖추게 됩니다. 전문 지식이 성장함에 따라 더욱 발전된 도구를 탐색하고 네트워크 보안 및 최적화 기술을 더욱 깊이 탐구하며 즐거운 네트워킹을 즐겨보세요!

윈도우, 리눅스 서버 접속(ssh, rdp) 보안

· 6 min read
Alex Han
Software Engineer

image

IT쪽 일을 하다 보니 랜섬웨어 감염이라는 끔찍한 일을 겪게 됐고 앞으로 이런 일이 발생하지 않도록 대응책을 찾게 됐다.

물론 애초에 클라우드 아키텍쳐를 보안이 좋도록 서버와 코드 구성 등 많은 부분을 고칠 수 있지만 현재 회사에서는 그런 시도를 자유롭게 할 수 없는 환경이기에 다른 방법들을 찾기 시작했다.

이 포스트에서는 윈도우 서버와 리눅스 서버의 접속 관련 보안 방법인 IP 접속 제한, 계정 접속 시도 횟수 설정, 방화벽 설정 등에 대해 알아본다.

image

우선 클라우드를 이용하고 있다면 클라우드의 우리 서버까지 도달하기까지 클라우드에서 운영중인 방화벽이 따로 존재한다.

이 방화벽은 경비원과 같은 역활을 한다. 우리 서버가 통신 시 항상 거치는 곳이기 때문에 통신을 제한할 수 있다.

서버로부터 나가는 통신, 서버로 들어오는 통신 등을 설정해 보안을 강화할 수 있다.(여기서 ip 통제) 

그리고 보통 이 방화벽을 클라우드 관제센터에서 모니터링하기 때문에 문제 발생도 잡아주기 때문에 좋다.(하지만 모든 클라우드에서 지원해주지는 않음)

image

우선 고성능의 윈도우 서버에 RDP 구성 시 OS 레벨에서의 접속 보안 방법에 대해 먼저 생각해 보자!

윈도우의 기본 RDP 접속 포트는 3389포트다. 그래서 해킹시도 시 가장 먼저 열려있는 포트를 확인하기 위해 시도해 보게 된다.

그렇기 때문에 남들이 알아차리기 힘든 RDP 접속 포트로 원격 데스크톱의 수신 대기 포트를 변경해 이런 시도를 무산시킬 수 있다.

레지스트리를 변경하여 수행할 수 있는데 아래와 같은 순서로 실행하면 된다.

  1. 레지스트리 편집기를 시작합니다. (검색 상자에 regedit을 입력합니다.)
  2. 다음 레지스트리 하위 키로 이동합니다. HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
  3. PortNumber를 찾습니다.
  4. 편집 > 수정을 클릭하고 Decimal을 클릭합니다.
  5. 새 포트 번호를 입력하고 확인을 클릭합니다.
  6. 레지스트리 편집기를 닫고 컴퓨터를 다시 시작합니다.
  7. 방화벽을 사용하는 경우 새 포트 번호로의 연결을 허용하도록 방화벽을 구성해야 합니다.
Get-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp' -name "PortNumber"

예를 들어:다음 PowerShell 명령을 실행하여 RDP 포트를 확인할 수도 있습니다. 이 명령에서는 새 RDP 포트를 3390으로 지정합니다.

$portvalue = 3390

Set-ItemProperty -Path 'HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp' -name "PortNumber" -Value $portvalue

New-NetFirewallRule -DisplayName 'RDPPORTLatest-TCP-In' -Profile 'Public' -Direction Inbound -Action Allow -Protocol TCP -LocalPort $portvalue
New-NetFirewallRule -DisplayName 'RDPPORTLatest-UDP-In' -Profile 'Public' -Direction Inbound -Action Allow -Protocol UDP -LocalPort $portvalue

image

두번째 보안 방법으로 방화벽을 활용해 IP를 통제하는 방법이다. 그 방법은 아래와 같다.

  1. 서버 연결
  2. 방화벽 설정인바운드 규칙 클릭 → 오른쪽에서원격 데스크톱 – 사용자 모드 (TCP-In) 규칙을 찾는다.
  3. 찾은 규칙에서 마우스 오른쪽 클릭해속성 클릭,****범위탭으로 가서 서버에 액세스하려는 IP 주소와 범위를 추가

image image

세번째로 원격 엑세스에 사용하는 계정에 대해 접속 시도 실패 시에 잠금을 설정하는 방법이 있다.

만약 이 설정이 되어 있지 않다면 해커들은 수 많은 경우의 수를 모두 시도해 봐도 계정을 계속 사용할 수 있기 때문에 시간만 주어진다면 언젠가는 접속할 수 있게 된다.(패스워드 복잡도에 따라 그 시간이 큰 차이가 생김)

아무튼 원격 액세스 클라이언트 계정 잠금을 활성화하고 시간을 다시 설정하려면 다음 단계를 수행합니다.

  1. 시작 → 열기 →*regedit*한 다음 Enter
  2. 레지스트리 키 선택
  3. HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Parameters\\AccountLockout
  4. MaxDenials를 더블 클릭
  5. 기본값은 0이고 0일 경우 계정 잠금이 해제됨을 의미. 계정을 잠글 때 로그인 시도 실패에 대한 횟수를 설정하고 확인
  6. ResetTime(분) 값을 두 번 클릭합니다.
  7. 기본값은 2,880분(2일) 동안 16진수인 0xb40 . 네트워크 보안 요구 사항을 충족하도록 수정 후 확인
  8. 레지스트리 편집기 종료

만약 계정이 잠긴 경우 위에서 설정한 ResetTime에 따라 사용자가 다시 로그온 가능하지만 바로 원할 경우 레지스트리 키에서 DomainName:UserName 값을 삭제할 수 있는 방법은 아래와 같다.

  1. **시작 → 열기 →**regedit한 다음 Enter
  2. 레지스트리 키 선택
  3. HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\RemoteAccess\\Parameters\\AccountLockout
  4. 도메인 이름:사용자 이름 값을 찾은 다음 항목을 삭제
  5. 레지스트리 편집기 종료
  6. 계정을 테스트 해 더 이상 잠기지 않는지 확인

---------------------------------------------WINDOW END---------------------------------------------------

image

여기서부터 리눅스 접속 관련 보안에 대해 생각해 보자!

리눅스 접속 중 SSH에 대해 알아볼 예정인데 SSH 서버 관련 설정은 기본으로 되어 있는 곳이 많다.

카페24, 가비아, AWS, Azure, GCP 등은 모두 SSH 서비스를 기본으로 제공하고 최신판 리눅스들은 대부분 SSH 서버를 기본 탑재하고 있다.

rpm -qa | grep openssh-server 를 터미널에 입력해 설치되어 있는지 체크해 볼 수도 있고, 만약 설치되어 있지 않다면 yum install openssh-server (CentOS, RedHat Enterprise), apt install openssh-server (Ubuntu, Debian) 으로 설치한 뒤 which sshd 를 통해 설치 경로를 확인해 볼 수도 있다. 그런 뒤 방화벽 설정 프로그램에서 tcp 22 포트를 허용해 주면 된다.(root 권한 필요)

그 방법은 아래와 같다.

  1. iptables의 경우 - iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  2. firewalld의 경우(CentOS 7이상) - firewall-cmd --zone=public --add-port=22/tcp —permanent
  3. ufw의 경우(ubuntu) - ufw allow 22/tcp

ssh 설정은 보통  /etc/sshd/sshd_config 여기서 설정할 수 있고 여기서 아래와 같은 설정도 할 수 있다.

  1. SSH 포트 변경
  2. 접속 허용 클라이언트 및 패스워드 입력 시도 횟수 제한 설정
  3. 패스워드, 공개 키 사용자 인증 설정
  4. 접속 로그, 배너 메시지

설정이 끝나면 service sshd start 또는 systemctl start sshd 를 통해 실행해 주면 된다.

image

SSH 보안 관련 설정은 /etc/sshd/sshd_config 에서 하게 된다.

우선 리눅스 서버에서 root 권한은 윈도우에서의 관리자 권한처럼 위험하다.

그래서 애초에 root 로 접속하는 것을 막는 것이 보안상 권장된다.

다른 계정으로 접속해 root 권한을 얻어 사용하는 것이 좀 더 바람직하다.

이 때 사용하는 파라미터가 PermitRootLogin 인데 아래와 같은 옵션이 있다.

  1. PermitRootLogin yes - root 로그인 허용
  2. PermitRootLogin no - root 로그인 차단
  3. PermitRootLogin without-password(최신 openssh에서 prohibit-password로 변경됨) - password가 아닌 공개 키 인증으로만 접속

말했던 것처럼 2번을 사용하면 된다.

그 외에도 윈도우에서 했던 것처럼 접속 시도 실패 횟수를 카운트 해 막아주는 방법은 MaxAuthTries 파라미터를 활용하면 되는데,

MaxAuthTries 6 - 계정 당 최대 연결 시도 횟수로 6인 경우 6번을 뜻하고 6번부터 계정이 막히는 것을 알 수 있다.

그 외에도 LoginGraceTime 2m - 사용자 인증 요청받을 수 있는 최대 시간 설정(2m은 2분)과 MasSessions 10 - SSH 연결 허용할 최대 클라이언트 수 등 여러 파라미터들이 존재하고 보안에 유리하게 조율하면 된다.