1. 시스템 설치 직후 초기 설정을 그대로 쓰지 않는 이유

시스템 설치 직후 초기 설정을 그대로 사용하지 않는 예로는 다음과 같은 경우가 있습니다:

디폴트 관리자 계정 변경: 디폴트 관리자 계정을 그대로 두면 해킹의 위험이 높아질 수 있습니다. 공격자가 일반적인 사용자 이름을 알고 있으면 쉽게 접근할 수 있기 때문에, 강력한 고유 사용자 이름으로 변경하는 것이 좋습니다.

비밀번호 변경: 초기 비밀번호는 쉽게 추측할 수 있으므로, 강력한 비밀번호로 변경해야 합니다. 이는 보안을 강화하기 위한 기본적인 조치입니다.

디폴트 포트 변경: 예를 들어, 웹 서버의 디폴트 포트인 80을 다른 포트로 변경하는 것은 공격자가 일반적으로 사용하는 포트를 스캔하는 것을 방지하기 위한 방법입니다.

서비스 비활성화: 기본적으로 활성화된 서비스 중 불필요한 것들은 비활성화하여 공격의 표면적을 줄이는 것이 좋습니다. 예를 들어, FTP 서비스가 필요 없다면 이를 비활성화하는 것이 안전합니다.

방화벽 설정: 기본 방화벽 설정을 그대로 두기보다는, 필요한 포트만 열고 나머지는 차단하여 보안을 강화할 수 있습니다.

이러한 초기 설정 변경은 보안을 강화하고 시스템을 더욱 안전하게 만드는 데 중요한 역할을 합니다.

 

2.  iptables

iptables는 리눅스에서 방화벽을 설정하고 관리하는 데 사용되는 명령어입니다. 주로 다음과 같은 용도로 사용됩니다:
패킷 필터링: 네트워크 트래픽을 검사하고, 특정 조건에 맞는 패킷을 허용하거나 차단할 수 있습니다.

NAT(Network Address Translation): 내부 네트워크의 IP 주소를 외부에서 접근할 수 있는 주소로 변환하여 인터넷과 연결할 수 있게 합니다.

포트 포워딩: 특정 포트로 들어오는 트래픽을 다른 포트나 IP 주소로 전달할 수 있습니다.
로그 기록: 특정 패킷이나 트래픽을 기록하여 보안 분석이나 문제 해결에 활용할 수 있습니다.
상태 기반 필터링: 연결의 상태를 기반으로 패킷을 허용하거나 차단하여, 더 정교한 보안 정책을 적용할 수 있습니다.
사용자 정의 체인 및 규칙: 기본 체인 외에 사용자 정의 체인을 만들어 특정 요구 사항에 맞게 규칙을 설정할 수 있습니다.

 

또한, RHEL 5부터는 iptables 외에도 firewalld라는 새로운 방화벽 관리 도구가 도입되었습니다. firewalld는 동적인 방화벽 관리를 지원하고, 더 직관적인 명령어와 GUI를 제공하여 사용이 편리합니다. 하지만 iptables는 여전히 RHEL에서 사용할 수 있으며, 많은 사용자들이 기존의 스크립트나 설정을 유지하기 위해 iptables를 계속 사용하고 있습니다. 따라서 RHEL 7 이상에서도 iptables는 여전히 존재하지만, 기본적으로는 firewalld가 권장됩니다.

결론적으로, RHEL 5 이후에도 iptables는 사용 가능하지만, 새로운 시스템에서는 firewalld가 더 많이 사용되고 있습니다.

 

3.  iptables 명령어 예시

- 기본 정책 설정:
모든 트래픽을 기본적으로 차단하고, 특정 트래픽만 허용하는 경우:
bash
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT


- SSH(포트 22) 허용:
SSH 접속을 허용하려면 다음과 같이 설정합니다:
bash
iptables -A INPUT -p tcp --dport 22 -j ACCEPT


- HTTP(포트 80) 및 HTTPS(포트 443) 허용:
웹 서버에 대한 트래픽을 허용하려면:
bash
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT


- 특정 IP 주소에서의 접근 허용:
특정 IP(예: 192.168.1.100)에서의 접근을 허용하려면:
bash
iptables -A INPUT -s 192.168.1.100 -j ACCEPT


- ICMP(핑) 허용:
ICMP 패킷을 허용하여 핑 요청을 받을 수 있게 하려면:
bash
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT


- 규칙 목록 확인:
현재 설정된 규칙을 확인하려면:
bash
iptables -L -n -v


- 규칙 삭제:
특정 규칙을 삭제하려면, 해당 규칙의 번호를 확인한 후 다음과 같이 삭제합니다:
bash
iptables -D INPUT 1


- 규칙 저장:
설정한 규칙을 저장하여 재부팅 후에도 유지하려면:
bash
service iptables save

 

4.  RHEL7에서 firewalld가 iptables를 대체한 이유

- 동적 관리: firewalld는 방화벽 규칙을 실시간으로 변경할 수 있어, 서비스 중단 없이 설정을 업데이트할 수 있습니다. 반면에 iptables는 규칙을 변경할 때 전체 방화벽을 재시작해야 했습니다.

- 영역 기반 설정: firewalld는 네트워크 영역(zone) 개념을 도입하여, 각 영역에 대해 서로 다른 규칙을 쉽게 적용할 수 있습니다. 이를 통해 더 유연하고 직관적인 관리가 가능합니다.
- 간편한 명령어: firewalld는 명령어와 설정 파일이 직관적이어서 사용자가 이해하고 관리하기가 더 쉽습니다. GUI 도구도 제공하여 비전문가도 쉽게 사용할 수 있습니다.
- 서비스 기반 규칙: firewalld는 서비스 단위로 규칙을 설정할 수 있어, 포트 번호를 직접 지정하지 않고도 간편하게 설정할 수 있습니다.
- 상태 기반 필터링: firewalld는 상태 기반 필터링을 기본적으로 지원하여, 연결 상태에 따라 패킷을 자동으로 관리합니다.

5.  보안 감사 도구

보안 감사 도구는 시스템, 네트워크, 애플리케이션의 보안을 평가하고 취약점을 식별하는 데 사용됩니다. 다음은 다양한 보안 감사 도구의 종류입니다.

1. 취약점 스캐너
Nessus: 네트워크 취약점 스캐닝 도구로, 다양한 취약점을 탐지합니다.
OpenVAS: 오픈 소스 취약점 스캐너로, 다양한 보안 검사 기능을 제공합니다.


2. 침투 테스트 도구
Metasploit: 침투 테스트 및 취약점 개발 프레임워크로, 공격 시나리오를 테스트하는 데 사용됩니다.
Burp Suite: 웹 애플리케이션 보안 테스트 도구로, 다양한 공격 기법을 지원합니다.


3. 로그 분석 도구
Splunk: 로그 데이터를 수집하고 분석하여 보안 이벤트를 모니터링합니다.
ELK Stack (Elasticsearch, Logstash, Kibana): 로그 수집, 저장, 분석 및 시각화를 위한 오픈 소스 도구입니다.


4. 네트워크 분석 도구
Wireshark: 네트워크 패킷을 캡처하고 분석하여 보안 문제를 식별하는 도구입니다.
Nmap: 네트워크 탐색 및 보안 감사 도구로, 호스트 및 서비스 정보를 수집합니다.


5. 파일 무결성 검사 도구
Tripwire: 파일 시스템의 무결성을 모니터링하고 변경 사항을 기록합니다.
AIDE (Advanced Intrusion Detection Environment): 파일 무결성 검사 및 침입 탐지 시스템입니다.


6. 악성 코드 분석 도구
Cuckoo Sandbox: 악성 소프트웨어 분석을 위한 자동화된 샌드박스 환경입니다.
VirusTotal: 파일이나 URL을 여러 안티바이러스 엔진으로 검사할 수 있는 서비스입니다.


7. 보안 정보 및 이벤트 관리(SIEM) 도구
IBM QRadar: 보안 이벤트 및 로그 데이터를 분석하여 위협을 탐지합니다.
ArcSight: 실시간 보안 모니터링 및 분석을 제공하는 SIEM 솔루션입니다.
이러한 도구들은 보안 감사 과정에서 중요한 역할을 하며, 각 도구의 특성에 따라 적절하게 활용해야 합니다.

 

6.  SELinux는 무엇이고, 장점과 단점은 어떤 것이 있는가?

SELinux의 policy를 생성해 보았는가? SELinux의 Policy를 관리하는 방법은 무엇인가?

enforce와 permissive의 차이는?

 

SELinux란?
SELinux(Security-Enhanced Linux)는 리눅스 커널에 적용된 보안 모듈로, 시스템의 보안을 강화하기 위해 강력한 접근 제어 모델을 제공합니다. SELinux는 프로세스와 파일 간의 상호작용을 제어하고, 최소 권한 원칙을 통해 시스템을 보호합니다.

장점
강력한 보안: 프로세스와 자원의 접근을 엄격히 제한하여 보안 침해를 방지합니다.
정책 기반 관리: 세밀한 보안 정책을 정의하고 적용할 수 있어, 특정 상황에 맞는 보안을 설정할 수 있습니다.
침입 탐지: 비정상적인 접근 시도를 기록하고 경고를 발생시켜 침입 탐지 기능을 제공합니다.


단점
복잡성: 설정 및 관리가 복잡하고, 정책 작성이 어려울 수 있어 학습 곡선이 존재합니다.
호환성 문제: 일부 애플리케이션이 SELinux 정책에 의해 차단될 수 있어, 기존 시스템과의 호환성 문제가 발생할 수 있습니다.
디버깅 어려움: SELinux로 인해 발생하는 문제를 디버깅하는 것이 복잡할 수 있습니다.


SELinux 정책 생성
SELinux 정책을 생성하려면 policycoreutils, selinux-policy-devel 패키지가 필요합니다. 정책 파일을 작성하고, checkmodule, semodule_package, semodule 명령어를 사용하여 모듈을 컴파일하고 로드할 수 있습니다.

SELinux 정책 관리 방법
정책 확인: sestatus 명령어로 현재 SELinux 상태 및 정책을 확인합니다.
정책 수정: 정책 파일을 수정 후, semodule 명령어를 통해 적용합니다.
정책 생성: audit2allow 도구를 사용하여 감사 로그를 기반으로 새로운 정책을 생성할 수 있습니다.


Enforce와 Permissive의 차이
Enforcing 모드: SELinux가 정책을 강제로 적용하며, 정책 위반 시 접근이 거부됩니다.
Permissive 모드: SELinux가 정책을 적용하지 않지만, 위반되는 모든 동작을 로그로 기록합니다. 이 모드에서 정책을 테스트할 수 있습니다.

SELinux 는 enforce, permissive, disable 3 가지 모드가 있으며 기본 설정은 enforce mode이고 보안 정책에 위배되는 모든 액션이 차단됩니다.


7.  컨테이너의 경우는 어떤 방법으로 보안과 관련된 검사를 할 수 있는가?

1. 취약점 스캐닝
도구 사용: Clair, Trivy, Anchore와 같은 도구를 사용하여 컨테이너 이미지에서 알려진 취약점을 스캔합니다.
주기적 검사: 컨테이너 이미지를 배포하기 전에 스캔하고, 주기적으로 최신 상태를 유지합니다.


2. 시큐리티 베스트 프랙티스 준수
최소 권한 원칙: 컨테이너에서 필요한 최소한의 권한만 부여합니다.
불필요한 패키지 제거: 이미지에서 불필요한 패키지와 서비스를 제거하여 공격 표면을 줄입니다.


3. 컨테이너 런타임 보안
도구 사용: Falco, Sysdig와 같은 런타임 보안 도구를 사용하여 컨테이너 실행 중 비정상적인 활동을 모니터링합니다.
정상 동작 정의: 정상적인 동작을 정의하고 이를 벗어난 행동에 대해 경고를 설정합니다.


4. 네트워크 보안
네트워크 정책 설정: Kubernetes와 같은 오케스트레이션 도구에서 네트워크 정책을 설정하여 컨테이너 간의 통신을 제어합니다.
전송 암호화: 컨테이너 간 데이터 전송 시 암호화하여 데이터 유출을 방지합니다.


5. 로그 및 모니터링
로그 수집: 컨테이너의 로그를 중앙 집중식으로 수집하고 분석하여 이상 징후를 탐지합니다.
모니터링 도구: Prometheus, Grafana 등을 사용하여 성능 및 보안 관련 메트릭을 모니터링합니다.


6. 정책 관리
Opa (Open Policy Agent): 정책 기반 접근 제어를 통해 컨테이너의 보안을 관리합니다.
PodSecurityPolicy: Kubernetes에서 Pod의 보안 설정을 관리하는 도구입니다.


7. 컨테이너 이미지 서명
이미지 서명: Docker Content Trust를 사용하여 이미지가 신뢰할 수 있는 출처에서 왔는지 확인합니다.
서명 검증: 배포 전에 이미지 서명을 검증하여 무결성을 보장합니다.
이러한 방법들을 통해 컨테이너의 보안을 강화하고, 잠재적인 위협을 사전에 차단할 수 있습니다.

 

8.  Vulnerability의 정의가 무엇인가? CVE / NVD / NIST가 무엇인가? 어떻게 확인할 수 있는가?

Vulnerability의 정의
**Vulnerability(취약점)**는 시스템, 애플리케이션, 네트워크 등에서 악용될 수 있는 약점을 의미합니다. 공격자는 이러한 취약점을 이용하여 비인가 접근, 데이터 유출, 서비스 거부 공격 등의 악의적인 행위를 수행할 수 있습니다.

CVE, NVD, NIST의 정의
CVE (Common Vulnerabilities and Exposures)

CVE는 공개적으로 알려진 취약점의 리스트입니다. 각 취약점에 대해 고유한 식별자(CVE ID)를 부여하여, 다양한 보안 도구와 데이터베이스에서 일관되게 참조할 수 있도록 합니다.
NVD (National Vulnerability Database)

NVD는 미국 정부가 운영하는 취약점 데이터베이스로, CVE 목록을 기반으로 하여 더 상세한 정보를 제공합니다. 각 취약점에 대한 메타데이터, 심각도 평가(CVSS 점수), 패치 정보 등을 포함하고 있습니다.
NIST (National Institute of Standards and Technology)

NIST는 미국 국립표준기술연구소로, 정보 보안 및 취약점 관리와 관련된 표준과 가이드라인을 제공합니다. NVD는 NIST의 일부로 운영되며, 보안 취약점에 대한 정책과 지침을 개발합니다.
확인 방법
CVE 확인

CVE 목록은 CVE 공식 웹사이트에서 검색할 수 있습니다. 특정 취약점에 대한 정보를 CVE ID로 검색하여 확인할 수 있습니다.
NVD 확인

NVD는 NVD 웹사이트에서 제공하며, CVE ID로 검색하거나 다양한 필터를 사용하여 취약점을 찾을 수 있습니다. CVSS 점수와 같은 추가 정보를 제공받을 수 있습니다.
NIST 확인

NIST의 정보는 NIST 웹사이트에서 확인할 수 있으며, 보안 관련 가이드라인과 표준을 검색할 수 있습니다. 특히, NVD와 함께 사용하여 취약점 관리에 대한 통찰을 얻을 수 있습니다.
이러한 리소스를 활용하여 시스템과 애플리케이션의 취약점을 주기적으로 확인하고 대응할 수 있습니다.

 

9.  SSL 인증서의 종류는 어떤 것이 있는가? 인증서 체인 메커니즘?

SSL 인증서의 종류
도메인 인증서 (Domain Validated Certificate, DV)

도메인 소유자임을 확인하는 최소한의 검증을 요구합니다. 빠르게 발급되며, 기본적인 보안 제공.
기업 인증서 (Organization Validated Certificate, OV)

도메인 소유자뿐만 아니라 기업의 실체도 검증합니다. 인증서에 기업 정보가 포함되어 신뢰성을 높입니다.
확장 인증서 (Extended Validation Certificate, EV)

가장 높은 수준의 검증을 요구하며, 기업의 신원과 법적 실체를 철저히 검증합니다. 브라우저 주소창에 회사 이름이 표시되어 사용자에게 신뢰를 제공합니다.
Wildcard 인증서

주 도메인과 그 하위 도메인에 대해 SSL 보안을 제공하는 인증서입니다. 예를 들어, *.example.com을 사용하면 http://www.example.com, mail.example.com 등 모든 하위 도메인에 적용됩니다.
다중 도메인 인증서 (Multi-Domain Certificate)

여러 개의 도메인에 대해 SSL 보안을 제공할 수 있는 인증서입니다. 예를 들어, example.com, example.net, example.org 등을 하나의 인증서로 보호할 수 있습니다.
인증서 체인 메커니즘
SSL 인증서 체인은 인증서의 신뢰성을 보장하는 메커니즘입니다. 다음과 같은 구조로 이루어져 있습니다:

루트 인증서 (Root Certificate)

신뢰할 수 있는 인증기관(CA)에서 발급된 인증서로, 브라우저나 운영체제에 내장되어 있습니다. 루트 인증서는 직접적으로 사용되지 않고, 다른 인증서를 신뢰하는 기반이 됩니다.
중간 인증서 (Intermediate Certificate)

루트 인증서와 최종 사용자 인증서 간의 연결 역할을 하는 인증서입니다. 중간 인증서를 통해 루트 인증서의 보안을 강화하고, 인증서 발급의 유연성을 높입니다.
최종 사용자 인증서 (End-Entity Certificate)

실제 도메인에 발급된 SSL 인증서로, 웹사이트와 사용자 간의 보안 연결을 제공합니다.
인증서 체인은 브라우저가 웹사이트와 연결할 때 인증서의 신뢰성을 검증하는 데 사용됩니다. 브라우저는 최종 사용자 인증서에서 시작하여 중간 인증서, 루트 인증서로 올라가며, 각 단계에서 인증서의 유효성을 체크합니다.

왜 쓰는가?


데이터 암호화

SSL 인증서는 클라이언트와 서버 간의 데이터 전송을 암호화하여 도청 및 데이터 변조를 방지합니다.
신뢰성

인증서를 통해 웹사이트의 신원을 확인할 수 있어 사용자에게 신뢰를 제공합니다. 특히 EV 인증서는 기업의 신뢰성을 더욱 높여줍니다.
SEO 혜택

구글 등 검색 엔진은 HTTPS를 사용하는 웹사이트에 대해 더 높은 순위를 부여하므로, SEO에 긍정적인 영향을 미칩니다.
법적 요구사항

특정 산업에서는 SSL 인증서 사용이 법적으로 요구되기도 하며, 데이터 보호 및 규정 준수를 위해 필수적입니다.
이러한 이유로 SSL 인증서는 웹사이트의 보안과 신뢰성을 확보하는 데 중요한 역할을 합니다.

 

10.  브라우저에서 인증서 체인 메커니즘 예시

SSL 인증서 체인 메커니즘의 실제 예시를 통해 이해를 돕겠습니다.

예시: 웹사이트의 SSL 인증서 체인
루트 인증서

예를 들어, Let's Encrypt 또는 DigiCert와 같은 공인 인증기관(CA)에서 발급한 루트 인증서가 있습니다. 이 루트 인증서는 브라우저에 사전 설치되어 있어, 사용자가 직접적으로 인식하지 못합니다.
중간 인증서

루트 인증서 아래에 Intermediate CA가 존재합니다. 예를 들어, Let's Encrypt의 경우 ISRG Root X1이라는 루트 인증서가 있고, 그 아래에 여러 중간 인증서가 있을 수 있습니다. 이 중간 인증서는 루트 인증서의 신뢰성을 이어받아 최종 사용자 인증서를 발급합니다.
최종 사용자 인증서

특정 도메인, 예를 들어 http://www.example.com에 대해 발급된 SSL 인증서입니다. 이 인증서는 중간 인증서의 서명을 받아 유효성을 갖추게 됩니다.
인증서 체인 구성
브라우저가 웹사이트에 접속할 때의 과정:
사용자가 https://www.example.com에 접속하면, 서버는 최종 사용자 인증서를 브라우저에 전송합니다.
브라우저는 이 인증서를 검증하기 위해 다음 단계를 진행합니다:
최종 사용자 인증서의 서명을 확인하기 위해 중간 인증서를 요청합니다.
중간 인증서의 서명을 확인하기 위해 루트 인증서를 참조합니다.
브라우저가 루트 인증서를 신뢰할 수 있다면, 인증서 체인이 완성되어 안전한 연결이 설정됩니다.


요약
이 과정에서 루트 인증서, 중간 인증서, 최종 사용자 인증서가 서로 연결되어 인증서 체인을 형성하며, 이를 통해 웹사이트의 신뢰성을 보장하고 데이터 전송을 안전하게 암호화합니다. 사용자는 이러한 과정을 통해 안전하게 웹사이트에 접속할 수 있습니다.

 

11.  JKS, PEM, CRT?

1. JKS (Java KeyStore)
형식: 바이너리 형식
용도: 주로 Java 애플리케이션에서 인증서와 개인 키를 저장하는 데 사용됩니다.
특징:
Java에서만 사용 가능하며, Java의 보안 API와 호환됩니다.
여러 인증서와 키를 하나의 파일에 저장할 수 있습니다.


2. PEM (Privacy-Enhanced Mail)
형식: 텍스트 형식 (Base64 인코딩)
용도: 인증서, 개인 키, CA 인증서 등을 저장하는 데 사용됩니다.
특징:
파일 확장자로는 주로 .pem, .crt, .key 등이 사용됩니다.
다양한 시스템에서 널리 사용되며, 쉽게 읽고 수정할 수 있습니다.


3. CRT (Certificate)
형식: 주로 PEM 형식과 동일하지만, 특정 인증서를 나타냅니다.
용도: SSL/TLS 인증서를 저장하는 데 사용됩니다.
특징:
파일 확장자로 .crt가 사용되며, 일반적으로 CA에 의해 서명된 인증서를 포함합니다.
PEM 형식으로 저장될 수 있지만, 특정 인증서 파일을 나타내는 데 사용됩니다.


요약
JKS: Java 전용 키 저장소, 바이너리 형식.
PEM: 텍스트 형식, 인증서 및 키를 저장하는 범용 형식.
CRT: 인증서를 저장하는 파일, 주로 PEM 형식으로 저장됨.

 

12.  지금 사용 중인 배포판에 설치된 모든 패키지의 Vulnerability의 Severity를 어떻게 확인할 것인가? 전체를 업데이트할 것인가? 특정 패키지만 업데이트하는 것이 좋다고 판단하는가?

리눅스 배포판에서 설치된 모든 패키지의 취약점(Severity)을 확인하고 관리하는 방법은 다음과 같습니다.

1. 패키지 취약점 확인 방법
패키지 관리 도구: 각 배포판에 따라 패키지 관리 도구를 사용하여 설치된 패키지의 취약점을 확인할 수 있습니다.

Debian/Ubuntu: apt-get과 apt list --upgradable 명령어를 사용하거나 apt update 후 apt upgrade.
RHEL/CentOS: yum 또는 dnf를 사용하여 yum updateinfo 명령어로 취약점 정보를 확인.
Arch Linux: pacman -Q로 패키지 리스트를 확인하고, pacman -Syu로 업데이트.
취약점 데이터베이스:

CVE (Common Vulnerabilities and Exposures) 데이터베이스를 참조하여 각 패키지에 대한 취약점 정보를 확인.
OSSEC나 OpenVAS 같은 보안 도구를 사용하여 시스템 전체의 취약점을 스캔.
2. 전체 업데이트 vs 특정 패키지 업데이트
전체 업데이트:

장점: 모든 패키지가 최신 상태로 유지되어 보안 취약점이 즉시 해결됩니다.
단점: 새로운 버전으로 인한 호환성 문제나 의도하지 않은 버그가 발생할 수 있습니다.
특정 패키지 업데이트:

장점: 문제를 일으킬 가능성을 줄이고, 안정성을 유지할 수 있습니다. 특정 취약점만 해결할 수 있습니다.
단점: 패키지 간의 의존성 문제가 발생할 수 있으며, 장기적으로는 전체 시스템의 보안이 약해질 수 있습니다.


3. 특정 OS 버전 고집 이유
호환성 문제: 특정 애플리케이션이나 시스템이 특정 버전에서만 안정적으로 작동할 수 있습니다.
장기 지원: RHEL과 같은 배포판은 장기 지원(LTS) 버전을 제공하여, 안정성과 보안 패치가 보장됩니다.
테스트와 검증: 새로운 버전이 출시되면, 조직 내에서 충분한 테스트와 검증이 필요합니다. 이를 위해 특정 버전을 유지할 수 있습니다.
비용 문제: 새로운 버전으로의 전환에는 추가적인 비용이 발생할 수 있습니다.


이러한 이유로 많은 기업이나 기관에서는 안정성과 호환성을 고려하여 특정 버전을 고수하는 경우가 많습니다.

 

13. 망분리를 해야 한다고 할때 어떤 방법으로 구현할 수 있을까?

가. 물리적 분리
독립된 네트워크: 서로 다른 네트워크를 물리적으로 분리하여, 각 네트워크에 연결된 장비들이 서로 통신할 수 없도록 합니다.
전용 장비 사용: 각 네트워크에 대해 전용 라우터와 스위치를 사용하여 보안을 강화합니다.


나. 논리적 분리
VLAN (가상 LAN): 네트워크 장비에서 VLAN을 설정하여 같은 물리적 네트워크 내에서 서로 다른 논리적 네트워크를 구성합니다.
방화벽 설정: 방화벽을 통해 서로 다른 네트워크 간의 트래픽을 제한하여 접근을 통제합니다.


다. 보안 솔루션 적용
IDS/IPS 시스템: 침입 탐지 시스템(IDS) 또는 침입 방지 시스템(IPS)을 도입하여 비정상적인 트래픽을 감지하고 차단합니다.
VPN (가상 사설망): 안전한 통신을 위해 VPN을 사용하여 네트워크 간의 안전한 연결을 유지합니다.


라. 접근 통제
정책 기반 접근 제어: 각 네트워크에 접근할 수 있는 사용자 및 장비를 정책적으로 관리하여 불필요한 접근을 차단합니다.
다중 인증: 사용자 인증을 강화하기 위해 다중 인증(MFA)을 적용하여 보안을 강화합니다.

 

14.  개발자가 특정 개발 도구(특정 버전 이상 등)을 사용해야 한다고 할 때 해당 배포판이 이를 지원하지 않으면 직접 컴파일해 쓰는 경우 보안에 어떤 위험이 있을까? 이를 어떤 방법으로 해결할 수 있는가?

 

개발자가 특정 개발 도구를 직접 컴파일하여 사용하는 경우, 보안에 여러 가지 위험이 존재할 수 있습니다. 다음은 그 위험과 해결 방법입니다.

보안 위험
취약점 포함 가능성:

직접 컴파일할 경우, 소스 코드에 알려진 취약점이 포함될 수 있으며, 이를 사전에 검토하지 않으면 보안 문제가 발생할 수 있습니다.
의존성 문제:

해당 도구가 의존하는 라이브러리나 패키지의 보안 취약점이 해결되지 않은 상태로 포함될 수 있습니다.
패치 관리 어려움:

공식 패키지가 아닌 경우, 보안 패치가 자동으로 적용되지 않아 지속적인 보안 관리가 어려워질 수 있습니다.
코드 품질 및 신뢰성:

직접 컴파일한 도구는 공식적으로 제공되는 패키지에 비해 품질이나 신뢰성이 떨어질 수 있습니다.
해결 방법
소스 코드 검토:

컴파일하기 전에 소스 코드를 철저히 검토하여 알려진 취약점이 없는지 확인합니다.
신뢰할 수 있는 출처 사용:

공식적으로 제공되는 소스 코드나 신뢰할 수 있는 저장소에서 다운로드하여 컴파일합니다.
패치 및 업데이트 관리:

정기적으로 소스 코드를 업데이트하고, 보안 패치가 발표되면 즉시 적용합니다.
의존성 관리 도구 사용:

의존성을 관리하는 도구(예: pkg-config, CMake, Poetry)를 사용하여 필요한 라이브러리가 안전한 버전인지 확인합니다.
컨테이너 사용:

Docker와 같은 컨테이너 기술을 활용하여 특정 도구를 격리된 환경에서 실행하고, 보안 업데이트를 쉽게 관리합니다.
가상 환경 설정:

가상 환경(예: Python의 venv, Node.js의 nvm)을 사용하여 개발 도구를 격리하고, 시스템 환경에 미치는 영향을 최소화합니다.
이러한 방법들을 통해 직접 컴파일한 도구의 보안 위험을 효과적으로 관리할 수 있습니다.

 

15. 특정 배포판이 특정 CVE에 안전한지 여부를 어떻게 확신할 수 있는가?

CVE 데이터베이스 확인: NVD(National Vulnerability Database)와 같은 공식 CVE 데이터베이스를 통해 해당 CVE에 대한 정보를 확인합니다.
배포판 보안 공지 확인: 해당 배포판의 공식 웹사이트나 보안 공지 페이지에서 CVE 관련 패치를 확인합니다.
패치 레벨 확인: 배포판에서 제공하는 패치 수준 및 업데이트 내역을 확인하여, 해당 CVE가 수정된 버전인지 확인합니다.

 

16.  배포판 업데이트 주기는 어떻게 가져가야 한다고 생각하는가?

정기적 업데이트: 보안 업데이트는 최소한 월 1회 이상 진행하는 것이 좋습니다.
비상 업데이트: 심각한 보안 취약점이 발견되면 즉시 업데이트를 적용합니다.
테스트 환경 운영: 업데이트 전에 테스트 환경에서 충분히 검증한 후, 프로덕션 환경에 적용합니다.

 

17.  어떤 컴포넌트나 라이브러리가 안전함을 어떻게 확신할 수 있는가? 업데이트 주기는 어떻게 판단하나 외부와 내부가 분리된 망에서 어떻게 업데이트를 할. 수 있을까?

신뢰할 수 있는 출처: 공식적으로 지원되는 배포판이나 라이브러리 저장소에서 다운로드합니다.
보안 감사: 오픈 소스 라이브러리의 경우, 커뮤니티에서 진행한 보안 감사 결과를 확인합니다.
버전 관리: 최신 안정 버전 사용을 권장하며, 이전 버전의 보안 이슈를 확인합니다.

 

업데이트 주기는 어떻게 판단하나
CVE 발표 주기: CVE가 발표되는 빈도에 따라 업데이트 주기를 결정합니다.
프로젝트의 중요도: 사용하는 컴포넌트나 라이브러리의 중요도에 따라 업데이트 주기를 조정합니다.
의존성 분석: 의존성 트리를 분석하여 보안 취약점이 있는 라이브러리의 업데이트를 우선적으로 진행합니다.


외부와 내부가 분리된 망에서 어떻게 업데이트를 할 수 있을까?
물리적 미디어 사용: 외부에서 업데이트 파일을 다운로드한 후, USB 등의 물리적 미디어를 사용하여 내부망에 전송합니다.
전용 업데이트 서버: 외부에서 업데이트를 다운로드하고, 이를 내부망에 있는 전용 업데이트 서버에 배포한 후, 내부 시스템에서 해당 서버를 통해 업데이트를 진행합니다.

 

18.  자바에서 사용하는 라이브러리의 보안 취약점을 실시간으로 확인할 수 있는 방법은 어떤 방법이 있는가? 이를 실시간 패치하는 방법은?

정적 코드 분석 도구: SonarQube, Snyk 등의 도구를 사용하여 코드에서 보안 취약점을 실시간으로 분석합니다.
의존성 검사 도구: OWASP Dependency-Check, Maven의 dependency-check-plugin 등을 통해 라이브러리의 CVE를 검사합니다.


이를 실시간 패치하는 방법은?
자동화된 빌드 시스템: CI/CD 파이프라인을 구성하여, 보안 취약점이 발견될 경우 자동으로 최신 버전으로 업데이트하도록 설정합니다.
패치 관리 도구: JFrog Artifactory와 같은 패치 관리 도구를 사용하여, 라이브러리의 최신 패치를 자동으로 적용할 수 있도록 설정합니다.
이러한 방법들을 통해 보안 취약점을 효과적으로 관리하고, 실시간으로 대응할 수 있습니다.

 

19.  배포판의 LTS의 의미는 무엇인가? 각 배포판의 Long-term support의 정책?


LTS(Long-Term Support)는 특정 배포판이 장기간 동안 안정적인 지원과 업데이트를 제공하는 정책을 의미합니다. 일반적으로 LTS 버전은 보안 업데이트와 버그 수정을 제공하며, 새로운 기능 추가는 최소화하여 안정성을 유지합니다.

각 배포판의 Long-term support 정책
Ubuntu:

LTS 버전은 2년에 한 번 출시되며, 5년 동안 보안 업데이트와 버그 수정을 제공합니다. LTS 버전은 기업 환경에서 많이 사용됩니다.
Debian:

Debian의 Stable 버전은 3년 이상 지원되며, 보안 업데이트는 그 기간 동안 제공됩니다. 새로운 안정화 버전이 출시되면 이전 버전은 보안 업데이트를 계속 받을 수 있습니다.
CentOS:

CentOS는 Red Hat Enterprise Linux(RHEL)의 무료 대안으로, RHEL과 동일한 지원 기간(약 10년)을 가집니다. 주요 업데이트는 3-4년에 한 번 발생하며, 보안 패치는 지속적으로 제공됩니다.
Fedora:

Fedora는 LTS 개념은 없지만, 각 릴리스는 약 13개월간 지원됩니다. 최신 기술을 반영하는 배포판으로, 자주 업데이트가 이루어집니다.
openSUSE:

openSUSE Leap은 약 3년간 지원되며, 보안 및 버그 수정 업데이트가 제공됩니다. Tumbleweed는 롤링 릴리스 모델로 지속적으로 업데이트됩니다.
이러한 LTS 정책은 기업이나 안정성이 중요한 환경에서 중요한 선택 요소가 됩니다. 각 배포판의 LTS 정책을 고려하여 적절한 선택을 하는 것이 필요합니다.

 

20.  MITM 공격에 대해서 이야기해보시오. 어떻게 방지할 수 있는가?

MITM 공격에 대해서 이야기해보시오.
MITM(Man-In-The-Middle) 공격은 공격자가 두 통신 당사자 사이에 개입하여 정보를 가로채거나 조작하는 공격 방식입니다. 이 공격은 일반적으로 다음과 같은 방식으로 이루어집니다:

가로채기: 공격자가 네트워크 트래픽을 가로채어 사용자의 데이터(예: 로그인 정보, 신용카드 정보)를 수집합니다.
정보 수정: 공격자가 통신 내용을 수정하여 피해자가 잘못된 정보를 수신하게 만들 수 있습니다.
신뢰성 위조: 공격자가 피해자에게 신뢰할 수 있는 서비스인 것처럼 가장하여 정보를 탈취합니다.
어떻게 방지할 수 있는가?
암호화 사용:

SSL/TLS를 사용하여 웹사이트와의 통신을 암호화합니다. HTTPS 프로토콜을 사용하는 웹사이트에 접속할 때 URL이 "https://"로 시작하는지 확인합니다.
신뢰할 수 있는 인증서 사용:

인증서가 신뢰할 수 있는 CA(Certificate Authority)에서 발급되었는지 확인합니다. 브라우저에서 경고 메시지가 나타나면 주의해야 합니다.
VPN 사용:

공공 Wi-Fi를 사용할 때는 VPN을 통해 트래픽을 암호화하여 외부 공격자로부터 보호합니다.
강력한 인증 방식:

다중 인증(MFA)을 사용하여 계정 보안을 강화합니다. 이 방식은 추가적인 인증 단계를 요구하여 보안성을 높입니다.
네트워크 보안 강화:

WPA3와 같은 강력한 무선 보안 프로토콜을 사용하여 무선 네트워크를 보호합니다.
정기적인 보안 점검:

시스템과 애플리케이션의 보안 패치를 정기적으로 적용하고, 취약점 스캐닝을 수행하여 보안을 강화합니다.
피싱 경고:

이메일이나 메시지를 통해 전달된 링크를 클릭할 때 주의하고, 출처를 확인하여 피싱 공격을 피합니다.
이러한 방법들을 통해 MITM 공격의 위험성을 줄이고, 데이터의 안전성을 높일 수 있습니다.

'Computer Science > Operating System' 카테고리의 다른 글

Linux - System Administration  (1) 2024.08.27

1.  리눅스

리눅스(Linux)는 오픈 소스 운영 체제 커널로, 리누스 토발즈(Linus Torvalds)가 1991년에 처음 개발하였습니다. 리눅스는 다양한 배포판으로 제공되며, 서버, 데스크탑, 임베디드 시스템 등 여러 환경에서 널리 사용됩니다.

주요 특징

  1. 오픈 소스: 리눅스는 소스 코드가 공개되어 있어 누구나 자유롭게 수정하고 배포할 수 있습니다. 이로 인해 다양한 버전과 배포판이 존재합니다.
  2. 유연성: 사용자는 필요에 따라 커널과 소프트웨어를 수정할 수 있어 다양한 하드웨어와 용도에 맞춰 최적화할 수 있습니다.
  3. 안정성: 리눅스는 높은 안정성을 제공하여 서버 환경에서도 자주 사용됩니다. 시스템이 오랫동안 실행되어도 잘 다운되지 않는 특성을 가지고 있습니다.
  4. 보안: 강력한 권한 관리 및 사용자 관리 기능을 통해 보안성이 높습니다. 다양한 보안 도구와 커뮤니티의 지원으로 지속적으로 보안이 강화됩니다.
  5. 다양한 배포판: 우분투(Ubuntu), 페도라(Fedora), 센토스(CentOS), 데비안(Debian) 등 다양한 배포판이 있어 사용자 요구에 맞는 선택이 가능합니다.

구성 요소

  • 커널: 하드웨어와 소프트웨어 간의 인터페이스 역할을 하며, 시스템 자원 관리, 프로세스 관리, 메모리 관리 등을 담당합니다.
  • : 사용자와 커널 간의 명령어 인터페이스로, 명령어를 입력하고 실행할 수 있게 도와줍니다.
  • 파일 시스템: 데이터 저장 구조로, 리눅스는 다양한 파일 시스템(예: ext4, XFS 등)을 지원합니다.
  • 응용 프로그램: 다양한 소프트웨어가 리눅스에서 실행될 수 있으며, 오픈 소스 및 상용 프로그램이 포함됩니다.

사용 사례

  • 서버: 웹 서버, 데이터베이스 서버 등 다양한 서버 환경에서 많이 사용됩니다.
  • 개발 환경: 많은 개발자들이 리눅스를 개발 환경으로 선택하며, 프로그래밍 언어 및 도구들이 잘 지원됩니다.
  • 임베디드 시스템: IoT 기기 및 다양한 하드웨어에서 리눅스 기반의 운영 체제가 사용됩니다.

 

2.  리눅스 파일시스템

리눅스 파일 시스템은 데이터를 저장하고 관리하는 구조로, 여러 종류의 파일 시스템이 존재합니다. 각 파일 시스템은 고유의 특성과 용도로 설계되었습니다. 다음은 리눅스에서 일반적으로 사용되는 파일 시스템의 주요 종류와 특징입니다.


1. ext4 (Fourth Extended Filesystem)
가장 널리 사용되는 리눅스 파일 시스템.
큰 파일과 파티션을 지원하며, 저널링 기능을 제공하여 데이터 무결성을 유지합니다.
빠른 성능과 효율적인 공간 관리를 특징으로 합니다.


2. XFS
고성능 파일 시스템으로 대용량 데이터 처리에 적합합니다.
저널링 기능이 있으며, 동시 작업 처리에 강점을 가지고 있습니다.
파일 시스템 크기를 동적으로 확장할 수 있는 기능을 제공합니다.


3. Btrfs (B-tree File System)
최신 파일 시스템으로, 스냅샷, 압축, RAID 기능을 지원합니다.
데이터 무결성을 위한 체크섬 기능이 있으며, 관리와 확장성이 뛰어납니다.
여러 디바이스를 통합하여 하나의 파일 시스템으로 사용할 수 있습니다.


4. FAT (File Allocation Table)
주로 USB 드라이브와 같은 이동식 미디어에서 사용됩니다.
다양한 운영 체제와 호환성이 높지만, 파일 크기와 볼륨 크기에 제한이 있습니다.


5. NTFS (New Technology File System)
Windows에서 주로 사용되지만, 리눅스에서도 읽기/쓰기가 가능합니다.
큰 파일과 파티션을 지원하며, 보안 및 저널링 기능이 있습니다.


6. ReiserFS
저널링 파일 시스템으로, 작은 파일에 대한 성능이 우수합니다.
최근에는 사용 빈도가 줄어들고 있지만, 특정 환경에서 여전히 사용됩니다.
파일 시스템의 주요 특징
저널링: 데이터 무결성을 보장하기 위해 변경 사항을 기록하는 기능.
스냅샷: 특정 시점의 파일 시스템 상태를 저장하여 복구할 수 있는 기능.
압축: 저장 공간을 절약하기 위해 데이터를 압축하는 기능.
RAID 지원: 여러 디스크를 하나의 논리적 장치로 묶어 성능과 안정성을 향상시키는 기능.
리눅스 파일 시스템은 다양한 요구 사항에 맞게 선택할 수 있으며, 각 파일 시스템의 특성을 이해하는 것이 중요합니다.

파일시스템의 종류(ext, XFS, GFS, FAT16/32, NTFS, UFS, tmpFS…)

 


3.  chown, chmod, chroot

chown, chmod, chroot는 리눅스 및 유닉스 시스템에서 파일과 디렉토리의 권한 및 소유자를 관리하는 데 사용되는 명령어입니다.

1. chown

  • 기능: 파일이나 디렉토리의 소유자를 변경합니다.
  • 사용법: chown [옵션] [소유자][:그룹] 파일/디렉토리
  • 예시: chown user:group filename은 filename의 소유자를 user로, 그룹을 group으로 변경합니다.
  • 용도: 파일의 소유자를 변경하여 권한을 관리할 수 있습니다.

2. chmod

  • 기능: 파일이나 디렉토리의 접근 권한을 변경합니다.
  • 사용법: chmod [옵션] [모드] 파일/디렉토리
  • 예시: chmod 755 filename은 소유자에게 읽기, 쓰기, 실행 권한을 주고, 그룹과 다른 사용자에게 읽기와 실행 권한을 부여합니다.
  • 용도: 파일의 접근 권한을 조정하여 보안을 강화하거나 특정 사용자에게 접근을 허용합니다.

3. chroot

  • 기능: 현재 프로세스의 루트 디렉토리를 변경합니다. 이 명령어를 사용하면 특정 디렉토리 내에서만 작업할 수 있는 환경을 생성합니다.
  • 사용법: chroot [옵션] 새로운루트 [명령어]
  • 예시: chroot /newroot /bin/bash는 /newroot를 새로운 루트로 설정하고, 그 안에서 bash 셸을 실행합니다.
  • 용도: 보안이나 테스트 목적으로 제한된 환경을 만들고, 특정 프로세스가 다른 시스템 파일에 접근하지 못하도록 합니다.

요약

  • chown: 파일의 소유자와 그룹을 변경.
  • chmod: 파일의 접근 권한을 변경.
  • chroot: 프로세스의 루트 디렉토리를 변경하여 제한된 환경을 생성.

이 세 가지 명령어는 시스템 관리 및 보안에 중요한 역할을 하며, 각각의 용도에 맞게 적절히 사용해야 합니다.


4.  2자로 된 명령어를 모두 찾을 수 있는 방법?

리눅스에서 2자로 된 파일 이름을 찾기 위해 사용할 수 있는 find 명령어는 다음과 같습니다. 두 가지 방법을 소개하겠습니다.

1. 패턴을 이용한 방법

find / -name '[a-z][a-z0-9]' -type f
  • 이 명령어는 루트 디렉토리(/)에서 소문자 알파벳과 숫자로 이루어진 2자 파일 이름을 가진 파일을 찾습니다.

2. 특정 디렉토리에서 찾기

find /usr/{bin,sbin} -name '??' -ls
  • 이 명령어는 /usr/bin과 /usr/sbin 디렉토리에서 2자 파일 이름을 가진 파일을 찾고, 해당 파일에 대한 상세 정보를 출력합니다.

 

  • 첫 번째 방법은 아스키 문자 패턴을 사용하여 모든 디렉토리에서 2자 파일을 찾고,
  • 두 번째 방법은 특정 디렉토리에서 2자 파일을 찾습니다.

 

5. FUSE?

FUSE(파일 시스템 사용자 공간)는 사용자 공간에서 파일 시스템을 구현할 수 있게 해주는 인터페이스입니다. 이를 통해 사용자나 개발자가 커널 모듈을 작성하지 않고도 파일 시스템을 만들 수 있습니다. FUSE와 전통적인 커널 기반 파일 시스템의 차이점과 FUSE의 유용성에 대해 설명하겠습니다.

FUSE와 전통적인 파일 시스템의 차이점

  1. 구현 위치:
    • FUSE: 사용자 공간에서 실행됩니다. 이는 개발자가 파일 시스템 코드를 쉽게 작성하고 테스트할 수 있게 해줍니다.
    • 전통적인 파일 시스템: 커널 공간에서 실행되며, 커널 모듈로 작성되어야 합니다. 성능과 안정성 측면에서 더 효율적입니다.
  2. 성능:
    • FUSE: 사용자 공간과 커널 공간 간의 컨텍스트 전환이 발생하므로, 일반적으로 성능이 저하될 수 있습니다.
    • 전통적인 파일 시스템: 더 빠르고 효율적인 성능을 제공합니다.
  3. 개발 용이성:
    • FUSE: 개발이 상대적으로 쉽고, 다양한 언어(예: Python, Ruby 등)로 구현할 수 있습니다.
    • 전통적인 파일 시스템: 커널 프로그래밍에 대한 깊은 이해가 필요하며, 디버깅이 복잡합니다.

FUSE의 유용성

  • 프로토타입 및 실험: FUSE는 새로운 파일 시스템 아이디어를 신속하게 테스트하고 구현할 수 있는 좋은 방법입니다.
  • 특정 요구 사항: 특정 애플리케이션이나 사용 사례에 맞춘 커스텀 파일 시스템을 만들 수 있습니다. 예를 들어, 클라우드 스토리지, 데이터베이스, 암호화된 파일 시스템 등에서 유용합니다.
  • 이식성: 다양한 플랫폼에서 사용 가능하며, 커널 모듈을 작성할 필요가 없어 이식성이 좋습니다.

성능 차이를 무시하더라도 FUSE는 충분히 쓸만합니다. 특히 개발 및 테스트 환경에서 유용하며, 특정 용도에 맞는 기능을 구현하는 데 매우 적합합니다. 단, 성능이 중요한 프로덕션 환경에서는 전통적인 파일 시스템이 더 나은 선택이 될 수 있습니다.

 


6. Device Tree

Device Tree는 하드웨어 구성 정보를 서술하는 데이터 구조로, 주로 임베디드 시스템과 ARM 기반 시스템에서 사용됩니다. 이를 통해 운영 체제나 커널이 하드웨어를 인식하고 설정할 수 있도록 정보를 제공합니다.

주요 특징

  1. 구조:
    • Device Tree는 트리 형태로 구성되어 있으며, 각 노드는 하드웨어 장치나 버스, 프로퍼티에 대한 정보를 담고 있습니다.
    • 각 노드는 장치의 주소, IRQ(인터럽트 요청), 드라이버 정보 등을 포함할 수 있습니다.
  2. 포맷:
    • 주로 두 가지 포맷으로 사용됩니다: 소스 포맷(.dts)과 바인딩된 바이너리 포맷(.dtb).
    • .dts 파일은 텍스트 형식으로 하드웨어 정보를 명시하고, 이를 컴파일하여 .dtb 파일로 변환합니다.
  3. 운영 체제와의 통합:
    • Linux 커널은 Device Tree를 사용하여 부팅 시 하드웨어 정보를 읽고, 필요한 드라이버를 로드합니다.
    • 이를 통해 다양한 하드웨어 플랫폼에서 동일한 커널 이미지를 사용할 수 있게 해줍니다.
  4. 장점:
    • 유연성: 하드웨어 변경 시 소스 파일만 수정하면 되므로, 커널을 재컴파일할 필요가 없습니다.
    • 재사용성: 다양한 하드웨어 플랫폼에 대해 동일한 커널을 사용할 수 있어, 유지보수가 용이합니다.
  5. 사용 예:
    • ARM 아키텍처의 다양한 개발 보드 및 임베디드 시스템에서 널리 사용됩니다.
    • 부트로더(예: U-Boot)와 함께 사용되어, 커널 부팅 시 하드웨어 정보를 전달합니다.

Device Tree는 하드웨어를 서술하는 효율적이고 유연한 데이터 구조로, 다양한 플랫폼에서 하드웨어 인식을 간소화하고, 커널의 이식성을 높이는 데 기여합니다. 특히 임베디드 시스템에서 중요한 역할을 하고 있습니다.

 


7. 좀비(zombie) 프로세스

좀비(zombie) 프로세스는 자식 프로세스가 종료되었지만, 부모 프로세스가 아직 종료된 자식 프로세스의 종료 상태를 수집하지 않아 메모리에 남아 있는 상태를 의미합니다. 이 상태는 자식 프로세스의 PID(프로세스 ID)와 종료 상태 정보가 시스템에 남아 있지만, 실제로는 더 이상 실행 중이지 않은 프로세스입니다.

좀비 프로세스의 특징

  1. 상태:
    • 좀비 프로세스는 실제로 실행되지 않지만, 프로세스 테이블에 여전히 존재합니다.
    • 종료된 자식 프로세스의 정보를 유지하여 부모 프로세스가 이를 확인할 수 있도록 합니다.
  2. 발생 원인:
    • 자식 프로세스가 종료되면, 시스템은 종료 상태를 부모 프로세스에게 전달해야 합니다.
    • 부모 프로세스가 wait() 또는 waitpid() 시스템 호출을 통해 자식의 종료 상태를 수집하지 않으면, 자식 프로세스는 좀비 상태로 남습니다.
  3. 문제점:
    • 좀비 프로세스는 시스템 자원을 차지하지 않지만, 프로세스 테이블의 슬롯을 점유합니다.
    • 만약 부모 프로세스가 종료되지 않고 좀비 프로세스가 많아지면, 시스템의 프로세스 테이블이 가득 차서 새로운 프로세스 생성에 문제가 발생할 수 있습니다.
  4. 해결 방법:
    • 부모 프로세스가 적절히 자식 프로세스의 종료 상태를 수집하도록 구현해야 합니다.
    • 부모 프로세스가 종료되면, 운영 체제가 자식 프로세스를 init 프로세스에 양도하여 정리할 수 있습니다. 이때 init 프로세스는 자식 프로세스의 종료 상태를 수집합니다.

좀비 프로세스는 자식 프로세스가 종료된 후에도 부모 프로세스가 종료 상태를 수집하지 않아 발생하는 상태로, 시스템 자원을 낭비하지 않지만, 프로세스 테이블의 슬롯을 차지하여 새로운 프로세스 생성을 방해할 수 있습니다. 적절한 프로세스 관리로 이를 예방하는 것이 중요합니다.

 


8. Shell

쉘(Shell)은 사용자와 운영 체제 간의 인터페이스 역할을 하는 프로그램으로, 명령어를 입력받아 실행하고 결과를 출력합니다. 주로 커맨드 라인 인터페이스(CLI) 형태로 제공되며, 사용자가 시스템과 상호작용할 수 있도록 돕습니다.

쉘의 주요 기능

  1. 명령어 해석:
    • 사용자가 입력한 명령어를 해석하고 실행합니다. 이 과정에서 명령어와 인수를 파싱하여 적절한 시스템 호출을 수행합니다.
  2. 스크립트 실행:
    • 쉘은 배치 작업을 자동화하기 위해 스크립트 파일을 실행할 수 있습니다. 이를 통해 일련의 명령어를 순차적으로 실행할 수 있습니다.
  3. 입출력 리다이렉션:
    • 표준 입력, 출력, 오류 출력을 다른 파일이나 장치로 리다이렉션할 수 있습니다. 예를 들어, 명령어의 출력을 파일로 저장하거나 파일의 내용을 명령어의 입력으로 사용할 수 있습니다.
  4. 파이프:
    • 여러 명령어를 연결하여 출력이 다음 명령어의 입력으로 사용되도록 할 수 있습니다. 이를 통해 복잡한 데이터 처리 작업을 수행할 수 있습니다.
  5. 환경 변수 관리:
    • 쉘은 시스템의 환경 변수를 설정하고 관리하는 기능을 제공합니다. 이를 통해 프로그램의 동작 방식이나 경로 등을 조정할 수 있습니다.
  6. 프로세스 관리:
    • 쉘은 프로세스를 생성하고 관리하며, 백그라운드 또는 포그라운드에서 실행할 수 있도록 지원합니다.


9. 리눅스 서버에 원격으로 접근할 수 있는 방법

리눅스 서버에 원격으로 접근할 수 있는 여러 방법이 있습니다. 각 방법은 보안 수준과 사용 용도에 따라 다릅니다. 아래는 주요 원격 접근 방법입니다.

1. SSH (Secure Shell)

  • 설명: SSH는 데이터를 암호화하여 안전하게 원격 서버에 접속할 수 있도록 해주는 프로토콜입니다.
  • 장점:
    • 높은 보안성 (암호화)
    • 포트 포워딩 및 X11 포워딩 지원
  • 사용 예: ssh username@hostname

2. Telnet

  • 설명: Telnet은 원격 서버에 텍스트 기반으로 접속할 수 있는 프로토콜입니다.
  • 단점:
    • 암호화되지 않은 데이터 전송으로 보안에 취약합니다.
  • 사용 예: telnet hostname

3. RSH (Remote Shell)

  • 설명: RSH는 원격 시스템에서 명령을 실행할 수 있는 프로토콜입니다.
  • 단점:
    • 보안성이 낮고, 암호화되지 않음
    • SSH에 비해 사용이 줄어듬
  • 사용 예: rsh hostname command

4. SCP (Secure Copy Protocol)

  • 설명: SCP는 SSH를 기반으로 파일을 안전하게 복사할 수 있는 프로토콜입니다.
  • 장점:
    • 데이터 전송이 암호화되어 안전함
  • 사용 예: scp localfile username@hostname:/path/to/destination

5. SFTP (SSH File Transfer Protocol)

  • 설명: SFTP는 SSH를 통해 파일을 안전하게 전송하는 프로토콜입니다.
  • 장점:
    • 파일 전송과 관리 기능을 제공
    • 강력한 보안
  • 사용 예: sftp username@hostname

6. VNC (Virtual Network Computing)

  • 설명: VNC는 GUI 환경에서 원격 접속을 지원하는 프로토콜입니다.
  • 장점:
    • 그래픽 사용자 인터페이스 지원
  • 단점:
    • 보안성이 낮기 때문에 SSH와 함께 사용하는 것이 좋음

리눅스 서버에 원격으로 접근할 때는 보안성과 사용 목적에 따라 적절한 방법을 선택하는 것이 중요합니다. 일반적으로 SSH가 가장 많이 사용되며, 보안이 중요한 환경에서는 SCP나 SFTP를 통해 파일 전송을 수행하는 것이 좋습니다.

 

 

10. load average (/proc/loadavg)

Load Average는 시스템의 부하를 나타내는 지표로, 일반적으로 1분, 5분, 15분 간의 평균값을 제공합니다. 이 값은 다음과 같은 의미를 가집니다:

1분 평균: 최근 1분 동안의 평균 부하를 나타냅니다.
5분 평균: 최근 5분 동안의 평균 부하를 나타냅니다.
15분 평균: 최근 15분 동안의 평균 부하를 나타냅니다.
이 값들은 시스템이 얼마나 과부하 상태인지, 또는 정상 상태인지를 판단하는 데 도움을 줍니다. 일반적으로 Load Average 값이 CPU 코어 수보다 높으면 시스템이 과부하 상태일 가능성이 큽니다.

해석 방법
0.00 - 1.00: 정상 상태, 시스템이 잘 작동 중.
1.00 - 2.00: 약간의 부하, 시스템이 여전히 반응성이 좋을 수 있음.
2.00 이상: 부하가 증가하고 있으며, 성능 저하가 발생할 수 있음.
vmstat 명령어
vmstat 명령어를 사용하면 현재 실행 중인 프로세스의 상태를 확인할 수 있습니다:

r 열: 실행 중인 프로세스의 수.
b 열: I/O 대기 중인 프로세스의 수.
이 값을 통해 현재 시스템의 부하를 좀 더 구체적으로 분석할 수 있습니다.

/proc/sched_debug 확인
cat /proc/sched_debug 명령어를 통해 더 자세한 스케줄링 정보를 확인할 수 있습니다. 여기서 중요한 항목은:

nr_running: 현재 실행 가능한 프로세스의 수.
runnable tasks: 실행 대기 중인 태스크.
이 정보를 통해 시스템의 스케줄링 상태와 부하를 보다 깊이 이해할 수 있습니다.

11. LVM structure에 대해서 설명해보시오.

로지컬 볼륨 관리자
PV(Physical Volume): 물리적인 디바이스 블록
VG(Volume Group): 물리적인 디바이스를 하나의 가상 디바이스 블록으로 그룹핑한 것
LV(Logical Volume): VG로 그룹핑된 볼륨을 논리적인 블록디바이스(파티션)으로 만드는 것

LVM(로지컬 볼륨 관리자)은 리눅스에서 스토리지 관리를 유연하게 해주는 시스템입니다. LVM의 구조는 다음과 같이 구성됩니다:

1. PV (Physical Volume)
물리적인 디스크 드라이브나 파티션을 의미합니다.
LVM에서 사용될 수 있는 기본 단위로, 물리적인 스토리지 장치를 나타냅니다.
여러 개의 PV를 하나의 VG로 묶을 수 있습니다.


2. VG (Volume Group)
하나 이상의 PV를 그룹화하여 생성된 논리적인 스토리지 풀입니다.
VG는 물리적 볼륨들로부터 할당된 공간을 관리합니다.
VG 내에서 여러 개의 LV를 생성할 수 있습니다.


3. LV (Logical Volume)
VG 내에서 생성된 논리적인 볼륨으로, 실제로 파일 시스템을 생성하고 데이터를 저장하는 데 사용됩니다.
LV는 사용자가 접근할 수 있는 장치로, 파티션처럼 사용할 수 있습니다.
필요에 따라 크기를 조정하거나 여러 LV를 생성하여 사용할 수 있습니다.


LVM의 장점
유연성: 스토리지 크기를 동적으로 조정할 수 있어, 필요에 따라 쉽게 용량을 추가하거나 줄일 수 있습니다.
스냅샷: LV의 상태를 특정 시점에서 저장할 수 있어, 데이터 백업 및 복구가 용이합니다.
다중화: 여러 PV를 결합하여 하나의 VG를 만들 수 있어, 데이터의 분산 저장이 가능합니다.
이러한 구조 덕분에 LVM은 효율적인 스토리지 관리와 유연한 용량 조정을 가능하게 합니다.

 

12. 리눅스 배포본을 비교해보시오. (Red Hat, CentOS, Oracle Linux, SUSE, Ubuntu)

리눅스 배포본은 각기 다른 특징과 사용 목적을 가지고 있어, 적절한 선택이 중요합니다. 여기서는 Red Hat, CentOS, Oracle Linux, SUSE, Ubuntu의 주요 특징을 비교해보겠습니다.

1. Red Hat Enterprise Linux (RHEL)
용도: 기업용 서버 및 고급 인프라에 주로 사용됩니다.
지원: 상업적으로 지원되며, 기술 지원과 서비스가 제공됩니다.


특징:
안정성과 보안성이 높음.
다양한 패키지와 도구를 제공.
Red Hat Subscription Model을 통해 업데이트와 지원을 받음.


2. CentOS
용도: RHEL의 무료 버전으로, 서버 환경에서 널리 사용됨.
지원: 커뮤니티 기반의 지원 체계.


특징:
RHEL의 소스를 기반으로 하여 거의 같은 성능을 제공합니다.
기관과 기업에서 비용을 절약하기 위해 많이 사용됨.
업데이트 주기가 RHEL과 비슷하지만, 커뮤니티 지원이 필요함.


3. Oracle Linux
용도: Oracle 소프트웨어 제품과 함께 사용하기 최적화됨.
지원: Oracle에서 상업적인 지원 제공.


특징:
Red Hat과 호환성을 유지하면서 Oracle의 성능 최적화를 포함.
Ksplice를 사용하여 재부팅 없이 커널 패치를 적용 가능.
Oracle 클라우드와의 통합이 뛰어남.


4. SUSE Linux Enterprise Server (SLES)
용도: 기업 환경과 미션 크리티컬 서버에 최적화됨.
지원: 상업적 지원이 제공됨.


특징:
안정성 및 효율성이 뛰어나고, 리소스 관리 능력이 뛰어남.
유연한 로드밸런싱 기능과 스토리지 관리 기능 지원.
SAP 애플리케이션에 대한 최적화가 강점.


5. Ubuntu
용도: 개인용 및 서버 환경에서 많이 사용됨.
지원: 무료로 사용 가능하고, 상업적 지원도 있음.


특징:
사용하기 쉬운 인터페이스로 개인 사용자와 초기 사용자가 선호함.
매년 LTS(장기 지원) 버전이 출시되어 안정성을 제공.
소프트웨어 생태계가 다양하고, 커뮤니티 지원이 활발함.


리눅스 배포본은 각각의 장점과 용도가 있으므로 사용자와 환경의 요구에 따라 선택하는 것이 중요합니다. Red Hat과 SUSE는 주로 기업 환경에 최적화되어 있으며, CentOS와 Oracle Linux는 비용을 절감하면서 안정성을 원할 때 유용합니다. 반면에 Ubuntu는 개인 사용자와 개발자에게 인기 있는 선택입니다. 각 배포본의 특징을 잘 이해하면 최적의 선택을 할 수 있습니다.

'Computer Science > Operating System' 카테고리의 다른 글

Linux - Security  (4) 2024.08.31

+ Recent posts