Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
test-your-sysadmin-skills — Linux 시스템 관리자 테스트 질문과 답변 모음입니다. 이 Q/A로 다양한 분야에서 지식과 기술을 테스트해보세요. | Kitploit
도구/GitHubGitHub/trimstray/test-your-sysadmin-skills
Learning & EducationCurated ResourcesLearning Paths & Courses
GitHubtrimstray/test-your-sysadmin-skills

test-your-sysadmin-skills

Linux 시스템 관리자 테스트 질문과 답변 모음입니다. 이 Q/A로 다양한 분야에서 지식과 기술을 테스트해보세요.

저장소 보기
11.7k1.7k1년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

마스터


:star:

"훌륭한 관리자는 모든 것을 알 필요는 없지만, 불가능한 프로젝트에 놀라운 해결책을 제시할 수 있어야 합니다." - cwheeler33 (ServerFault)

:star:

"내 기술은 작동하게 만드는 것이지, 수십억 개의 사실을 아는 것이 아닙니다. [...] 시스템을 수리해야 한다면 문제를 식별하고, 로그를 확인하며, 오류를 찾아볼 것입니다. 해결책을 구현해야 한다면 올바른 해결책을 조사하고, 구현하고 문서화하며, 나중에 자주 상호작용하지 않는 한 대략적인 작동 원리만 알게 됩니다... 그게 문서화하는 이유입니다." - Sparcrypt (Reddit)


풀 요청 MIT 라이선스




ℹ️  이 프로젝트는 284개의 테스트 질문과 답변을 포함하고 있으며, Linux (*nix) 시스템 관리자와 같은 직무에 대한 지식을 테스트하거나 면접/시험에 사용할 수 있습니다.

✔️  답변은 예시일 뿐이며 전체 주제를 완전히 다루지 않습니다. 대부분은 더 깊이 이해하기 위한 유용한 자료를 포함하고 있습니다.

⚠️  *** 로 표시된 질문은 아직 답변이 없거나 불완전합니다. 풀 리퀘스트를 보내 추가해 주세요!

🚥  이해가 안 되는 부분이나 올바르지 않은 내용을 발견하시면 풀 리퀘스트를 보내 주시고, 변경 사항이나 의견에 대해 타당하고 합리적인 설명을 추가해 주세요.

📚  지식/기술을 향상시키기 위해 devops-interview-questions를 참조하세요. 정말 흥미롭게 보입니다.


» 모든 제안을 환영합니다 «


목차


소개

💠 간단한 질문

  • 이번 주에 무엇을 배웠나요?
  • 시스템 관리자 세계에서 무엇이 당신을 흥분시키거나 흥미롭게 하나요?
  • 최근에 겪은 기술적 도전과 그것을 어떻게 해결했는지 알려주세요.
  • 마지막으로 완료한 주요 프로젝트에 대해 말해주세요.
  • 오픈 소스 프로젝트에 기여하고 있나요?
  • 홈랩의 구성을 설명해 주세요.
  • 가장 자랑스러운 개인적 성취는 무엇인가요?
  • 당신이 저지른 가장 큰 실수에 대해 말해주세요. 오늘날에는 어떻게 다르게 하시겠나요?
  • 새 직장 첫날에 어떤 소프트웨어 도구를 설치할 예정인가요?
  • 지식 데이터베이스(예: 위키, 파일, 포털)를 어떻게 관리하는지 말해주세요.
  • 매일 확인하는 뉴스 소스는 무엇인가요? (시스템 관리자, 보안 관련 또는 기타)
  • NOC 팀에 시스템 관리자 인증을 위한 새 예산이 있습니다. 어떤 자격증을 원하시며 그 이유는?
  • 개발자와 어떻게 상호작용하나요: 우리 대 그들 아니면 다른 접근 방식으로 함께 협력?
  • 당신이 저를 면접한다면, 제가 비표준 상황에 얼마나 능숙한지 알기 위해 어떤 시스템 관리자 질문을 하시겠나요?

일반 지식

💠 주니어 시스템 관리자

시스템 질문 (37)
리눅스 배포판의 예를 들어 보세요. 당신이 가장 좋아하는 배포판과 그 이유는 무엇인가요?
- Red Hat Enterprise Linux - Fedora - CentOS - Debian - Ubuntu - Mint - SUSE Linux Enterprise Server (SLES) - SUSE Linux Enterprise Desktop (SLED) - Slackware - Arch - Kali - Backbox

제가 가장 좋아하는 리눅스 배포판:

  • Arch Linux는 사용자 정의 운영 체제를 구축할 수 있는 깔끔한 최소 기본 시스템을 제공합니다. 또한 Arch User Repository (AUR)가 있어 공식 바이너리 저장소와 결합하면 아마도 모든 배포판 중 가장 큰 저장소를 가질 수 있습니다. 패키징 과정도 매우 간단하여, 공식 저장소나 AUR에 없는 패키지를 원할 경우 직접 만들기 쉽습니다.
  • Linux Mint는 Ubuntu LTS 릴리스를 기반으로 하지만 Cinnamon, MATE, Xfce 등 여러 데스크탑 환경을 제공하는 에디션이 있습니다. Mint는 상당히 정교하며 외관이 매력적입니다. 특히 새로운 아이콘 테마가 마음에 들지만, GTK+ 테마는 너무 밋밋해서 별로 좋아하지 않습니다. 또한 최신 릴리스 Mint 19에서 버그를 발견했는데, 2주 전에 포럼에 문의했지만 아직 답변이 없어 매우 짜증납니다. 그 버그로 인해 Mint에서 생활이 더 어려워졌습니다.
  • Kali Linux는 고급 침투 테스트 및 보안 감사를 목표로 하는 Debian 기반 리눅스 배포판입니다. Kali는 침투 테스트, 보안 연구, 컴퓨터 포렌식, 리버스 엔지니어링 등 다양한 정보 보안 작업에 특화된 수백 개의 도구를 포함하고 있습니다.

유용한 자료:

  • List of Linux distributions
  • What is your favorite Linux distro and why?
Unix, Linux, BSD, GNU의 차이점은 무엇인가요?

GNU는 엄밀히 말해 운영 체제가 아닙니다. 이는 자유 소프트웨어를 규율하는 일련의 규칙이나 철학에 가깝습니다. 동시에 운영 체제를 만들려는 시도 중에 다양한 도구를 탄생시켰습니다. 따라서 GNU 도구는 기본적으로 이미 존재했던 도구의 오픈 버전이지만, 오픈 소프트웨어 원칙에 맞게 재구현되었습니다. GNU/Linux는 이러한 도구들과 Linux 커널이 결합하여 완전한 운영 체제를 형성합니다. 그러나 다른 GNU도 있습니다. 예: GNU/Hurd.

Unix와 BSD는 다양한 수준의 "클로즈드 소스"인 POSIX의 "오래된" 구현체입니다. Unix는 일반적으로 완전히 클로즈드 소스이지만, Linux만큼 다양한 종류가 있습니다 (아마도 더 많을 수 있습니다). BSD는 일반적으로 "오픈"으로 간주되지 않지만, 출시 당시에는 매우 개방적인 것으로 간주되었습니다. 또한 그 라이선스는 당시의 더 "개방적인" 라이선스보다 훨씬 적은 제한으로 상업적 사용을 허용했습니다.

Linux는 이들 중 가장 최신입니다. 엄밀히 말하면 "단지 커널"일 뿐이지만, 일반적으로 GNU 도구 및 여러 핵심 구성 요소와 결합되어 완전한 OS로 간주됩니다.

이들 사이의 주요 차이는 그들의 이상입니다. Unix, Linux, BSD는 각자 구현하는 이념이 다릅니다. 모두 POSIX이며 기본적으로 상호 교환이 가능합니다. 그러나 동일한 문제를 다른 방식으로 해결하기도 합니다. 따라서 이상과 POSIX 표준을 구현하는 방식 외에는 큰 차이가 없습니다.

자세한 내용은 GNU, OSS, Linux, BSD, UNIX의 창조에 관한 간단한 기사를 읽어보시길 권장합니다. 이 기사들은 각각의 개별적인 아이디어에 치우칠 수 있지만, 차이점을 이해하는 데 도움이 될 것입니다.

유용한 자료:

  • What is the difference between Unix, Linux, BSD and GNU? (original)
  • The Great Debate: Is it Linux or GNU/Linux?
CLI란 무엇인가요? 좋아하는 CLI 도구, 팁, 해킹에 대해 말해주세요.

CLI는 Command Line Interface 또는 Command Language Interpreter의 약자입니다. 명령줄은 시스템/컴퓨터를 제어하는 가장 강력한 방법 중 하나입니다.

Unix 계열 시스템에서 CLI는 사용자가 실행할 명령을 시스템에 입력할 수 있는 인터페이스입니다. CLI는 매우 강력하지만 오류에 관대하지 않습니다.

CLI를 사용하면 시스템 내부 및 코드를 훨씬 세밀하게 조작할 수 있습니다. 사용되는 OS에 관계없이 GUI보다 더 큰 유연성과 제어력을 제공합니다. 예를 들어 Github에서 호스팅되는 소프트웨어에서 사용하려는 많은 프로그램도 실행을 위해 CLI에서 명령을 실행해야 합니다.

좋아하는 도구

  • screen - 무료 터미널 멀티플렉서. 세션을 시작하면 연결이 끊겨도 터미널이 저장되므로 나중에 또는 집에서 재개할 수 있습니다.
  • ssh - 배울 가치가 있는 가장 중요한 명령어. 놀라운 일을 할 수 있습니다:
    • sshfs로 인터넷을 통해 파일 시스템 마운트
    • 명령 전달: 자체적으로 rsync 데몬을 시작하여 rsync 서버에 대해 실행
    • 배치 파일에서 실행: 원격 명령의 출력을 로컬 배치 파일 내에서 사용할 수 있도록 리디렉션
  • vi/vim - 가장 인기 있고 강력한 텍스트 편집기. 보편적이며 대용량 파일에서도 매우 빠르게 작동합니다.
  • bash-completion - 셸에 대한 사전 정의된 완성 규칙을 포함합니다.

팁과 해킹

  • CTRL + R로 명령 기록 검색
  • popd/pushd 및 디렉터리 스택을 조작할 수 있는 기타 셸 내장 명령
  • CTRL + U, 같은 편집 키보드 단축키
가장 좋아하는 셸과 그 이유는 무엇인가요?

BASH가 제가 가장 좋아하는 셸입니다. 이것은 선호도 문제입니다. 저는 구문이 마음에 들고 "딱 맞습니다". 입출력 리디렉션 구문(>>, << 2>&1, 2>, 1> 등)이 C++와 유사하여 인식하기 쉽습니다.

또한 ZSH 셸도 좋아합니다. BASH보다 훨씬 더 사용자 정의가 가능하기 때문입니다. Oh-My-Zsh 프레임워크, 강력한 컨텍스트 기반 탭 완성, 강화된 패턴 매칭/글로빙, 로드 가능한 모듈 등을 제공합니다.

유용한 자료:

  • Comparison of command shells
명령줄에서 도움말을 어떻게 얻나요? ***
  • man [명령어 이름] - 명령어에 대한 설명을 볼 수 있습니다 (예: man less, man cat)

  • -h 또는 --help - 일부 프로그램은 이 매개변수가 전달되면 사용법을 출력합니다 (예: python -h and python --help)

*nix 서버에 로그인한 후 처음 5개의 명령어는 무엇인가요?
  • w - 서버 가동 시간 등 유용한 정보가 많이 포함되어 있습니다.
  • top - 모든 실행 중인 프로세스를 확인하고 CPU, 메모리 사용량 등으로 정렬할 수 있습니다.
  • netstat - 서버가 어떤 포트와 IP에서 수신 중인지, 어떤 프로세스가 사용 중인지 확인합니다.
  • df - 파일 시스템이 사용 중인 디스크 공간의 양을 보고합니다.
  • history - 현재 연결된 사용자가 이전에 실행한 명령을 보여줍니다.

유용한 자료:

  • First 5 Commands When I Connect on a Linux Server (original)
ls -al 출력의 필드는 무엇을 의미하나요?

출력 순서:```bash -rwxrw-r-- 1 root root 2048 Jan 13 07:11 db.dump

root@kitploit:~
- 파일 권한,
- 링크 수,
- 소유자 이름,
- 소유자 그룹,
- 파일 크기,
- 마지막 수정 시간,
- 파일/디렉터리 이름

파일 권한은 다음과 같이 표시됩니다:

- 첫 번째 문자는 `-` 또는 `l` 또는 `d`이며, `d`는 디렉터리, `-`는 파일, `l`은 심볼릭 링크(또는 소프트 링크) - 특별한 파일 유형
- 세 개의 문자 집합이 세 번 반복되며, 소유자, 그룹 및 기타 사용자에 대한 권한을 나타냅니다:
  - `r` = 읽기 가능
  - `w` = 쓰기 가능
  - `x` = 실행 가능

예제 `-rwxrw-r--`에서 표시된 줄의 의미는 다음과 같습니다:

- 일반 파일 (`-`로 표시됨)
- 소유자가 읽기, 쓰기, 실행 가능 (`rwx`)
- 그룹이 읽기, 쓰기 가능, 실행 불가 (`rw-`)
- 기타 사용자가 읽기만 가능, 쓰기 및 실행 불가 (`r--`)

유용한 자료:

- [ls -al 출력의 필드는 무엇을 의미합니까? (원본)](https://unix.stackexchange.com/questions/103114/what-do-the-fields-in-ls-al-output-mean)

</details>

<details>
<summary><b>로그인한 사용자 목록을 어떻게 얻나요?</b></summary><br>

로그인한 사용자의 요약 정보를 보려면, 각 사용자 이름의 로그인, 사용자가 연결된 터미널, 로그인한 날짜/시간, 그리고 연결을 수행 중인 컴퓨터(가능한 경우)를 포함하여 다음을 입력하십시오:```bash
# It uses /var/run/utmp and /var/log/wtmp files to get the details.
who

포괄적인 정보를 보려면, 사용자 이름, 터미널, 소스 컴퓨터의 IP 주소, 로그인 시작 시간, 유휴 시간, 프로세스 CPU 주기, 작업 CPU 주기, 현재 실행 중인 명령을 포함하여 다음을 입력하십시오:```bash

It uses /var/run/utmp, and their processes /proc.

w

root@kitploit:~
마지막으로 로그인한 사용자 목록을 표시하는 것도 중요합니다. 다음을 입력하세요:```bash
# It uses /var/log/wtmp.
last

유용한 자료:

실행 중인 프로세스를 백그라운드에서 실행하는 장점은 무엇인가요? 어떻게 할 수 있나요?

백그라운드에서 실행 중인 프로세스를 실행하는 가장 큰 장점은 다른 프로세스가 백그라운드에서 실행되는 동안 동시에 다른 작업을 수행할 수 있다는 것입니다. 따라서 다른 프로세스에서 작업하는 동안 백그라운드에서 더 많은 프로세스를 완료할 수 있습니다. 명령 끝에 특수 문자 &를 추가하여 이를 수행할 수 있습니다.

일반적으로 실행 시간이 너무 길고 사용자 상호 작용이 필요하지 않은 애플리케이션은 백그라운드로 보내져 터미널에서 작업을 계속할 수 있습니다.

예를 들어 백그라운드에서 무언가를 다운로드하려면 다음과 같이 할 수 있습니다:```bash wget https://url-to-download.com/download.tar.gz &

root@kitploit:~
위 명령을 실행하면 다음과 같은 출력이 나타납니다:```bash
[1] 2203

여기서 1은 작업의 일련 번호이고 2203은 작업의 PID입니다. 다음 명령어를 사용하여 백그라운드에서 실행 중인 작업을 확인할 수 있습니다:```bash jobs

root@kitploit:~
백그라운드에서 작업을 실행하면 작업의 PID가 제공됩니다. 다음 명령을 사용하여 백그라운드에서 실행 중인 작업을 종료할 수 있습니다:```bash
kill PID

PID를 작업의 PID로 바꾸십시오. 실행 중인 작업이 하나뿐이라면 다음을 사용하여 포그라운드로 가져올 수 있습니다:```bash fg

root@kitploit:~
백그라운드에서 여러 작업이 실행 중인 경우 다음을 사용하여 원하는 작업을 포그라운드로 가져올 수 있습니다:```bash
fg %#

#을 작업의 일련 번호로 바꾸세요.

유용한 자료:

  • How do I run a Unix process in the background?
  • Job Control Commands
  • What is/are the advantage(s) of running applications in background?
프로세스를 관리하려면 먼저 식별할 수 있어야 합니다. 어떤 도구를 사용하시겠습니까? ***

작성 예정입니다.

명령을 root 사용자로 실행합니다. 이것은 좋은 방법인가요 나쁜 방법인가요?

(모든 것을) root로 실행하는 것은 나쁩니다. 그 이유는:

  • 어리석음: 부주의한 실수를 막을 수 있는 것이 아무것도 없습니다. 시스템을 잠재적으로 해롭게 변경하려면 sudo를 사용해야 하며, 이는 (비밀번호를 입력하는 동안) 실수하지 않도록 일시 중지를 보장합니다.

  • 보안: 관리자 사용자의 로그인 계정을 모르면 해킹하기 어렵습니다. root는 이미 관리자 자격 증명의 절반을 확보한 것과 같습니다.

  • 실제로 필요하지 않습니다: 여러 명령을 root로 실행해야 하고 sudo가 만료될 때마다 비밀번호를 여러 번 입력하는 것이 불편하다면 sudo -i를 하면 root가 됩니다. 파이프를 사용하여 명령을 실행하고 싶으신가요? 그렇다면 sudo sh -c "command1 | command2"를 사용하세요.

  • 복구 콘솔에서 항상 사용할 수 있습니다: 복구 콘솔을 사용하면 큰 실수를 복구하거나 (여전히 sudo로 실행해야 했던) 앱으로 인한 문제를 해결할 수 있습니다. 이 경우 Ubuntu에는 root 계정에 대한 비밀번호가 없지만, 온라인에서 변경 방법을 검색할 수 있습니다. 그러면 물리적 접근 권한이 있는 사람이 해를 끼치기 더 어려워집니다.

유용한 자료:

  • Why is it bad to log in as root? (원본)
  • What's wrong with always being root?
  • Why you should avoid running applications as root
메모리 통계와 CPU 통계를 확인하는 방법은 무엇인가요?

둘 다 top/htop을 사용합니다. free와 vmstat 명령을 사용하여 각각 물리적 메모리와 가상 메모리 통계를 표시할 수 있습니다. sar 명령을 사용하면 CPU 사용률 및 기타 통계를 볼 수 있습니다 (하지만 대부분의 시스템에 sar이 설치되어 있지 않습니다).

유용한 자료:

  • How do I Find Out Linux CPU Utilization?
  • 16 Linux server monitoring commands you really need to know
로드 평균(load average)이란 무엇인가요?

Linux 로드 평균은 실행 중인 스레드(작업)가 시스템에 요구하는 평균 수를 나타내는 "시스템 로드 평균"으로, 실행 중인 스레드와 대기 중인 스레드의 평균 개수입니다. 이는 시스템이 현재 처리 중인 양보다 더 클 수 있는 수요를 측정합니다. 대부분의 도구는 1분, 5분, 15분에 대한 세 가지 평균을 표시합니다.

이 세 숫자는 다른 CPU에 대한 숫자가 아닙니다. 이 숫자는 주어진 시간(최근 1분, 5분, 15분) 동안의 로드 숫자의 평균값입니다.

로드 평균은 일반적으로 "실행 큐의 평균 길이"로 설명됩니다. 따라서 CPU를 많이 사용하는 몇 개의 프로세스나 스레드가 로드 평균을 1 이상으로 올릴 수 있습니다. 로드 평균이 총 CPU 코어 수보다 작으면 문제가 없습니다. 하지만 CPU 수보다 높아지면 일부 스레드/프로세스가 큐에서 대기하며 실행 준비가 되었지만 여유 CPU를 기다리게 됨을 의미합니다.

이는 여러 기간에 걸쳐 평균을 낸 시스템 상태에 대한 아이디어를 제공하기 위한 것입니다. 평균값이므로 시스템에 높은 부하가 가해진 후 0으로 돌아가는 데 시간이 걸립니다.

일부 해석:

  • 평균이 0.0이면 시스템이 유휴 상태입니다.
  • 1분 평균이 5분 또는 15분 평균보다 높으면 부하가 증가하고 있습니다.
  • 1분 평균이 5분 또는 15분 평균보다 낮으면 부하가 감소하고 있습니다.
  • CPU 수보다 높으면 성능 문제가 있을 수 있습니다 (상황에 따라 다름).

유용한 자료:

  • Linux Load Averages: Solving the Mystery (원본)
  • Linux load average - the definitive summary
  • How CPU load averages work (and using them to triage webserver performance!)
Linux/Unix에서 내 비밀번호는 어디에 저장되나요?

비밀번호는 시스템에 전혀 저장되지 않습니다. /etc/shadow에 저장되는 것은 비밀번호의 소위 해시입니다.

텍스트의 해시는 텍스트(비밀번호)에 소위 단방향 함수를 수행하여 생성되므로 확인할 문자열이 생성됩니다. 설계상 이 과정을 역전시키는 것은 "불가능"(계산적으로 실행 불가능)합니다.

오래된 Unix 변형은 각 계정에 대한 다른 정보와 함께 암호화된 비밀번호를 /etc/passwd에 저장했습니다.

최신 변형은 /etc/passwd의 해당 필드에 단순히 *를 넣고 비밀번호를 저장하는 데 /etc/shadow를 사용합니다. 이는 부분적으로 다른 정보만 필요한 사용자가 비밀번호에 읽기 접근 권한을 얻지 못하도록 하기 위함입니다 (shadow는 일반적으로 passwd보다 더 강력하게 보호됩니다).

자세한 내용은 man crypt, man shadow, man passwd를 참조하십시오.

유용한 자료:

  • Where is my password stored on Linux?
  • Where are the passwords of the users located in Linux?
  • Linux Password & Shadow File Formats
디렉토리(파일 제외)와 파일(디렉토리 제외)에 대해 재귀적으로 권한을 변경하는 방법은 무엇인가요?

모든 디렉토리를 예를 들어 755 (drwxr-xr-x)로 변경하려면:```bash find /opt/data -type d -exec chmod 755 {} ;

root@kitploit:~
모든 파일을 예를 들어 **644** (`-rw-r--r--`)로 변경하려면:```bash
find /opt/data -type f -exec chmod 644 {} \;

유용한 리소스:

  • 폴더와 모든 하위 폴더 및 파일에 대해 chmod를 설정하는 방법 (원본)
모든 명령이 command not found 오류와 함께 실패합니다. 오류의 원인을 추적하고 해결하는 방법은 무엇입니까?

일부 시점에서 기본 PATH 환경 변수를 덮어쓰고 있는 것으로 보입니다. 발생한 오류 유형은 PATH에 예를 들어 명령어(bash 포함)가 위치한 /bin이 포함되어 있지 않음을 나타냅니다.

bash 스크립트나 명령을 디버깅하기 시작하는 한 가지 방법은 -x 옵션을 사용하여 서브셸을 시작하는 것입니다:```bash bash --login -x

root@kitploit:~
이것은 해당 셸을 시작할 때 실행되는 모든 명령어와 그 인수를 보여줍니다.

또한 `PATH` 변수 값 표시도 매우 유용합니다:```bash
echo $PATH

이것을 실행하면:```bash PATH=/bin:/sbin:/usr/bin:/usr/sbin

root@kitploit:~
대부분의 명령이 정상 작동할 것입니다. 그런 다음 `~/.bash_profile`을 `~/.bashrc` 대신 편집하고 `PATH`를 초기화시키는 부분을 수정하면 됩니다. **root** 및 다른 사용자의 기본 `PATH` 변수 값은 `/etc/profile` 파일에 있습니다.

유용한 자료:

- [PATH에 경로를 올바르게 추가하는 방법?](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path)

</details>

<details>
<summary><b>`CTRL + C`를 입력했는데도 스크립트가 계속 실행됩니다. 어떻게 중지하나요?</b></summary><br>

대부분의 경우 `CTRL + C` 키보드 조합을 사용하여 실행 중인 스크립트를 중지할 수 있습니다. 이는 스크립트에 인터럽트 신호(SIGINT)를 보내 실행을 종료합니다. 이 방법이 작동하지 않고 스크립트가 계속 실행 중이라면 `CTRL + \` 조합을 사용해 보세요. 이 조합은 스크립트에 종료 신호(SIGQUIT)를 보내 즉시 종료될 수 있습니다.

또는 터미널이나 명령줄 인터페이스를 사용 중이라면 `kill` 명령을 사용하여 스크립트 프로세스에 신호를 보낼 수 있습니다. `ps` 또는 `top` 명령을 사용하여 스크립트의 프로세스 ID(PID)를 찾은 다음 `kill` 명령에 PID를 사용하여 스크립트를 중지하세요.

일부 경우에는 스크립트가 멈추거나 응답하지 않아 일반 `kill` 명령이 작동하지 않을 수 있으므로 `kill -9` 명령을 사용하여 강제로 중지해야 할 수 있습니다. `-9` 옵션은 SIGKILL 신호를 보내 프로세스가 즉시 중지되도록 강제합니다.
</details>

<details>
<summary><b>`grep` 명령어란 무엇인가요? 같은 줄에서 여러 문자열을 일치시키는 방법은?</b></summary><br>

`grep` 유틸리티는 `egrep` 및 `fgrep`을 포함하는 Unix 도구 계열입니다.

`grep`은 파일 패턴을 검색합니다. 다른 명령의 출력에서 특정 패턴을 찾고 있다면 `grep`이 관련 줄을 강조 표시합니다. 로그 파일, 특정 프로세스 등을 검색할 때 이 `grep` 명령을 사용하세요.

여러 문자열을 일치시키려면:```bash
grep -E "string1|string2" filename
여러 셸 명령어를 한 줄에서 조합하여 실행하기

각 명령어가 이전 명령어가 성공했을 때만 실행되도록 하려면 && 연산자를 사용하여 조합하세요:```bash cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install

root@kitploit:~
명령어 중 하나가 실패하면, 그 뒤에 오는 모든 다른 명령어는 실행되지 않습니다.

이전 명령어들이 실패했든 안 했든 모든 명령어를 실행하려면, 세미콜론으로 구분하십시오:```bash
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install

당신의 경우에는 다음 명령의 실행이 이전 명령의 성공에 의존하는 첫 번째 경우를 원한다고 생각합니다.

모든 명령을 스크립트에 넣고 대신 실행할 수도 있습니다:```bash #! /bin/sh cd /my_folder
&& rm *.jar
&& svn co path to repo
&& mvn compile package install

root@kitploit:~
유용한 자료:

- [여러 리눅스 명령어를 한 줄로 결합하여 실행하기 (원본)](https://stackoverflow.com/questions/13077241/execute-combine-multiple-linux-commands-in-one-line)

</details>

<details>
<summary><b>다른 권한에 영향을 주지 않고 모든 사용자에게 파일 실행 권한을 부여하려면 <code>chmod</code>에 어떤 기호 표현을 전달해야 하나요?</b></summary><br>```bash
chmod a+x /path/to/file
  • a - 모든 사용자
  • x - 실행 권한
  • r - 읽기 권한
  • w - 쓰기 권한

유용한 리소스:

  • chmod를 사용한 파일 권한 설정 방법
  • chmod +x your_file_name은 무엇을 하며, 어떻게 사용하나요?
두 개의 로컬 디렉토리를 동기화하려면 어떻게 해야 하나요?

같은 시스템에서 dir1의 내용을 dir2로 동기화하려면 다음을 입력하세요:```bash rsync -av --progress --delete dir1/ dir2

root@kitploit:~
- `-a`, `--archive` - 보관 모드
- `--delete` - 대상 디렉토리에서 불필요한 파일 삭제
- `-v`, `--verbose` - 자세한 모드 (상세 수준 증가)
- `--progress` - 전송 중 진행 상황 표시

유용한 자료:

- [두 로컬 디렉토리를 동기화하는 방법? (원본](https://unix.stackexchange.com/questions/392536/how-can-i-sync-two-local-directories)
- [rsync로 폴더 동기화](https://www.jveweb.net/en/archives/2010/11/synchronizing-folders-with-rsync.html)

</details>

<details>
<summary><b>많은 기본 유지보수 작업에서는 설정 파일을 편집해야 합니다. 변경 사항을 취소하는 방법을 설명하세요.</b></summary><br>

- 편집 전에 파일을 수동으로 백업 (중괄호 확장 사용 예: `cp filename{,.orig}`)
- 파일이 저장된 디렉토리 구조를 수동 복사 (예: `cp`, `rsync` 또는 `tar`)
- 편집기에서 원본 파일 백업 (예: 편집기 설정 파일에 규칙 설정)
- 가장 좋은 방법은 `git`(또는 다른 버전 관리 시스템)을 사용하여 설정 파일을 추적하는 것입니다 (예: `/etc` 디렉토리용 `etckeeper`)

유용한 자료:

- [파일 이름 확장자 앞에 .bak으로 백업 파일 생성](https://unix.stackexchange.com/questions/66376/backup-file-with-bak-before-filename-extension)
- [설정 파일 버전 관리를 위해 git을 사용하는 것이 좋은 생각인가요?](https://superuser.com/questions/1037211/is-it-a-good-idea-to-use-git-for-configuration-file-version-controlling)

</details>

<details>
<summary><b>20MB보다 큰 모든 파일을 찾아야 합니다. 어떻게 찾나요?</b></summary><br>```bash
find / -type f -size +20M

유용한 자료:

  • x바이트보다 크거나 작은 파일을 찾는 방법은?
왜 sudo su -를 사용하고 sudo su를 사용하지 않나요?

sudo는 대부분의 최신 Linux 배포판에 있으며, (항상 그런 것은 아니지만) root 사용자가 비활성화되어 있고 비밀번호가 설정되어 있지 않습니다. 따라서 su로 root 사용자로 전환할 수 없습니다(시도는 가능하지만). root 권한으로 sudo를 호출해야 합니다: sudo su.

su는 사용자만 전환하며, 이전 사용자와 거의 동일한 환경의 일반 셸을 제공합니다.

su -는 사용자 전환 후 로그인 셸을 호출합니다. 로그인 셸은 대부분의 환경 변수를 초기화하여 깨끗한 기반을 제공합니다.

유용한 자료:

  • su vs sudo -s vs sudo -i vs sudo bash
  • 왜 su -를 사용하고 su를 사용하지 않나요? (원본)
지난 60분 동안 시스템에서 수정된 파일을 찾는 방법?
```bash find / -mmin -60 -type f ``` 유용한 자료:
  • 최근 30일 동안 디렉토리에서 수정된 모든 파일 가져오기 (원본)
오래된 로그 파일을 유지하는 주요 이유는 무엇인가요?

시스템의 문제를 조사하는 데 필수적입니다. 로그 관리는 IT 보안에 있어 절대적으로 중요합니다.

서버, 방화벽 및 기타 IT 장비는 중요한 이벤트와 트랜잭션을 기록하는 로그 파일을 유지합니다. 이 정보는 네트워크 내부 및 외부에서 발생하는 적대적 활동에 대한 중요한 단서를 제공할 수 있습니다. 로그 데이터는 구성 문제 및 하드웨어 오류를 포함한 장비 문제를 식별하고 해결하는 데 필요한 정보도 제공할 수 있습니다.

이는 사용자가 귀하의 사이트에 방문한 사람, 방문 시간 및 정확히 어떤 내용을 보았는지에 대한 서버의 기록입니다. 매우 상세하게 다음을 보여줍니다:

  • 방문자의 출처
  • 사용한 브라우저
  • 정확히 열어본 파일
  • 각 파일을 로드하는 데 걸린 시간
  • 그리고 기타 여러 기술적인 정보

고려해야 할 요소:

  • 보존 또는 삭제에 대한 법적 요구사항
  • 보존 및 삭제에 대한 회사 정책
  • 로그가 유용한 기간
  • 로그에서 얻고자 하는 질문
  • 로그가 차지하는 공간

로그를 수집하고 분석함으로써 네트워크 내에서 어떤 일이 발생하는지 이해할 수 있습니다. 각 로그 파일에는 특히 읽고 분석하는 방법을 알고 있다면 매우 귀중한 정보가 많이 포함되어 있습니다.

유용한 자료:

  • 로그 파일을 얼마나 오래 보관하나요?
증분 백업(Incremental Backup)이란 무엇인가요?

증분 백업은 이전 백업 이후 변경된 파일만 복사하는 백업 유형입니다.

유용한 자료:

  • 증분 백업이란 무엇인가요?
RAID란 무엇인가요? RAID0, RAID1, RAID5, RAID6, RAID10은 무엇인가요?

RAID(Redundant Array of Inexpensive Disks)는 데이터 스토리지의 성능 및/또는 안정성을 높이기 위해 사용되는 기술입니다.

  • RAID0: 디스크 **스트라이핑(Striping)**이라고도 하며, 파일을 분할하여 RAID 그룹의 모든 디스크 드라이브에 데이터를 분산시키는 기술입니다. 장애에 대한 보호 기능이 없습니다.
  • RAID1: 두 드라이브에 동일한 데이터를 기록하여 안전성을 높이는 널리 사용되는 디스크 서브시스템입니다. "미러링(Mirroring)"이라고 하며, RAID 1은 쓰기 성능을 향상시키지 않지만 읽기 성능은 각 디스크 성능의 합과 같을 수 있습니다. 그러나 하나의 드라이브에 장애가 발생하면 두 번째 드라이브가 사용되며 장애가 발생한 드라이브는 수동으로 교체됩니다. 교체 후 RAID 컨트롤러는 작동 중인 드라이브의 내용을 새 드라이브에 복제합니다.
  • RAID5: 패리티 데이터를 계산하여 안전성을 높이고 세 개 이상의 드라이브에 데이터를 인터리빙(스트라이핑)하여 속도를 높이는 디스크 서브시스템입니다. 단일 드라이브 장애 시 분산 패리티로부터 후속 읽기를 계산하여 데이터 손실이 없습니다.
  • RAID6: RAID 6은 RAID 5를 확장하여 추가 패리티 블록을 하나 더 추가합니다. 최소 4개의 디스크가 필요하며 두 개의 동시 디스크 장애에도 읽기 및 쓰기를 계속 수행할 수 있습니다. RAID 6은 읽기 작업에 성능 저하가 없지만 패리티 계산과 관련된 오버헤드로 인해 쓰기 작업에 성능 저하가 있습니다.
  • RAID10: RAID 1+0이라고도 하며, 데이터를 보호하기 위해 디스크 미러링과 디스크 스트라이핑을 결합한 RAID 구성입니다. 최소 4개의 디스크가 필요하며 미러링된 쌍에 데이터를 스트라이핑합니다. 각 미러링된 쌍에서 하나의 디스크만 작동하면 데이터를 검색할 수 있습니다. 동일한 미러링된 쌍의 두 디스크에 장애가 발생하면 스트라이프 세트에 패리티가 없으므로 모든 데이터가 손실됩니다.

유용한 자료:

  • RAID
사용자의 기본 그룹은 어떻게 결정되나요? 어떻게 변경하나요?
```bash useradd -m -g initial_group username ``` `-g/--gid`: 사용자의 초기 로그인 그룹 이름 또는 번호를 정의합니다. 지정된 경우 그룹 이름이 존재해야 하며, 그룹 번호가 제공된 경우 이미 존재하는 그룹을 참조해야 합니다.

지정되지 않은 경우, useradd의 동작은 /etc/login.defs에 포함된 USERGROUPS_ENAB 변수에 따라 달라집니다. 기본 동작(USERGROUPS_ENAB yes)은 사용자 이름과 동일한 이름의 그룹을 생성하며, GID는 UID와 같습니다.

유용한 자료:

  • Linux에서 사용자의 기본 그룹을 변경하는 방법은 무엇인가요?
일상 작업 및 스크립팅에 가장 적합한 명령줄 텍스트 편집기는 무엇인가요? ***

추가 예정.

서버를 랙에 장착하려는 이유는 무엇인가요?
  • 하드웨어 보호
  • 적절한 냉각
  • 정리된 작업 공간
  • 더 나은 전원 관리
  • 더 깨끗한 환경

유용한 자료:

  • PC를 랙마운트해야 하는 5가지 이유
네트워크 질문 (23)
간단한 네트워크 다이어그램을 그려 주세요: 20대의 시스템, 1개의 라우터, 4개의 스위치, 5개의 서버, 작은 IP 블록이 있습니다. ***

추가 예정.

OSI(또는 다른) 모델에 대해 이해해야 할 가장 중요한 점은 무엇인가요?

OSI(또는 다른) 모델에 대해 이해해야 할 가장 중요한 점은 다음과 같습니다:

  • 프로토콜을 계층으로 나눌 수 있습니다.
  • 계층은 캡슐화를 제공합니다.
  • 계층은 추상화를 제공합니다.
  • 계층은 다른 기능과의 결합을 분리합니다.

유용한 자료:

  • OSI 모델과 네트워킹 프로토콜 관계
VLAN과 서브넷의 차이점은 무엇인가요? 서브넷을 설정하려면 VLAN이 필요한가요?

VLAN과 서브넷은 서로 다른 문제를 해결합니다. VLAN은 레이어 2에서 작동하여 브로드캐스트 도메인 등을 변경합니다. 반면 서브넷은 현재 맥락에서 레이어 3에 해당합니다.

서브넷 - 주소의 일부(종종 네트워크 주소라고 함)와 서브넷 마스크(넷마스크)에 의해 결정되는 IP 주소 범위입니다. 예를 들어, 넷마스크가 255.255.255.0(또는 간단히 /24)이고 네트워크 주소가 192.168.10.0인 경우, 이는 192.168.10.0부터 192.168.10.255까지의 IP 주소 범위를 정의합니다. 이를 줄여서 192.168.10.0/24로 표기합니다.

VLAN - 이를 "스위치 분할"로 생각하는 것이 좋습니다. VLAN 기능이 있는 8포트 스위치가 있다고 가정해 보겠습니다. 4개의 포트를 하나의 VLAN(예: VLAN 1)에 할당하고, 다른 4개의 포트를 다른 VLAN(예: VLAN 2)에 할당할 수 있습니다. VLAN 1은 VLAN 2의 트래픽을 볼 수 없고 그 반대도 마찬가지이며, 논리적으로는 이제 두 개의 별도 스위치를 가진 것입니다. 일반적으로 스위치에서 해당 MAC 주소를 본 적이 없으면 모든 다른 포트로 트래픽을 "플러딩"합니다. VLAN은 이를 방지합니다.

서브넷은 레이어 2 및 3을 통해 호스트가 통신할 수 있도록 도와주는 IP 주소 범위에 불과합니다. 각 서브넷에 자체 VLAN이 필요하지는 않습니다. VLAN은 격리(레이어 2 통신을 위한 샌드박스, 서로 다른 의 두 시스템은 통신할 수 없지만 을 통해 가능), 관리 용이성 및 보안을 위해 구현됩니다.

알아야 할 5가지 일반적인 네트워크 포트를 나열해 보세요.
POP과 IMAP이 무엇이며, 어떤 것을 구현해야 할지 어떻게 선택하나요?

POP과 IMAP은 모두 메일 서버에서 메일 클라이언트로 메시지를 검색하기 위한 프로토콜입니다.

POP(Post Office Protocol)은 메일 서버에서 클라이언트로의 단방향 푸시를 사용합니다. 기본적으로 메시지를 POP 메일 클라이언트로 보내고 메일 서버에서 제거하지만, 메일 서버에서 모든 메시지를 유지하도록 구성할 수 있습니다. 메일 클라이언트에서 메시지에 대해 수행하는 작업(레이블 지정, 삭제, 폴더 이동)은 메일 서버에 반영되지 않으므로, 메일 서버에서 가져오는 다른 메일 클라이언트에서는 접근할 수 없습니다. POP은 메일 서버의 저장 공간을 거의 사용하지 않으며, 메시지가 메일 서버와 여러 클라이언트 대신 한 메일 클라이언트에만 존재하므로 더 안전한 것으로 간주될 수 있습니다.

IMAP(Internet Message Access Protocol)은 메일 서버와 클라이언트 간의 양방향 통신을 사용합니다. IMAP으로 구성된 메일 클라이언트에서 메시지를 삭제하거나 레이블을 지정하면 메일 서버에서도 메시지가 삭제되거나 레이블이 지정됩니다. IMAP은 여러 클라이언트나 장치에서 동일한 상태로 메시지를 유지할 수 있으므로 다양한 장치에서 이메일에 접근할 때 유사한 경험을 제공합니다. IMAP은 메시지를 선택적으로 동기화하고, 필요에 따라 나중에 메일 서버에서 동기화할 수 있도록 메일 클라이언트에서 오래된 메시지를 삭제하여 메일 클라이언트의 디스크 공간을 절약할 수도 있습니다.

여러 장치에서 메시지에 접근해야 하고 클라이언트 장치의 디스크 공간을 절약하려면 IMAP을 선택하세요. 메일 서버의 디스크 공간을 절약하고, 한 클라이언트 장치에서만 메시지에 접근하며, 메시지가 여러 시스템에 존재하지 않도록 하려면 POP을 선택하세요.

기본 경로 및 라우팅 테이블을 어떻게 확인하나요?

netstat -nr, route -n 또는 ip route show 명령어를 사용하여 기본 경로와 라우팅 테이블을 확인할 수 있습니다.

유용한 자료:

  • 리눅스에서 경로(라우팅 테이블) 확인 방법
  • FreeBSD 기본 경로/게이트웨이 설정
127.0.0.1과 localhost의 차이점은 무엇인가요?

가장 큰 차이점은 아마도 여전히 어딘가에서 localhost에 대한 실제 조회를 수행해야 한다는 점일 것입니다.

127.0.0.1을 사용하면 (지능적인) 소프트웨어는 이를 직접 IP 주소로 변환하여 사용합니다. 일부 gethostbyname 구현은 점으로 구분된 형식(그리고 아마도 이에 상응하는 IPv6 형식)을 감지하여 조회를 전혀 수행하지 않습니다.

그렇지 않으면 이름을 확인해야 합니다. 그리고 해당 확인에 호스트 파일이 실제로 사용된다는 보장은 없습니다(첫 번째로 사용되거나 전혀 사용되지 않을 수도 있음). 따라서 localhost는 완전히 다른 IP 주소가 될 수 있습니다.

즉, 일부 시스템에서는 로컬 호스트 파일을 우회할 수 있습니다. Linux(및 다른 많은 Unix 계열 시스템)에서는 host.conf 파일이 이를 제어합니다.

Unix 도메인 소켓을 사용하면 TCP/IP를 사용하는 것보다 약간 더 빠릅니다(오버헤드가 적기 때문). Windows는 기본적으로 TCP/IP를 사용하는 반면, Linux는 localhost를 선택하면 Unix 도메인 소켓을 사용하고 127.0.0.1을 사용하면 TCP/IP를 사용하려고 시도합니다.

유용한 자료:

  • 127.0.0.1과 localhost의 차이점은 무엇인가요?
  • localhost vs. 127.0.0.1
ping 명령어는 어떤 포트를 사용하나요?

ping은 ICMP, 특히 ICMP echo request 및 ICMP echo reply 패킷을 사용합니다. ICMP에는 '포트'가 없습니다. 포트는 두 가지 IP 전송 계층 프로토콜인 TCP와 UDP와 관련됩니다. ICMP, TCP, UDP는 "형제"입니다. 서로 기반하지 않고 IP 위에서 실행되는 세 가지 별도의 프로토콜입니다.

ICMP 패킷은 IP 데이터그램 헤더의 '프로토콜' 필드로 식별됩니다. ICMP는 UDP나 TCP 통신 서비스를 사용하지 않으며, 원시 IP 통신 서비스를 사용합니다. 즉, ICMP 메시지는 IP 데이터그램 데이터 필드에 직접 전달됩니다. raw는 소프트웨어에서의 구현 방식에서 비롯됩니다. ICMP 메시지를 생성하고 보내려면 raw 소켓을 열고, ICMP 메시지를 포함하는 버퍼를 만든 다음, 메시지가 포함된 버퍼를 원시 소켓에 씁니다.

ICMP의 IP 프로토콜 값은 1입니다. 프로토콜 필드는 IP 헤더의 일부이며 IP 데이터그램의 데이터 부분에 무엇이 있는지 식별합니다.

그러나 nmap을 사용하여 포트가 열려 있는지 확인할 수 있습니다:```bash nmap -p 80 example.com

root@kitploit:~
유용한 리소스:

- [Ping 포트 번호](https://networkengineering.stackexchange.com/questions/42463/ping-port-number)
- [주소:포트로 ping이 가능한가요?](https://superuser.com/questions/769541/is-it-possible-to-ping-an-addressport)

</details>

<details>
<summary><b>서버 A가 서버 B와 통신할 수 없습니다. 몇 단계로 가능한 이유를 설명하세요.</b></summary><br>

서버 간 통신 문제를 해결하려면 이상적으로 TCP/IP 스택을 따르는 것이 좋습니다:

1. **애플리케이션 계층**: 두 서버에서 서비스가 실행 중이고 정상 작동 중인가요? 올바르게 구성되었나요 (예: 올바른 IP와 올바른 포트에 바인딩)? 애플리케이션 및 시스템 로그에 의미 있는 오류가 표시되나요?

2. **전송 계층**: 애플리케이션이 사용하는 포트가 열려 있나요 (telnet 시도!)? 서버에 ping이 가능한가요?

3. **네트워크 계층**: 네트워크 또는 OS에 방화벽이 올바르게 구성되어 있나요? IP 스택이 올바르게 구성되었나요 (IP, 라우트, DNS 등)? 스위치와 라우터가 작동 중인가요 (ARP 테이블 확인!)?

4. **물리 계층**: 서버가 네트워크에 연결되어 있나요? 패킷 손실이 발생하나요?

</details>

<details>
<summary><b>왜 서버에서 호스트 이름이 확인되지 않나요? 이 문제를 해결하세요. ***</b></summary><br>

완료 예정.

</details>

<details>
<summary><b>CLI를 사용하여 (외부 DNS를 사용하여) 도메인 이름을 확인하는 방법은? IP를 도메인 이름으로 확인할 수 있나요?</b></summary><br>

IP 주소를 도메인 이름으로 확인하는 예시:```bash
# with host command:
host domain.com 8.8.8.8

# with dig command:
dig @9.9.9.9 google.com

# with nslookup command:
nslookup domain.com 8.8.8.8
telnet 또는 nc로 포트 연결을 테스트하는 방법은?
```bash # with telnet command: telnet code42.example.com 5432

with nc (netcat) command:

nc -vz code42.example.com 5432

root@kitploit:~
</details>

<details>
<summary><b>왜 `telnet`을 사용하여 시스템을 원격으로 관리하는 것을 피해야 하나요?</b></summary><br>

최신 운영체제는 기본적으로 잠재적으로 안전하지 않은 모든 서비스를 비활성화했습니다. 반면, 일부 네트워크 장치 공급업체는 여전히 telnet 프로토콜을 사용한 통신 설정을 허용합니다.

**Telnet**은 가장 안전하지 않은 통신 방식을 사용합니다. 네트워크를 통해 데이터를 일반 텍스트 형식으로 전송하므로 누구나 네트워크 도구를 사용하여 쉽게 비밀번호를 알아낼 수 있습니다.

**Telnet**의 경우 로그인 자격 증명이 일반 텍스트로 전송되는데, 이는 네트워크에서 스니퍼를 실행하는 사람이 **Telnet** 로그인 세션을 도청하여 몇 초 만에 장치를 제어하는 데 필요한 정보를 찾을 수 있음을 의미합니다.

유용한 자료:

- [Telnet 및 SSH를 안전한 대안으로](https://www.ssh.com/ssh/telnet)
- [특정 포트의 IP 주소로 텔넷하는 방법](https://superuser.com/questions/339107/how-to-telnet-to-an-ip-address-on-a-specific-port)

</details>

<details>
<summary><b>`wget`과 `curl`의 차이점은 무엇인가요?</b></summary><br>

주요 차이점은 다음과 같습니다: `wget`이 `curl`에 비해 가지는 주요 강점은 재귀적으로 다운로드할 수 있는 기능입니다. `wget`은 명령줄 전용입니다. `curl`은 FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP, RTMP 및 RTSP를 지원합니다.

유용한 자료:

- [curl과 wget의 차이점은 무엇인가요? (원본)](https://unix.stackexchange.com/questions/47434/what-is-the-difference-between-curl-and-wget)

</details>

<details>
<summary><b>SSH란 무엇이며 어떻게 작동하나요?</b></summary><br>

**SSH**는 **Secure Shell**의 약자입니다. 서버 "A"에서 서버 "B"의 셸 세션으로 이동할 수 있게 해주는 프로토콜입니다. 서버 "B"와 상호작용할 수 있습니다.

**SSH** 연결을 설정하려면 원격 머신(서버 A)에서 **SSH** 데몬이라는 소프트웨어가 실행 중이어야 하며, 사용자의 컴퓨터(서버 B)에는 **SSH** 클라이언트가 있어야 합니다.

**SSH** 데몬과 **SSH** 클라이언트는 특정 네트워크 포트(기본값 22)에서 연결을 수신 대기하고, 연결 요청을 인증하며, 사용자가 올바른 자격 증명을 제공하면 적절한 환경을 생성합니다.

유용한 자료:

- [SSH 암호화 및 연결 프로세스 이해하기](https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process)

</details>

<details>
<summary><b>대부분의 튜토리얼은 비밀번호 인증보다 SSH 키 인증을 권장합니다. 왜 더 안전한 것으로 여겨지나요?</b></summary><br>

**SSH 키**는 SSH 프로토콜의 접근 자격 증명입니다. 사용자 이름 및 비밀번호와 기능이 유사하지만, 키는 주로 자동화된 프로세스와 시스템 관리자 및 고급 사용자에 의한 단일 로그온 구현에 사용됩니다.

사용자의 비밀번호를 요구하는 대신, 공개 키와 개인 키를 사용하는 비대칭 암호화 알고리즘을 통해 클라이언트의 신원을 확인할 수 있습니다.

SSH 서비스가 공개 키 인증만 허용하는 경우, 공격자는 서버에 저장된 공개 키에 해당하는 개인 키의 사본이 필요합니다.

SSH 서비스가 비밀번호 기반 인증을 허용하는 경우, 인터넷에 연결된 SSH 서버는 사용자 이름과 비밀번호를 추측하려는 봇넷에 의해 밤낮으로 공격을 받게 됩니다. 봇넷은 어떤 정보도 필요 없이 인기 있는 이름과 비밀번호만 시도하면 됩니다. 다른 문제 외에도 로그가 막히게 됩니다.

유용한 자료:

- [키 기반 인증 (공개 키 인증)](http://www.crypto-it.net/eng/tools/key-based-authentication.html)
- [SSH 비밀번호 vs 키 인증](https://security.stackexchange.com/questions/33381/ssh-password-vs-key-authentication)

</details>

<details>
<summary><b>패킷 필터란 무엇이며 어떻게 작동하나요?</b></summary><br>

**패킷 필터링**은 발신 및 수신 패킷을 모니터링하고, 소스 및 대상 인터넷 프로토콜(IP) 주소, 프로토콜 및 포트에 기반하여 패킷을 통과시키거나 차단함으로써 네트워크 접근을 제어하는 방화벽 기술입니다.

패킷 필터링은 보안 요구 사항이 적당한 경우에 적합합니다. 많은 조직의 내부(사설) 네트워크는 세분화되어 있지 않습니다. 조직의 한 부분을 다른 부분과 격리하기 위해 고도로 정교한 방화벽이 필요하지는 않습니다.

그러나 실험실 또는 실험용 네트워크로부터 프로덕션 네트워크를 어느 정도 보호하는 것이 현명합니다. 패킷 필터링 장치는 한 서브넷을 다른 서브넷으로부터 격리하는 데 매우 적절한 조치입니다.

TCP/IP 프로토콜 스택의 네트워크 계층 및 전송 계층에서 작동하며, 각 패킷이 프로토콜 스택에 진입할 때 검사됩니다. 네트워크 및 전송 헤더는 다음 정보에 대해 면밀히 검사됩니다:

- **프로토콜 (IP 헤더, 네트워크 계층)** - IP 헤더에서 바이트 9(바이트 카운트는 0부터 시작함)는 패킷의 프로토콜을 식별합니다. 대부분의 필터 장치는 TCP, UDP, ICMP를 구분할 수 있습니다.
- **소스 주소 (IP 헤더, 네트워크 계층)** - 소스 주소는 패킷을 생성한 호스트의 32비트 IP 주소입니다.
- **대상 주소 (IP 헤더, 네트워크 계층)** - 대상 주소는 패킷이 향하는 호스트의 32비트 IP 주소입니다.
- **소스 포트 (TCP 또는 UDP 헤더, 전송 계층)** - TCP 또는 UDP 네트워크 연결의 각 끝은 포트에 바인딩됩니다. TCP 포트는 UDP 포트와 별개입니다. 1024 미만의 포트는 예약되어 있으며 특정 용도로 사용됩니다. 1024 이상(포함)의 포트는 임시 포트로 알려져 있습니다. 공급업체가 선택한 대로 사용할 수 있습니다. "잘 알려진" 포트 목록은 RFC1700을 참조하십시오. 소스 포트는 의사 난수로 할당된 임시 포트 번호입니다. 따라서 소스 포트를 기반으로 필터링하는 것은 종종 유용하지 않습니다.
- **대상 포트 (TCP 또는 UDP 헤더, 전송 계층)** - 대상 포트 번호는 패킷이 전송되는 포트를 나타냅니다. 대상 호스트의 각 서비스는 포트를 수신 대기합니다. 필터링될 수 있는 잘 알려진 포트로는 20/TCP 및 21/TCP (FTP 연결/데이터), 23/TCP (텔넷), 80/TCP (HTTP), 53/TCP (DNS 영역 전송) 등이 있습니다.
- **연결 상태 (TCP 헤더, 전송 계층)** - 연결 상태는 패킷이 네트워크 세션의 첫 번째 패킷인지 여부를 알려줍니다. TCP 헤더의 ACK 비트가 "false" 또는 0으로 설정되면 이 패킷이 세션의 첫 번째 패킷입니다. ACK 비트가 "false" 또는 0으로 설정된 패킷을 거부하거나 폐기함으로써 호스트가 연결을 설정하는 것을 쉽게 차단할 수 있습니다.

유용한 자료:

- [인터넷 방화벽 구축 - 패킷 필터링](http://web.deu.edu.tr/static/oreily/networking/firewall/ch06_01.htm)

</details>

<details>
<summary><b>리버스 프록시 서버 사용의 장점은 무엇인가요?</b></summary><br>

**백엔드 서버의 토폴로지 및 특성 숨기기**

**리버스 프록시 서버**는 원본 서버의 존재와 특성을 숨길 수 있습니다. 인터넷 클라우드와 웹 서버 사이에서 중간자 역할을 합니다. 특히 웹 호스팅 서비스를 사용할 때 보안상의 이유로 좋습니다.

**백엔드 서버의 투명한 유지보수 허용**

리버스 프록시 뒤에서 실행되는 서버에 대한 변경 사항은 최종 사용자에게 완전히 투명하게 처리됩니다.

**로드 밸런싱**

리버스 프록시는 라운드 로빈, 가중 라운드 로빈, 최소 연결, 가중 최소 연결 또는 랜덤과 같은 로드 밸런싱 알고리즘을 적용하여 클러스터 내 서버 간에 부하를 분산합니다.

서버가 다운되면 시스템은 자동으로 다음 서버로 장애 조치(failover)되며, 사용자는 안전한 파일 전송 활동을 계속할 수 있습니다.

**SSL 오프로딩/종료**

들어오는 HTTPS 연결을 처리하고 요청을 복호화하여 암호화되지 않은 요청을 웹 서버에 전달합니다.

**IP 마스킹**

단일 IP를 사용하지만 다른 URL을 사용하여 다른 백엔드 서버로 라우팅합니다.

유용한 자료:

- [리버스 프록시의 이점](https://dzone.com/articles/benefits-reverse-proxy)

</details>

<details>
<summary><b>라우터와 게이트웨이의 차이점은 무엇인가요? 기본 게이트웨이는 무엇인가요?</b></summary><br>

**라우터**는 일반적인 기술 기능(계층 3 포워딩) 또는 그 목적을 위한 하드웨어 장치를 설명하는 반면, **게이트웨이**는 로컬 세그먼트의 기능(다른 곳으로의 연결 제공)을 설명합니다. "라우터를 게이트웨이로 설정한다"라고 말할 수도 있습니다. 또 다른 용어로는 서브넷 간 포워딩을 설명하는 **홉(hop)**이 있습니다.

**기본 게이트웨이**라는 용어는 LAN 외부의 컴퓨터로 가는 트래픽의 첫 번째 접점 역할을 담당하는 LAN의 라우터를 의미합니다.

관점의 차이일 뿐이며, 장치는 동일합니다.

유용한 자료:

- [라우터와 게이트웨이의 차이점 (원본)](https://networkengineering.stackexchange.com/questions/51426/difference-between-router-and-gateway)

</details>

<details>
<summary><b>다음 DNS 레코드의 기능을 설명하세요: SOA, PTR, A, MX, CNAME.</b></summary><br>

**DNS 레코드**는 기본적으로 각 도메인이 어떤 IP 주소와 연결되어 있는지, 그리고 각 도메인으로 전송된 요청을 처리하는 방법을 DNS 서버에 알려주는 매핑 파일입니다. 거의 모든 DNS 레코드 구성에서 일반적으로 사용되는 몇 가지 **DNS 레코드** 구문으로는 `A`, `AAAA`, `CNAME`, `MX`, `PTR`, `NS`, `SOA`, `SRV`, `TXT`, `NAPTR`가 있습니다.

- **SOA** - 권한 시작 (Start Of Authority)
- **A** - 주소 매핑 레코드
- **AAAA** - IPv6 주소 레코드
- **CNAME** - 정식 이름 레코드
- **MX** - 메일 교환 레코드
- **NS** - 네임 서버 레코드
- **PTR** - 역방향 조회 포인터 레코드

유용한 자료:

- [DNS 레코드 유형 목록](https://en.wikipedia.org/wiki/List_of_DNS_record_types)

</details>

<details>
<summary><b>네트워킹에서 IPv4/6 대신 MAC 주소를 사용할 수 없는 이유는 무엇인가요?</b></summary><br>

**OSI** 모델은 물리적(계층 2) 메커니즘을 기반으로 라우팅(계층 3 개념) 결정을 내리는 것이 타당하지 않은 이유를 설명합니다.

현대의 네트워킹은 종단 간 통신을 달성하기 위해 여러 다른 계층으로 나뉩니다. 네트워크 카드(MAC 주소 - 물리적 주소로 주소 지정됨)는 물리적 네트워크에 있는 피어와 통신하는 역할만 담당하면 됩니다.

**MAC** 주소로 수행할 수 있는 통신은 시스템과 물리적으로 연결된 다른 장치로 제한됩니다. 예를 들어 인터넷에서는 각 머신에 물리적으로 연결되어 있지 않습니다. 그래서 물리적으로 연결되지 않은 머신과 통신해야 할 때 **TCP/IP**(계층 3, 논리적 주소) 메커니즘을 사용합니다.

**IP**는 컴퓨터 그룹을 논리적으로 구분하기 위해 계층적 방식으로 부과된 임의의 번호 부여 체계입니다(서브넷이 바로 이것입니다). 이러한 그룹 간에 메시지를 보내는 것은 라우팅 테이블을 통해 이루어지며, 라우팅 테이블 자체는 여러 수준으로 나뉘어 모든 단일 서브넷을 추적하지 않아도 됩니다.

이는 다른 두 시스템과 관련짓기도 쉽습니다. 주(state)에서 발급한 ID 번호가 있다면, 그 ID가 이미 당신에게 고유한데 왜 우편 주소가 필요할까요? 우편 주소가 필요한 이유는 통신의 고유한 대상이 어디로 가야 하는지를 설명하는 임의의 시스템이기 때문입니다.

반면, 네트워크 전반의 **MAC** 주소 분포는 무작위적이며 토폴로지와 전혀 관련이 없습니다. 경로 그룹화가 불가능해지며, 모든 라우터는 트래픽을 중계하는 모든 단일 장치에 대한 경로를 추적해야 합니다. 이것이 바로 **계층 2** 스위치가 하는 일이며, 특정 호스트 수를 넘어서면 확장성이 좋지 않습니다.

유용한 자료:

- [네트워킹에서 IPv4/6 대신 MAC 주소를 사용할 수 없는 이유는 무엇인가요? (원본)](https://serverfault.com/questions/410626/why-couldnt-mac-addresses-be-used-instead-of-ipv46-for-networking)

</details>

<details>
<summary><b>최대 30대의 장치를 포함하는 네트워크에 적용할 수 있는 가장 작은 IPv4 서브넷 마스크는 무엇인가요?</b></summary><br>

최종 사용자를 위한 표준 `/24` VLAN이든, 지점 간 링크를 위한 `/30`이든, 그 사이의 무언가이든 최대 30대의 장치를 포함해야 하는 서브넷은 `/27` - 즉 서브넷 마스크 `255.255.255.224`에 해당합니다.

유용한 자료:

- [프리픽스, 네트워크, 서브넷 및 호스트 번호를 계산하는 방법은 무엇인가요?](https://networkengineering.stackexchange.com/questions/7106/how-do-you-calculate-the-prefix-network-subnet-and-host-numbers)
- [IP 주소 뒤의 슬래시 - CIDR 표기법](https://networkengineering.stackexchange.com/questions/3697/the-slash-after-an-ip-address-cidr-notation)
- [사설 IPv4 주소 범위가 3개인 이유는 무엇인가요?](https://networkengineering.stackexchange.com/questions/32119/why-are-there-3-ranges-of-private-ipv4-addresses)
- [IP 계산기](http://jodies.de/ipcalc)

</details>

<details>
<summary><b>일반적인 HTTP 상태 코드는 무엇인가요?</b></summary><br>

- **1xx** - 정보 응답 - 전송 프로토콜 수준 정보 전달
- **2xx** - 성공 - 클라이언트의 요청이 성공적으로 수락되었음을 나타냄
- **3xx** - 리디렉션 - 클라이언트가 요청을 완료하기 위해 추가 조치를 취해야 함을 나타냄
- **4xx** - 클라이언트 측 오류 - 이 오류 상태 코드 범주는 클라이언트를 가리킴
- **5xx** - 서버 측 오류 - 서버가 이러한 오류 상태 코드에 대한 책임을 짐

유용한 자료:

- [HTTP 상태 코드](https://httpstatuses.com/)

</details>

###### DevOps 질문 (5)

<details>
<summary><b>DevOps란 무엇인가요? DevOps 커뮤니티의 성공에 더 중요한 것은 무엇인가요: 사람들이 의사소통하는 방식인가요, 아니면 배포하기로 선택한 도구인가요? ***</b></summary><br>

**DevOps**는 개발 및 운영 작업을 모두 수행하는 응집력 있는 팀이거나, 매우 긴밀하게 협력하는 개별 운영 및 개발 팀입니다. 이는 공통 목표를 달성하기 위해 다른 부서와 협력하는 "방식"에 가깝습니다.

</details>

<details>
<summary><b>버전 제어란 무엇인가요? 당신의 커밋 메시지는 보기 좋게 작성되어 있나요?</b></summary><br>

파일 또는 파일 집합의 변경 사항을 시간에 따라 기록하여 나중에 특정 버전을 다시 호출할 수 있는 시스템입니다. 버전 제어 시스템은 팀원이 파일 또는 파일 집합의 변경 사항을 커밋할 수 있는 중앙 공유 저장소로 구성됩니다. 그런 다음 버전 제어의 용도를 언급할 수 있습니다.

버전 제어를 사용하면 다음이 가능합니다:

- 파일을 이전 상태로 되돌리기
- 전체 프로젝트를 이전 상태로 되돌리기
- 시간에 따른 변경 사항 비교
- 문제를 일으킬 수 있는 항목을 마지막으로 수정한 사람 확인
- 문제를 도입한 사람과 시점 확인

훌륭한 커밋 메시지의 일곱 가지 규칙:

- 제목과 본문을 빈 줄로 구분
- 제목 줄을 50자로 제한
- 제목 줄을 대문자로 시작
- 제목 줄을 마침표로 끝내지 않음
- 제목 줄에 명령형 사용
- 본문을 72자로 줄 바꿈
- 본문을 사용하여 '어떻게'보다는 '무엇'과 '왜'를 설명

유용한 자료:

- [시작하기 - 버전 제어 정보 (원본)](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control)

</details>

<details>
<summary><b>기본적인 `git` 명령어를 설명하세요.</b></summary><br>

- `git init` - 새로운 로컬 저장소 생성
- `git commit -m "message"` - 변경 사항을 HEAD에 커밋
- `git status` - `git add`로 추가한 파일 목록을 표시하고, 그 이후 변경된 파일도 커밋
- `git push origin master` - 변경 사항을 원격 저장소의 master 브랜치로 전송

</details>

<details>
<summary><b>간단한 지속적 통합(CI) 파이프라인을 설명하세요.</b></summary><br>

- 저장소 복제
- 배포 단계 (QA)
- 테스트 환경 (QA)
- 배포 단계 (PROD)

</details>

<details>
<summary><b>기본적인 `docker` 명령어를 설명하세요.</b></summary><br>

- `docker ps` - 실행 중인 컨테이너 표시
- `docker ps -a` - 모든 컨테이너 표시
- `docker images` - 도커 이미지 표시
- `docker logs <container-id|container-name>` - 컨테이너에서 로그 가져오기
- `docker network ls` - 모든 도커 네트워크 표시
- `docker volumes ls` - 모든 도커 볼륨 표시
- `docker exec -it <container-id|container-name> bash` - 대화형 셸로 컨테이너에서 bash 실행

</details>

###### 사이버 보안 질문 (1)

<details>
<summary><b>보안 잘못된 구성(Security Misconfiguration)이란 무엇인가요?</b></summary><br>

**보안 잘못된 구성**은 장치/애플리케이션/네트워크가 공격자가 악용할 수 있는 방식으로 구성된 취약점입니다. 기본 사용자 이름/비밀번호를 변경하지 않은 상태로 두거나 장치 계정 등에 너무 간단한 설정을 사용하는 것과 같이 간단할 수 있습니다.

</details>

### :diamond_shape_with_a_dot_inside: <a name="regular-sysadmin">일반 시스템 관리자</a>

###### 시스템 질문 (60)

<details>
<summary><b>프로덕션 환경에서의 경험에 대해 말씀해 주세요. ***</b></summary><br>

작성 예정.

</details>

<details>
<summary><b>주요 웹 서버를 운영하기 위해 어떤 배포판을 선택하시겠습니까? ***</b></summary><br>

작성 예정.

</details>

<details>
<summary><b>Linux 시스템의 부팅 과정을 몇 가지 포인트로 설명하세요.</b></summary><br>

**BIOS**: BIOS(Basic Input or Output System)는 무결성 검사를 수행하고 부트로더를 검색, 로드 및 실행합니다.

**부트로더**: 이전 단계는 운영체제에 특화되지 않으므로, x86 및 x86-64 아키텍처의 BIOS 기반 부팅 프로세스는 마스터 부트 레코드(MBR) 코드가 리얼 모드에서 실행되고 1단계 부트로더가 로드될 때 시작되는 것으로 간주됩니다. UEFI 시스템에서는 Linux 커널과 같은 페이로드를 직접 실행할 수 있습니다. 따라서 부트로더가 필요하지 않습니다. 인기 있는 부트로더: **GRUB**, **Syslinux/Isolinux** 또는 **Lilo**.

**커널**: Linux의 커널은 메모리 관리, 태스크 스케줄링, I/O, 프로세스 간 통신, 전체 시스템 제어 등 모든 운영체제 프로세스를 처리합니다. 이는 두 단계로 로드됩니다. 첫 번째 단계에서는 커널(압축된 이미지 파일)이 메모리에 로드되고 압축이 풀리며, 기본 메모리 관리와 같은 몇 가지 기본 기능이 설정됩니다.

**Init**: 시스템의 모든 프로세스의 부모이며, 커널에 의해 실행되고 다른 모든 프로세스를 시작하는 역할을 합니다.

- `SysV init` - init의 임무는 "커널이 완전히 실행된 후 모든 것이 제대로 실행되도록 하는 것"입니다. 기본적으로 사용자 공간 전체를 설정하고 운영합니다. 여기에는 파일 시스템 확인 및 마운트, 필요한 사용자 서비스 시작, 시스템 시작이 완료되면 최종적으로 사용자 환경으로 전환하는 것이 포함됩니다.
- `systemd` - systemd의 개발자는 Unix System V에서 상속된 Linux init 시스템을 대체하는 것을 목표로 했습니다. init와 마찬가지로 systemd는 다른 데몬을 관리하는 데몬입니다. systemd를 포함한 모든 데몬은 백그라운드 프로세스입니다. Systemd는 부팅 중에 시작되는 첫 번째 데몬이며, 종료 중에 마지막으로 종료되는 데몬입니다.
- `runinit` - runinit은 Unix 계열 운영체제를 위한 init 방식으로, 운영체제 전체에서 프로세스를 초기화, 감독 및 종료합니다. Linux, Mac OS X, \*BSD 및 Solaris 운영체제에서 실행되는 daemontools 프로세스 감독 툴킷의 재구현입니다.

유용한 자료:

- [Linux 부팅 프로세스 분석](https://opensource.com/article/18/1/analyzing-linux-boot-process)
- [Systemd 부팅 프로세스 자세히 살펴보기 - Linux](https://linoxide.com/linux-how-to/systemd-boot-process/)

</details>

<details>
<summary><b>Linux 데몬은 어떻게 그리고 왜 권한을 낮추나요? 일부 데몬이 시작하기 위해 루트 권한이 필요한 이유는 무엇인가요? 설명하세요. ***</b></summary>

작성 예정.

</details>

<details>
<summary><b>싱글 코어 머신에서 부하 1.00이 이상적이지 않은 이유는 무엇인가요?</b></summary><br>1.00의 부하는 여유 공간이 없다는 문제가 있습니다. 실제로 많은 시스템 관리자는 0.70에서 선을 그을 것입니다.

"확인이 필요한" 경험 법칙: 0.70. 부하 평균이 > 0.70을 계속 초과한다면, 상황이 악화되기 전에 조사할 때입니다.

"지금 수정하세요" 경험 법칙: 1.00. 부하 평균이 1.00을 초과하여 유지된다면, 문제를 찾아 즉시 수정하세요. 그렇지 않으면 한밤중에 깨게 될 것이고, 재미있지 않을 것입니다.

경험 법칙: 5.0. 부하 평균이 5.00을 초과하면 심각한 문제에 직면할 수 있습니다. 시스템이 멈추거나 심각하게 느려지며, 이는 (설명할 수 없이) 한밤중이나 컨퍼런스에서 발표 중일 때와 같은 최악의 시점에 발생할 것입니다. 그런 상태에 이르지 않도록 하세요.

유용한 자료:

- [4코어 8스레드 프로세서에서 시스템 부하를 해석하는 올바른 방법](https://serverfault.com/questions/618130/proper-way-of-interpreting-system-load-on-a-4-core-8-thread-processor)
- [리눅스 CPU 부하 이해하기 - 언제 걱정해야 할까?](http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages)

</details>

<details>
<summary><b>유효 사용자가 root인데 실제 사용자 ID가 여전히 사용자 이름인 것은 무엇을 의미하나요?</b></summary><br>

**실제 사용자 ID**는 실제 사용자(프로세스를 소유한 사용자)이고, **유효 사용자 ID**는 운영 체제가 어떤 작업을 수행할 권한이 있는지 결정하기 위해 확인하는 것입니다(대부분의 경우 예외가 있습니다).

로그인하면 로그인 셸은 **실제 사용자 ID와 유효 사용자 ID**를 모두 비밀번호 파일에서 제공된 동일한 값(사용자의 **실제 사용자 ID**)으로 설정합니다.

예를 들어 setuid를 실행하면, 다른 사용자(예: **root**)로 실행되는 것 외에도 setuid 프로그램이 사용자를 대신하여 작업을 수행해야 합니다.

setuid를 실행한 후에는 사용자의 **실제 ID**(프로세스 소유자이므로)와 setuid이므로 파일 소유자의 유효 사용자 ID(예: **root**)를 갖게 됩니다.

`passwd`의 경우를 살펴보겠습니다:```bash
-rwsr-xr-x 1 root root 45396 may 25  2012 /usr/bin/passwd
개발자가 추가한 cron 작업이 대량의 로그 파일을 생성합니다. 로그 파일이 너무 커지는 것을 어떻게 막을 수 있나요?

로그 파일을 처리하는 일반적인 방법은 logrotate를 사용하는 것입니다. 하지만 /etc/logrotate.conf에 내용을 추가하는 대신 /etc/logrotate.d/에 자신만의 작업을 추가해야 합니다. 그렇지 않으면 릴리스 업그레이드 중에 설정 파일의 diff를 더 많이 확인해야 하기 때문입니다.

파일이 활발하게 쓰여지고 있다면 truncate 방식으로 할 수 있는 일이 많지 않습니다. 선택할 수 있는 것은 파일을 자르는 것뿐입니다:```bash : >/var/log/massive-logfile

root@kitploit:~
이는 파일을 프로세스를 방해하지 않고 잘라내기 때문에 매우 유용합니다.

유용한 자료:

- [logrotate를 사용하여 로그 파일을 관리하는 방법](https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files/)
- [시스템 로깅](https://www.ibm.com/developerworks/library/l-lpic1-108-2/index.html)

</details>

<details>
<summary><b>Linux 커널은 시스템에서 프로세스를 어떻게 생성, 관리 및 삭제하나요? ***</b></summary><br>

작성 예정.

유용한 자료:

- [Linux 프로세스](https://www.tldp.org/LDP/tlk/kernel/processes.html)

</details>

<details>
<summary><b><code>top</code>과 <code>htop</code>에서 볼 수 있는 선택된 정보를 설명하세요. 이러한 도구를 사용하여 부하, 높은 사용자 시간 및 메모리 부족 문제를 진단하는 방법은 무엇인가요? ***</b></summary><br>

작성 예정.

유용한 자료:

- [top 시각적으로 설명](https://www.svennd.be/top-explained-visually/)
- [htop 시각적으로 설명](https://codeahoy.com/2017/01/20/hhtop-explained-visually/)
- [Linux에서 htop/top에서 볼 수 있는 모든 것 설명](https://peteris.rocks/blog/htop/)

</details>

<details>
<summary><b>리소스를 독점하고 있는 프로세스를 어떻게 인식하시겠습니까? </b></summary><br>

`top`은 올바른 숫자를 보는 한 꽤 잘 작동합니다.
- **M** 현재 상주 메모리 사용량 기준 정렬
- **T** 총(또는 누적) CPU 사용량 기준 정렬
- **P** 현재 CPU 사용량 기준 정렬 (기본 새로 고침)
- **?** 모든 top 명령에 대한 사용 요약 표시

이는 컴퓨터 프로세스가 느리게 실행되는 원인을 해결하고 어떤 프로세스를 죽일지/어떤 소프트웨어를 제거할지 결정할 때 얻어야 할 매우 중요한 정보입니다.

유용한 자료:

- [머신을 독점하고 있는 프로세스를 찾는 방법](https://superuser.com/questions/326300/how-to-find-the-processes-which-are-hogging-the-machine)

</details>

<details>
<summary><b>200대의 서버에서 <code>ntpd</code> 서비스를 업그레이드해야 합니다. 이 모든 서버를 최신 버전으로 업그레이드하는 가장 좋은 방법은 무엇인가요?</b></summary><br>

**Infrastructure as a Code** 접근 방식을 사용하면 여러 좋은 방법이 있습니다:

1. **구성 동기화 변경 관리 모델**:

구성 관리 도구(Ansible, Chef, Puppet, Saltstack 등)를 사용하여 모든 서버에서 `ntpd` 서비스를 자동으로 업데이트할 수 있습니다. 시스템 안정성을 유지하기 위해 서버의 시스템 패키지는 일반적으로 보안 업데이트만 자동 업데이트됩니다. 패키지의 주요 또는 부 버전은 서비스의 잘못된 구성을 방지하기 위해 구성 정의에서 일반적으로 버전 잠금됩니다. 변경은 구성 정의에서 `ntpd` 버전을 변경하여 배포됩니다.

이 접근 방식을 사용할 때는 인프라에 변경 사항을 대규모로 배포할 때 주의해야 합니다. 배포 파이프라인에는 단위, 통합 및 시스템 테스트가 포함되어야 하며, 결국에는 구성을 증명하기 위해 스테이징 환경에 먼저 배포되어야 합니다. 테스트가 구성의 정확성을 입증하면, 오류나 실패 시 롤백할 수 있는 점진적 롤아웃 방식으로 배포해야 합니다.

2. **불변 서버 모델**:

불변 서버 모델에서는 실행 중인 서버를 변경하는 대신 전체 단위(서버, 컨테이너)를 새로운 업데이트된 이미지로 교체합니다(이를 통해 구성 드리프트를 제거합니다). 이 접근 방식을 사용하면 일반적으로 Packer나 Docker 및 Dockerfile을 사용하여 서버 이미지를 빌드합니다. 이 이미지는 위의 옵션(1.)과 유사하게 테스트 및 배포되지만, 이제는 Canary Release와 같은 기술을 사용하며 점진적 롤아웃 및 롤백 기능도 있습니다.

유용한 자료:

- [Infrastructure as a Code - Chapter 8: Patterns for Updating and Changing Servers](http://shop.oreilly.com/product/0636920039297.do)

</details>

<details>
<summary><b>Linux/Unix에서 <code>$PATH</code>를 영구적으로 설정하는 방법은 무엇인가요? 이 변수가 왜 그렇게 중요한가요? ***</b></summary>

작성 예정.

</details>

<details>
<summary><b>서버가 부팅될 때 콘솔에 일부 오류가 나타납니다. 부트 메시지를 검사하는 방법과 이러한 메시지는 어디에 저장되나요?</b></summary><br>

콘솔에는 두 가지 유형의 메시지가 있습니다:

- **커널에 의해 생성된 것** (printk 통한)
- **사용자 공간에 의해 생성된 것** (보통 init 시스템)

커널 메시지는 항상 **kmsg** 버퍼에 저장되며, `dmesg` 명령으로 볼 수 있습니다. 또한 종종 **syslog**에 복사됩니다. 이는 `/dev/kmsg`에 기록된 사용자 공간 메시지에도 적용되지만, 이러한 경우는 매우 드뭅니다.

한편, 사용자 공간이 화려한 부팅 상태 텍스트를 `/dev/console` 또는 `/dev/tty1`에 쓸 때는 어디에도 저장되지 않습니다. 그냥 화면으로만 가고 끝입니다.

`dmesg`는 커널 링 버퍼에 포함된 부트 메시지를 검토하는 데 사용됩니다. 링 버퍼는 고정된 크기의 버퍼로, 새 데이터가 추가되면 가장 오래된 데이터를 덮어씁니다.

부팅 프로세스가 완료된 후의 작업(예: 커널에 전달된 명령줄 옵션, 감지된 하드웨어 구성 요소, 새 USB 장치가 추가될 때의 이벤트, NIC(네트워크 인터페이스 카드) 오류 및 드라이버가 네트워크에서 링크 활동이 감지되지 않았다고 보고하는 등의 오류)을 보여줍니다.

시스템 로깅이 저널 구성 요소를 통해 이루어지는 경우 `journalctl`을 사용해야 합니다. 이 명령은 커널 및 부트 메시지, syslog 또는 다양한 서비스의 메시지를 보여줍니다.

부팅 문제/오류는 시스템 관리자가 특정 명령과 함께 중요한 파일을 살펴보아야 합니다(Linux 버전에 따라 다르게 처리됨):

- `/var/log/boot.log` - 시스템 부트 로그. 시스템 부팅 중에 발생한 모든 내용 포함
- `/var/log/messages` - 시스템 부팅 중 기록된 메시지를 포함한 전역 시스템 메시지 저장
- `/var/log/dmesg` - 커널 링 버퍼 정보 포함

유용한 자료:

- [부팅 후 Linux에서 모든 부트 메시지를 보는 방법? (원본)](https://superuser.com/questions/1188407/how-to-view-all-boot-messages-in-linux-after-booting)
- [/var/log/{syslog,dmesg,messages} 로그 파일의 차이점](https://superuser.com/questions/565927/differences-in-var-log-syslog-dmesg-messages-log-files)
- [Debian 시스템 부팅 시 스크롤되는 메시지를 나중에 검토하는 방법?](https://serverfault.com/questions/516411/all-debian-boot-messages)

</details>

<details>
<summary><b>스왑 사용량이 너무 높습니다. 그 원인은 무엇이며 스와핑 문제를 해결하는 방법은 무엇인가요?</b></summary><br>

**스왑** 공간은 사용 가능한 메모리가 완전히 사용되었을 때 운영 체제에서 사용하도록 할당된 제한된 양의 물리적 메모리입니다. 메모리 섹션을 물리적 저장소로/에서 스와핑하는 메모리 관리 방식입니다.

시스템이 더 많은 메모리 리소스를 필요로 하고 RAM이 가득 차면 메모리의 비활성 페이지가 스왑 공간으로 이동됩니다. 스왑 공간은 RAM 용량이 작은 시스템에 도움이 될 수 있지만, 더 많은 RAM을 대체하는 것으로 간주되어서는 안 됩니다. **스왑** 공간은 물리적 메모리보다 접근 시간이 느린 하드 드라이브에 위치합니다.

워크로드가 RAM 수요를 증가시킵니다. 더 많은 메모리가 필요한 워크로드를 실행 중입니다. 전체 스왑 사용은 이를 나타냅니다. 또한 `swappiness`를 **1**로 변경하는 것은 현명한 결정이 아닐 수 있습니다. `swappiness`를 **1**로 설정한다고 해서 스와핑이 수행되지 않는다는 것을 의미하지는 않습니다. 이는 커널이 스와핑에 대해 얼마나 적극적으로 대처할지 나타낼 뿐이며, 스와핑을 제거하지는 않습니다. 스와핑은 필요하면 수행됩니다.

- **스왑 공간 크기 증가** - 첫째, 디스크 사용량이 증가합니다. 디스크가 충분히 빠르지 않으면 시스템이 스래싱될 수 있으며, 데이터가 메모리 안팎으로 스와핑되면서 속도 저하가 발생합니다. 이는 병목 현상을 초래합니다.

- **RAM 추가** - 실제 해결책은 더 많은 메모리를 추가하는 것입니다. RAM을 대체할 수 있는 것은 없으며, 충분한 메모리가 있으면 스와핑이 줄어듭니다.

스왑 공간 사용 모니터링:

- `cat /proc/swaps` - 총 스왑 크기 및 사용된 스왑 크기 확인
- `grep SwapTotal /proc/meminfo` - 총 스왑 공간 표시
- `free` - 사용 가능한 여유 및 사용된 시스템 메모리(스왑 포함) 표시
- `vmstat` - 스와핑 통계 확인
- `top`, `htop` - 스왑 공간 사용량 확인
- `atop` - 시스템이 메모리를 과도하게 할당하고 있는지 표시
- 또는 한 줄 셸 명령을 사용하여 스왑 공간 검색이 사용 중인 킬로바이트 단위의 모든 응용 프로그램 나열:```bash
for _fd in /proc/*/status ; do
  awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $_fd
done | sort -k 2 -n -r | less
umask란 무엇인가요? 사용자에게 영구적으로 설정하는 방법은?

리눅스 및 기타 유닉스 계열 운영 체제에서 새 파일은 기본 권한 집합으로 생성됩니다. 구체적으로, 새 파일의 권한은 umask라는 권한 '마스크'를 적용하여 특정 방식으로 제한될 수 있습니다. umask 명령은 이 마스크를 설정하거나 현재 값을 표시하는 데 사용됩니다.

영구적으로 변경(예: umask 02 설정):

  • ~/.profile
  • ~/.bashrc
  • ~/.zshrc
  • ~/.cshrc

유용한 자료:

  • Umask란 무엇이며 리눅스에서 기본 umask를 설정하는 방법은?
다음 umask 값(000, 002, 022, 027, 077, 277) 간의 차이점을 설명하세요.
심볼릭 링크와 하드 링크의 차이는 무엇인가요?

파일 시스템에서 파일은 inode로 표현됩니다. (또는 여러 inode인지 확실하지 않음)

  • 파일 시스템의 파일은 기본적으로 inode에 대한 링크입니다.
  • 하드 링크는 동일한 기본 inode에 대한 링크로 다른 파일을 생성합니다.
  • 파일을 삭제하면 기본 inode에 대한 링크 하나가 제거됩니다. inode는 해당 inode에 대한 모든 링크가 삭제된 경우에만 삭제(또는 삭제 가능/덮어쓰기 가능)됩니다.
  • 심볼릭 링크는 파일 시스템의 다른 이름에 대한 링크입니다.
  • 하드 링크가 생성되면 링크는 inode에 대한 것입니다. 원본 파일을 삭제, 이름 변경 또는 이동해도 하드 링크는 기본 inode에 연결되어 있으므로 영향을 받지 않습니다. inode의 데이터에 대한 모든 변경 사항은 해당 inode를 참조하는 모든 파일에 반영됩니다.
  • 참고: 하드 링크는 동일한 파일 시스템 내에서만 유효합니다. 심볼릭 링크는 단순히 다른 파일의 이름이므로 파일 시스템 간에 걸쳐 있을 수 있습니다.

차이점:

  • 하드 링크는 디렉터리에 대해 생성할 수 없습니다. 하드 링크는 파일에 대해서만 생성할 수 있습니다.
  • 소프트 링크(심볼릭 링크 또는 symlink라고도 함)는 디렉터리에 연결할 수 있습니다.

유용한 자료:

  • 하드 링크와 심볼릭 링크의 차이는 무엇인가요?
스티키 비트는 어떻게 작동하나요? SUID/GUID와 같은 것인가요?

아마도 사람들이 항상 실수하는 가장 짜증나는 것 중 하나일 것입니다. SUID/GUID 비트와 스티키 비트는 완전히 다른 두 가지입니다.

man chmod를 실행하면 SUID와 스티키 비트에 대해 읽을 수 있습니다.

SUID/GUID

위의 man 페이지가 말하려는 것은 rwxrwxrwx에서 사용자 8진수(rwx의 첫 번째 그룹)와 그룹 8진수(rwx의 두 번째 그룹)의 x 비트 위치가 x가 s로 변경되는 추가 상태를 가질 수 있다는 것입니다. 이 경우 이 파일이 실행될 때(단순한 셸 스크립트가 아닌 프로그램인 경우) 파일 소유자 또는 그룹의 권한으로 실행됩니다.

따라서 파일이 root 소유이고 SUID 비트가 켜져 있으면 프로그램이 root로 실행됩니다. 일반 사용자로 실행하더라도 마찬가지입니다. GUID 비트에도 동일하게 적용됩니다.

예:

suid/guid 없음 - rwxr-xr-x 비트만 설정됩니다.```bash ls -lt b.pl -rwxr-xr-x 1 root root 179 Jan 9 01:01 b.pl

root@kitploit:~
**suid 및 사용자 실행 비트 활성화 (소문자 s)** - 비트 `rwsr-x-r-x`가 설정되었습니다.```bash
chmod u+s b.pl
ls -lt b.pl
-rwsr-xr-x 1 root root 179 Jan  9 01:01 b.pl

suid 활성화 및 실행 비트 비활성화 (대문자 S) - 비트 rwSr-xr-x가 설정되었습니다.```bash chmod u-x b.pl ls -lt b.pl -rwSr-xr-x 1 root root 179 Jan 9 01:01 b.pl

root@kitploit:~
**guid 및 그룹의 실행 비트 활성화 (소문자 s)** - `rwxr-sr-x` 비트가 설정됨.```bash
chmod g+s b.pl
ls -lt b.pl
-rwxr-sr-x 1 root root 179 Jan  9 01:01 b.pl

guid 활성화 & 실행 비트 비활성화 (대문자 S) - rwxr-Sr-x 비트가 설정되어 있습니다.```bash chmod g-x b.pl ls -lt b.pl -rwxr-Sr-x 1 root root 179 Jan 9 01:01 b.pl

명령어 앞의 LC_ALL=C는 무엇을 하나요? 어떤 경우에 유용할까요?

LC_ALL은 다른 모든 로케일 설정을 덮어쓰는 환경 변수입니다. 이 변수는 모든 LC_ 유형 변수를 한 번에 지정된 로케일로 설정합니다.

명령어 앞에 LC_ALL=C를 설정하는 주된 이유는 간단히 영어 출력을 얻기 위해서입니다 (명령어가 사용하는 로케일을 일반적으로 변경함).

반면에, LC_ALL=C로 명령어 실행 속도를 높이는 것도 중요합니다 (예: grep, fgrep). LC_ALL=C 로케일을 사용하면 성능이 향상되고 명령어 실행 시간이 단축됩니다.

예를 들어, LC_ALL=en_US.utf8로 설정하면 시스템이 /usr/lib/locale 디렉터리에서 여러 파일을 엽니다. LC_ALL=C를 사용하면 열기 및 읽기 작업이 최소화됩니다.

세션의 모든 일반(원래) 로케일 설정을 복원하려면:```bash LC_ALL=

root@kitploit:~
만약 `LC_ALL`이 작동하지 않는다면, `LANG`을 사용해보세요 (그래도 작동하지 않으면 `LANGUAGE`를 시도해보세요):```bash
LANG=C date +%A
Monday

유용한 자료:

웹 애플리케이션의 고가용성을 어떻게 구현하나요? ***

추후 작성 예정.

새 서버를 구성 중입니다. 한 단계로 앱 디렉터리 권한을 설정하는 것이 있습니다. 어떤 조치를 취하고 어떤 실수를 피해야 합니까?

1) 주요 요구 사항 - 이 점을 기억하세요

  • 앱 파일 시스템에 접근할 수 있는 사용자
  • 웹 서버(예: Apache) 및 앱 서버(예: uwsgi)의 권한
  • uploads, cache와 같은 특정 디렉터리 및 /var/www/app01/html 같은 주요 앱 디렉터리의 권한
  • 사용자에 대한 올바른 umask 값 및 suid/sgid (특정 상황에서만)
  • 모든 향후 파일 및 디렉터리의 권한
  • cron 작업 및 스크립트의 권한

2) 애플리케이션 디렉터리

/var/www는 각 웹사이트에 대한 디렉터리(앱 격리)를 포함합니다 (예: /var/www/app01, /var/www/app02)```bash mkdir /var/www/{app01,app02}

root@kitploit:~
**3) 애플리케이션 소유자 및 그룹**

각 애플리케이션에는 지정된 **소유자**(예: **u01-prod**, **u02-prod**)와 **그룹**(예: **g01-prod**, **g02-prod**)이 있으며, 이들은 웹사이트 디렉터리의 모든 파일과 디렉터리의 소유자로 설정됩니다.```bash
chown -R u01-prod:g01-prod /var/www/app01
chown -R u02-prod:g02-prod /var/www/app02

4) 개발자 소유자 및 그룹

웹사이트를 유지 관리하는 모든 사용자는 자신의 그룹을 가지고 있으며, 애플리케이션 그룹에 연결되어 있습니다:```bash id alice uid=2000(alice) gid=4000(alice) groups=8000(g01-prod) id bob uid=2001(bob) gid=4001(bob) groups=8000(g01-prod),8001(g02-prod)

root@kitploit:~
So **alice** user has standard privileges for `/var/www/app01` and **bob** user has standard privileges for `/var/www/app01` and `/var/www/app02`.

**5) 웹 서버 소유자와 그룹**

웹 서버에서 쓰기 작업이 필요한 모든 파일이나 디렉토리는 해당 소유자를 갖습니다. 웹 서버가 Apache인 경우 기본 소유자/그룹은 **apache:apache** 또는 **www-data:www-data**이고, Nginx의 경우 **nginx:nginx**입니다. 이 설정은 변경하지 마십시오.

애플리케이션이 **uwsgi** 또는 **php-fpm**과 같은 앱 서버와 함께 작동하는 경우, 특정 구성 파일에서 적절한 사용자와 그룹(예: **app01**의 경우 **u01-prod:g01-prod**)을 설정해야 합니다.

**6) 권한**

**액세스 제어 목록**으로 권한을 적절히 설정합니다:```bash
# For web server
setfacl -Rdm "g:apache:rwx" /var/www/app01
setfacl -Rm "g:apache:rwx" /var/www/app01

# For developers
setfacl -Rdm "g:g01-prod:rwx" /var/www/app01
setfacl -Rm "g:g01-prod:rwx" /var/www/app01
커널 매개변수를 변경하는 방법은 무엇인가요? 어떤 커널 옵션을 조정해야 할 수 있나요? ***

Unix 계열에서 커널 매개변수를 설정하려면 먼저 /etc/sysctl.conf 파일을 편집한 후 변경 사항을 저장하고 sysctl -p 명령어를 실행하면 됩니다. 이 명령어는 시스템을 재부팅하지 않고도 변경 사항을 영구적으로 적용합니다.

유용한 자료:

  • How to Change Kernel Runtime Parameters in a Persistent and Non-Persistent Way
/proc 파일시스템에 대해 설명해 주세요.

/proc은 커널, 하드웨어 및 실행 중인 프로세스에 대한 상세 정보를 제공하는 가상 파일 시스템입니다.

/proc은 가상 파일을 포함하고 있기 때문에 가상 파일 시스템이라고 불립니다. 이러한 가상 파일은 고유한 특성을 가지고 있습니다. 대부분은 크기가 0바이트로 표시됩니다.

/proc/interrupts, /proc/meminfo, /proc/mounts, /proc/partitions와 같은 가상 파일은 시스템 하드웨어의 실시간 상태를 보여줍니다. 그 외 /proc/filesystems 파일과 /proc/sys/ 디렉터리는 시스템 설정 정보와 인터페이스를 제공합니다.

유용한 자료:

  • Linux Filesystem Hierarchy - /proc
데이터 백업 프로세스를 설명해 주세요. 백업은 얼마나 자주 테스트해야 하나요? ***

추후 작성 예정입니다.

ext3/ext4에서 세 가지 저널링 유형을 설명해 주세요.

ext3/ext4 파일 시스템에서는 세 가지 저널링 유형을 사용할 수 있습니다:

  • Journal - 메타데이터와 내용이 저널에 저장됩니다.
  • Ordered - 메타데이터만 저널에 저장됩니다. 메타데이터는 내용이 디스크에 기록된 후에만 저널에 기록됩니다. 이것이 기본값입니다.
  • Writeback - 메타데이터만 저널에 저장됩니다. 메타데이터는 내용이 디스크에 기록되기 전이나 후에 저널에 기록될 수 있습니다.
inode란 무엇인가요? 파일의 inode 번호를 어떻게 찾고, 어떻게 사용할 수 있나요?

inode는 Linux 및 기타 Unix 계열 운영 체제의 파일 시스템에 있는 데이터 구조로, 파일 이름과 실제 데이터를 제외한 파일에 대한 모든 정보를 저장합니다. 데이터 구조는 데이터를 효율적으로 사용할 수 있도록 저장하는 방법입니다.

Unix 파일은 디스크의 두 가지 다른 부분, 즉 데이터 블록과 inode에 저장됩니다. 슈퍼블록이나 기타 난해한 정보는 다루지 않겠습니다. 데이터 블록은 파일의 "내용"을 포함합니다. 파일에 대한 정보는 inode에 별도로 저장됩니다.

파일의 inode 번호는 ls 명령어에 -i 옵션을 사용하여 쉽게 찾을 수 있습니다. 기본적으로 ls 명령어는 현재 디렉터리(사용자가 현재 작업 중인 디렉터리)의 객체(예: 파일, 링크, 디렉터리)를 나열합니다. 예를 들어, 다음 명령어는 현재 디렉터리에 있는 각 객체의 이름과 inode 번호를 함께 표시합니다:```bash ls -i

root@kitploit:~
`df's` `-i` 옵션은 사용 가능한 공간 대신 각 파일시스템의 inode 정보를 제공하도록 지시합니다. 구체적으로, df가 각 마운트된 파일시스템에 대해 총 inode 수, 사용 가능한 inode 수, 사용된 inode 수 및 inode 사용 비율을 반환하도록 합니다. 이 옵션은 출력을 읽기 쉽게 하기 위해 다음과 같이 `-h` 옵션과 함께 사용할 수 있습니다:```bash
df -hi

inode로 파일 찾기

inode를 알고 있다면, find 명령어를 사용하여 파일을 찾을 수 있습니다:```bash find . -inum 435304 -print

root@kitploit:~
**이상한 이름의 파일 삭제**

때로는 파일 이름에 이상한 문자가 포함된 파일이 생성되기도 합니다. Unix 파일 시스템은 null(ASCII 000) 또는 "/"를 제외한 모든 문자를 파일 이름의 일부로 허용합니다. 다른 모든 문자는 허용됩니다.

사용자는 디렉터리나 파일을 보기 어렵게 만드는 문자가 포함된 파일을 만들 수 있습니다. 예를 들어 끝에 공백이 있는 ".. " 디렉터리를 만들거나, 이름에 백스페이스가 있는 파일을 만들 수 있습니다. 다음과 같이 사용합니다:```bash
touch `printf "aa\bb"`

이제 ls 명령을 사용하면 어떤 일이 발생합니까:```bash ls aa?b ls | grep 'a' ab

root@kitploit:~
`ls`가 결과를 터미널로 보낼 때, 출력 불가능한 문자를 표시하기 위해 파일 이름에 "**?**"를 넣습니다.

`rm -i *`를 사용하여 이 파일을 제거할 수 있으며, 각 파일을 삭제하기 전에 확인을 요청합니다. 하지만 inode 번호를 알면 `find`를 사용하여 파일을 제거할 수도 있습니다.```bash
ls -i
435304 aa?b
find . -inum 435304 -delete
ls -l 파일 속성이 물음표로 표시됩니다. 무엇을 의미하며, 사용하지 않는 "좀비" 파일을 제거하기 위해 어떤 단계를 취하시겠습니까?

이 문제는 여러 단계가 필요할 수 있기 때문에 해결하기 더 어려울 수 있습니다. 때로는 test/file: Permission denied, test/file: No such file or directory 또는 test/file: Input/output error와 같은 오류가 발생할 수 있습니다.

이는 사용자가 파일에 대해 stat()을 수행할 수 없지만(실행 권한 필요), 디렉토리 항목을 읽을 수 있는 경우(디렉토리에 대한 읽기 액세스 필요) 발생합니다. 따라서 디렉토리 내 파일 목록은 볼 수 있지만, 파일을 읽을 수 없기 때문에 파일에 대한 정보를 얻을 수 없습니다. 읽기 권한은 있지만 실행 권한이 없는 디렉토리가 있는 경우 이 현상이 나타납니다.

rsync와 같은 일부 프로세스는 임시 파일을 빠르게 생성하고 제거하는데, 이로 인해 rm, mv 등과 같은 간단한 파일 관리 명령어를 호출하려고 하면 오류가 발생할 수 있습니다.

출력 예시:```bash ?????????? ? ? ? ? ? sess_kee6fu9ag7tiph2jae

root@kitploit:~
1) 권한 변경: `chmod 0777 sess_kee6fu9ag7tiph2jae` 후 제거 시도
2) 소유자 변경: `chown root:root sess_kee6fu9ag7tiph2jae` 후 제거 시도
3) 디렉터리 권한 및 소유자 변경: `chmod -R 0777 dir/ && chown -R root:root dir/` 후 제거 시도
4) 파일 재생성: `touch sess_kee6fu9ag7tiph2jae` 후 제거 시도
5) 서버에서 실행 중인 다른 프로세스(예: `rsync`)를 확인하세요. NFS 서버가 과도하게 부하된 경우 일시적 오류로 나타날 수 있습니다.
6) 파일 inode 찾기: `ls -i`, 제거 시도: `find . -inum <inode_num> -delete`
7) 파일 시스템 재마운트(가능한 경우)
8) 시스템을 단일 사용자 모드로 부팅하고 `fsck`로 파일 시스템 복구

유용한 리소스:

- [ls에서 디렉터리에 물음표가 표시됨. IO 오류도 발생합니다.](https://serverfault.com/questions/65616/question-marks-showing-in-ls-of-directory-io-errors-too)

</details>

<details>
<summary><b>LVM을 사용할까 말까? 어떤 이점이 있나요?</b></summary><br>

- LVM을 사용하면 파일 시스템을 매우 쉽게 이동할 수 있습니다
- 새 물리 볼륨에 볼륨 그룹을 확장할 수 있습니다
- 이전 물리 볼륨에서 원하는 수의 논리 볼륨을 이동할 수 있습니다
- 파티션을 마운트 해제하지 않고도 해당 볼륨을 볼륨 그룹에서 제거할 수 있습니다
- 백업을 위해 논리 볼륨의 스냅샷을 생성할 수도 있습니다
- LVM에는 내장 미러링 지원이 있어 여러 물리 볼륨에 걸쳐 논리 볼륨을 미러링할 수 있습니다
- LVM은 TRIM도 지원합니다

유용한 리소스:

- [LVM이란 무엇이며 용도는 무엇인가요?](https://askubuntu.com/questions/3596/what-is-lvm-and-what-is-it-used-for)

</details>

<details>
<summary><b>LVM 파티션 크기를 늘리는 방법은?</b></summary><br>

LVM 파티션 크기 조정을 위해 `lvextend` 명령을 사용하세요.

- 크기를 500MB 확장:```bash
lvextend -L +500M /dev/vgroup/lvolume
다른 사용자로 비밀번호 없이 스크립트를 실행하는 방법?

예를 들어 (visudo 명령어 사용):```bash user1 ALL=(user2) NOPASSWD: /opt/scripts/bin/generate.sh

root@kitploit:~
명령 경로는 절대 경로여야 합니다! 그런 다음 user1 셸에서 `sudo -u user2 /opt/scripts/bin/generate.sh`를 호출합니다.

</details>

<details>
<summary><b>bash 스크립트에서 루트로 실행 중인지 확인하는 방법은 무엇인가요? 주의해야 할 점은 무엇인가요?</b></summary><br>

bash 스크립트에서 실행 중인 사용자가 루트인지 확인하는 여러 방법이 있습니다.

경고: 루트 사용자 이름을 사용하여 사용자가 루트인지 확인하지 마세요. ID 0인 사용자가 root라고 불린다는 보장은 없습니다. 이는 널리 따르는 매우 강력한 관례이지만, 누구든지 슈퍼유저의 이름을 다른 이름으로 바꿀 수 있습니다.

bash를 사용할 때 가장 좋은 방법은 `$EUID`를 사용하는 것입니다. `$UID`는 변경될 수 있고 스크립트를 실행하는 실제 사용자를 반영하지 않을 수 있기 때문입니다.```bash
if (( $EUID != 0 )); then
  echo "Please run as root"
  exit
fi
특정 예를 들어 언제 nobody 계정을 사용해야 하는지 알려주실 수 있나요? nobody 계정으로 httpd 서비스를 실행하는 것과 www-data 계정으로 실행하는 것의 차이점을 설명해 주세요.

많은 Unix 변형에서 nobody는 파일을 소유하지 않고, 특권 그룹에 속하지 않으며, 다른 모든 사용자가 가진 능력 외에는 아무런 능력이 없는 사용자 계정의 전통적인 이름입니다.

악의적인 사용자가 서버를 제어할 경우 발생할 수 있는 피해를 제한하기 위해 특히 서버와 같은 데몬을 nobody로 실행하는 것이 일반적입니다.


Read more

도구 다운로드
챕터 유형질문 수간단 설명
소개
🔸 간단한 질문14개편안하고 재미있으며 간단함 - 모든 것을 시작하기에 좋습니다.
일반 지식
🔸 주니어 시스템 관리자65개기본 지식에 기반한 상당히 간단하고 직관적인 질문.
🔸 일반 시스템 관리자94개충분한 지식을 가지고 있다면 중간 수준의 질문.
🔸 시니어 시스템 관리자99개어려운 질문과 수수께끼. 잘하고 싶다면 확인해 보세요.
비밀 지식
🔸 구루 시스템 관리자12개구루 시스템 관리자를 알기 위한 깊은 질문들.
CTRL + E
  • 조합이 자동 확장됩니다:
    • !* - 마지막 명령의 모든 인수
    • !! - 마지막 명령 전체
    • !ssh - ssh로 시작하는 마지막 명령
  • 유용한 자료:

    • Command Line Interface Definition
    • What is your single most favorite command-line trick using Bash?
    • What are your favorite command line features or tricks?
    Linux 시스템에 로그인한 사용자를 식별하는 4가지 방법

    또는```bash grep -e "string1" -e "string2" filename

    root@kitploit:~
    유용한 리소스:
    
    - [grep이 무엇이며 어떻게 사용하나요? (원본)](https://kb.iu.edu/d/afiy)
    
    </details>
    
    <details>
    <summary><b>파일 내용 명령어와 설명을 함께 설명하세요.</b></summary><br>
    
    - `head`: 파일의 시작 부분을 확인합니다.
    - `tail`: 파일의 끝 부분을 확인합니다. head 명령어의 반대입니다.
    - `cat`: 파일을 보거나, 생성하거나, 연결하는 데 사용됩니다.
    - `more`: 터미널 창에 페이지 형식으로 텍스트를 표시합니다.
    - `less`: 텍스트를 뒤로 이동하며 볼 수 있고, 한 줄씩 이동할 수 있습니다.
    
    유용한 리소스:
    
    - [셸 프롬프트에서 텍스트 파일 보기](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Step_by_Step_Guide/s1-viewingtext-terminal.html)
    
    </details>
    
    <details>
    <summary><b>SIGHUP, SIGINT, SIGKILL 및 SIGTERM POSIX 시그널. 설명하세요.</b></summary><br>
    
    - **SIGHUP** - 제어 터미널이 닫힐 때 프로세스에 전송됩니다. 원래 직렬 회선 끊김(행업)을 프로세스에 알리기 위해 설계되었습니다. 많은 데몬은 이 신호를 수신하면 종료하는 대신 설정 파일을 다시 로드하고 로그 파일을 다시 엽니다.
    - **SIGINT** - 사용자가 프로세스를 중단하려 할 때 제어 터미널이 프로세스에 전송합니다. 일반적으로 `Ctrl+C`를 눌러 시작되지만, 일부 시스템에서는 "delete" 문자나 "break" 키가 사용될 수 있습니다.
    - **SIGKILL** - 프로세스를 즉시 종료(킬)시키기 위해 전송됩니다. **SIGTERM** 및 **SIGINT**와 달리 이 신호는 캐치하거나 무시할 수 없으며, 수신 프로세스는 이 신호를 받을 때 어떤 정리 작업도 수행할 수 없습니다.
    - **SIGTERM** - 프로세스에 종료를 요청하기 위해 전송됩니다. **SIGKILL** 신호와 달리 프로세스가 이를 캐치하여 해석하거나 무시할 수 있습니다. 이를 통해 프로세스는 적절한 경우 리소스를 해제하고 상태를 저장하며 정상적으로 종료할 수 있습니다. **SIGINT**는 **SIGTERM**과 거의 동일합니다.
    
    유용한 리소스:
    
    - [POSIX 시그널](https://dsa.cs.tsinghua.edu.cn/oj/static/unix_signal.html)
    - [Unix 시그널 프로그래밍 소개](http://titania.ctie.monash.edu.au/signals/)
    
    </details>
    
    <details>
    <summary><b><code>kill</code> 명령어는 무엇을 하나요?</b></summary><br>
    
    유닉스 및 유닉스 계열 운영 체제에서 `kill`은 프로세스에 시그널을 보내는 명령어입니다. 기본적으로 전송되는 메시지는 종료 시그널로, 프로세스가 종료되기를 요청합니다. 하지만 `kill`은 다소 잘못된 명칭입니다. 보내는 시그널이 프로세스 종료와 관련이 없을 수도 있습니다.
    
    유용한 리소스:
    
    - [리눅스에서 "Kill" 명령어 마스터하기](https://www.maketecheasier.com/kill-command-in-linux/)
    
    </details>
    
    <details>
    <summary><b><code>rm</code>과 <code>rm -rf</code>의 차이점은 무엇인가요?</b></summary><br>
    
    `rm`은 지정된 파일만 삭제합니다(디렉터리는 삭제하지 않습니다). `-rf`를 사용하면 말씀하신 대로:
    
    - `-r`, `-R`, `--recursive` 디렉터리 내용(숨김 파일 및 하위 디렉터리 포함)을 재귀적으로 삭제합니다.
    - `-f`, `--force` 존재하지 않는 파일을 무시하고, 프롬프트를 표시하지 않습니다.
    
    유용한 리소스:
    
    - [`rm -r`과 `rm -f`의 차이점은 무엇인가요?](https://superuser.com/questions/1126206/what-is-the-difference-between-rm-r-and-rm-f)
    
    </details>
    
    <details>
    <summary><b><code>grep</code>을 재귀적으로 어떻게 사용하나요? 여러 예제를 들어 설명하세요. ***</b></summary>
    
    완료 예정입니다.
    
    </details>
    
    <details>
    <summary><b><code>archive.tgz</code>가 약 30GB입니다. 내용을 나열하고 하나의 파일만 추출하려면 어떻게 해야 하나요?</b></summary><br>
    
    </details>```bash
    # list of content
    tar tf archive.tgz
    
    # extract file
    tar xf archive.tgz filename
    

    유용한 리소스:

    • tar 또는 tar.gz 파일의 내용 나열하기
    • tar.gz에서 특정 파일 추출하는 방법
    VLAN
    Inter VLAN 라우팅

    유용한 자료:

    • VLAN과 서브넷의 차이점은 무엇인가요? (원본)
    • 네트워크 보안 및 세분화를 위한 VLAN과 서브넷
    서비스포트
    SMTP25
    FTP데이터 전송용 20, 연결 설정용 21
    DNS53
    DHCPDHCP 서버용 67/UDP, DHCP 클라이언트용 68/UDP
    SSH22

    유용한 자료:

    • Red Hat Enterprise Linux 4: 보안 가이드 - 일반 포트

    IP 주소를 (때로는) 호스트 이름으로 역으로 확인할 수 있습니다. IP 주소는 PTR 레코드에 저장될 수 있습니다. 그런 다음 다음을 수행할 수 있습니다:```bash dig A

    root@kitploit:~
    호스트의 IPv4 주소를 조회하려면, 또는:```bash
    dig AAAA <hostname>
    

    호스트의 IPv6 주소를 조회하거나:```bash dig PTR ZZZ.YYY.XXX.WWW.in-addr.arpa.

    root@kitploit:~
    IPv4 주소 `WWW.XXX.YYY.ZZZ`에 대한 호스트 이름을 조회하려면 (옥텟이 역순으로 되어 있음에 유의), 또는:```bash
    dig PTR b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
    

    유용한 자료:

    • Bash 스크립트에서 호스트 이름을 IP 주소로 확인하는 방법은?
    • IP 주소를 도메인 이름으로 확인하는 방법은?

    user2가 비밀번호를 변경하려면 /usr/bin/passwd를 실행합니다.

    RUID는 user2가 되지만 해당 프로세스의 EUID는 root가 됩니다.

    user2는 자신의 비밀번호를 변경하기 위해서만 passwd를 사용할 수 있습니다. 내부적으로 passwd가 RUID를 확인하고, 그것이 root가 아니라면 그 동작은 실제 사용자의 비밀번호로 제한되기 때문입니다.

    passwd의 경우 EUID가 root가 되는 것이 필요합니다. 그 이유는 프로세스가 /etc/passwd 및/또는 /etc/shadow에 쓰기 작업을 해야 하기 때문입니다.

    유용한 자료:

    • 실제 사용자 ID, 유효 사용자 ID, 저장된 사용자 ID의 차이점 (원본)
    • pid, ppid, uid, euid, gid, egid의 차이점은 무엇인가요?

    유용한 자료:

    • 리눅스가 내 램을 먹었어!
    • 리눅스에서 스왑 공간을 사용하는 프로세스를 확인하는 방법?
    • 리눅스에서 스왑 공간 사용량을 모니터링하는 8가지 유용한 명령어
    • 우분투 서버에서 스왑이 완전히 사용되었을 때의 위험은 무엇인가요?
    • 여유 RAM이 있을 때 스왑을 비우는 방법?
    Umask파일 결과디렉터리 결과
    000666 rw- rw- rw-777 rwx rwx rwx
    002664 rw- rw- r--775 rwx rwx r-x
    022644 rw- r-- r--755 rwx r-x r-x
    027640 rw- r-- ---750 rwx r-x ---
    077600 rw---- ---700 rwx --- ---
    277400 r-- --- ---500 r-x --- ---

    유용한 자료:

    • Umask란 무엇이며 리눅스에서 기본 umask를 설정하는 방법은?
    root@kitploit:~
    **고정 비트**
    
    고정 비트는 반면에 `t`로 표시되며, 예를 들어 `/tmp` 디렉토리와 같습니다:```bash
    ls -l /|grep tmp
    drwxrwxrwt. 168 root root 28672 Jun 14 08:36 tmp
    

    이 비트는 실제 의미를 고려하면 항상 '제한된 삭제 비트(restricted deletion bit)'라고 불려야 했습니다. 이 모드 비트가 활성화되면 디렉터리 내에서 사용자가 소유한 파일과 디렉터리만 삭제할 수 있도록 제한합니다.

    유용한 리소스:

    • 스티키 비트는 어떻게 작동하나요? (원본)
    • LC_ALL=C는 무엇을 하나요? (원본)
    • LC_ALL=C로 grep 검색 속도 향상

    SELinux를 사용한다면 보안 컨텍스트를 기억하세요:```bash chcon -R system_u:object_r:httpd_sys_content_t /var/www/app01

    root@kitploit:~
    **7) 보안 실수**
    
    - **root** 소유자로 설정된 파일 및 디렉토리
    - **root**는 웹사이트 디렉토리에서 어떤 파일도 실행하지 않으며, 그곳에 파일을 생성해서는 안 됨
    - **777**과 같이 너무 넓은 권한 설정으로 일부 중요 파일이 전역 쓰기 및 읽기 가능 상태가 되는 경우
    - suid root가 설정된 유지보수 스크립트나 기타 중요 파일 생성을 피해야 함
    
    사이트 코드를 구성하는 파일을 사이트에서 수정할 수 있게 허용하면, 누군가가 서버를 장악하기 훨씬 쉬워집니다.
    
    파일 업로드 도구를 사용하면 사용자는 임의의 이름과 내용을 가진 파일을 업로드할 수 있습니다. 이로 인해 사용자는 메일 릴레이 PHP 스크립트를 사이트에 업로드할 수 있으며, 원하는 위치에 배치하여 서버를 원치 않는 상업 이메일을 전달하는 머신으로 만들 수 있습니다. 이 스크립트는 데이터베이스의 모든 이메일 주소나 기타 개인 정보를 읽는 데도 사용될 수 있습니다.
    
    악의적인 사용자가 내용은 제어할 수 없지만 임의의 이름으로 파일을 업로드할 수 있다면, `index.php`(또는 다른 중요 파일)를 덮어쓰는 파일을 쉽게 업로드하여 사이트를 손상시킬 수 있습니다.
    
    유용한 자료:
    
    - [How to setup linux permissions for the WWW folder?](https://serverfault.com/questions/124800/how-to-setup-linux-permissions-for-the-www-folder)
    - [What permissions should my website files/folders have on a Linux webserver?](https://serverfault.com/questions/357108/what-permissions-should-my-website-files-folders-have-on-a-linux-webserver)
    - [Security Pitfalls of setgid Programs](https://www.agwa.name/blog/post/security_pitfalls_of_setgid_programs)
    
    </details>
    
    <details>
    <summary><b>런 레벨 3에서 `telinit 1`을 실행하면 init이 어떤 단계를 수행하나요? 최종 결과는 무엇인가요? `reboot` 명령 대신 `telinit 6`을 사용하면 서버가 재시작되나요? ***</b></summary><br>
    
    작성 필요.
    
    유용한 자료:
    
    - [What differences it will make, if i use “telinit 6” instead of “reboot” command to restart my computer?](https://unix.stackexchange.com/questions/434560/what-differences-it-will-make-if-i-use-telinit-6-instead-of-reboot-command)
    
    </details>
    
    <details>
    <summary><b>루트 비밀번호를 잊어버렸습니다! BSD에서 어떻게 해야 하나요? 싱글 유저 모드로 부팅하는 목적은 무엇인가요?</b></summary><br>
    
    시스템을 재시작하고, `Boot:` 프롬프트에서 `boot -s`를 입력하여 **싱글 유저 모드**로 진입합니다.
    
    사용할 셸에 대한 질문이 나오면 `Enter`를 누르면 `#` 프롬프트가 표시됩니다.
    
    `mount -urw /`를 입력하여 루트 파일 시스템을 읽기/쓰기로 다시 마운트한 후, `mount -a`를 실행하여 모든 파일 시스템을 다시 마운트합니다.
    
    `passwd root`를 실행하여 루트 비밀번호를 변경한 다음 `exit`를 실행하여 부팅을 계속합니다.
    
    **싱글 유저 모드**는 기본적으로 루트 권한으로 로그인하여 거의 모든 것을 변경할 수 있게 해줍니다. 예를 들어, 손상된 마스터 데이터베이스나 시스템 데이터베이스를 복구하거나 서버 구성 옵션(예: 비밀번호 복구)을 변경할 때 싱글 유저 모드를 사용할 수 있습니다.
    
    유용한 자료:
    
    - [FreeBSD Reset or Recover Root Password](https://www.cyberciti.biz/tips/howto-freebsd-reset-recover-root-password.html)
    - [Single User Mode Definition](http://www.linfo.org/single_user_mode.html)
    
    </details>
    
    <details>
    <summary><b>텍스트 편집기를 사용하지 않고 텍스트 파일을 수정하려면 어떻게 해야 하나요?</b></summary><br>
    
    예를 들어:<br>```bash
    # cat  >filename ... - overwrite file
    # cat >>filename ... - append to file
    cat > filename << __EOF__
    data
    __EOF__
    

    유용한 리소스:

    • UNIX/Linux inode 기본 개념 예제로 이해하기
    • POSIX에서 정의한 inode란 무엇인가?
    • 사용 가능한 모든 여유 공간 확장:```bash lvextend -l +100%FREE /dev/vgroup/lvolume
    root@kitploit:~
    그리고 `resize2fs` 또는 `xfs_growfs`를 사용하여 파일시스템 크기 조정:
    
    - ext 파일시스템의 경우:```bash
    resize2fs /dev/vgroup/lvolume
    
    • xfs 파일 시스템의 경우:```bash xfs_growfs mountpoint_for_/dev/vgroup/lvolume
    root@kitploit:~
    유용한 리소스:
    
    - [논리 볼륨 확장하기](https://www.tldp.org/HOWTO/LVM-HOWTO/extendlv.html)
    
    </details>
    
    <details>
    <summary><b>좀비/디펑트(defunct) 프로세스란 무엇인가요?</b></summary><br>
    
    `exit` 시스템 호출을 통해 실행을 완료했지만 프로세스 테이블에 항목이 남아 있는 프로세스입니다. 즉, "**종료 상태**"에 있는 프로세스입니다.
    
    **defunct**로 표시된 프로세스는 부모 프로세스가 제대로 소멸시키지 않아 남아 있는 죽은 프로세스(소위 "좀비")입니다. 부모 프로세스가 종료되면 init이 이러한 프로세스를 제거합니다.
    
    유용한 리소스:
    
    - [디펑트(defunct) 프로세스란 무엇이며, 왜 종료되지 않나요?](https://askubuntu.com/questions/201303/what-is-a-defunct-process-and-why-doesnt-it-get-killed)
    
    </details>
    
    <details>
    <summary><b>프로덕션 환경에서 시스템을 업그레이드/업데이트하는 적절한 방법은 무엇인가요? 이러한 과정을 자동화하시나요? 다운타임을 설정하시나요? 권장 사항을 작성해 주세요. ***</b></summary><br>
    
    작성 예정.
    
    </details>
    
    <details>
    <summary><b>MySQL 서버를 구성하는 동안 친구가 묻습니다: <i>mysql을 설치한 후 <code>sudo mysql_secure_installation</code>을 실행해야 하나요?</i> 이에 대해 어떻게 생각하시나요? </b></summary><br>
    
    이 명령어는 다음과 같은 많은 보안 옵션을 제공하므로 실행하는 것이 좋습니다:
    
    - root 계정에 비밀번호를 설정할 수 있습니다.
    - 로컬 호스트 외부에서 접근 가능한 root 계정을 제거할 수 있습니다.
    - 익명 사용자 계정을 제거할 수 있습니다.
    - 기본적으로 익명 사용자가 접근할 수 있는 test 데이터베이스를 제거할 수 있습니다.
    
    유용한 리소스:
    
    - [mysql_secure_installation의 목적은 무엇인가요?](https://stackoverflow.com/questions/20760908/what-is-purpose-of-using-mysql-secure-installation)
    
    </details>
    
    <details>
    <summary><b><code>kill</code> 명령어를 올바르게 사용하는 방법을 제시하고 설명하세요.</b></summary><br>
    
    프로세스를 종료할 때, 절대적으로 필요한 경우가 아니라면 `kill -9/SIGKILL`을 사용하지 마세요. 이 kill은 무차별적인 방식으로 인해 문제를 일으킬 수 있습니다.
    
    항상 다음과 같은 간단한 절차를 사용하세요:
    
    - 먼저 **SIGTERM** (`kill -15`) 신호를 보냅니다. 이 신호는 프로세스에 종료를 지시하며 일반적으로 깔끔하게 종료할 때 사용하는 신호로 받아들여집니다. (단, 이 신호는 무시될 수 있습니다.)
    - 그런 다음 **SIGHUP** (`kill -1`) 신호를 보냅니다. 이 신호는 일반적으로 프로세스에 종료 후 재시작을 지시하는 데 사용되며, 이 신호도 프로세스에 의해 가로채져 무시될 수 있습니다.
    
    대부분의 경우 이것만으로 충분하며 훨씬 더 깔끔합니다.
    
    유용한 리소스:
    
    - [kill -9를 사용하지 말아야 할 때는 언제인가요?](https://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process)
    - [SIGTERM vs. SIGKILL](https://major.io/2010/03/18/sigterm-vs-sigkill/)
    
    </details>
    
    <details>
    <summary><b><code>strace</code> 명령어는 무엇이며 어떻게 사용해야 하나요? 이미 실행 중인 프로세스에 연결하는 예시를 설명하세요.</b></summary><br>
    
    `strace`는 Linux와 같은 Unix 계열 운영 체제에서 프로그램을 디버깅하고 문제를 해결하기 위한 강력한 명령줄 도구입니다. 프로세스가 수행하는 모든 시스템 호출과 프로세스가 수신하는 신호를 캡처하여 기록합니다.
    
    **Strace 개요**
    
    `strace`는 가벼운 디버거로 볼 수 있습니다. 프로그래머/사용자가 프로그램이 OS와 어떻게 상호작용하는지 빠르게 파악할 수 있게 해줍니다. 시스템 호출과 신호를 모니터링하여 이를 수행합니다.
    
    **용도**
    
    소스 코드가 없거나 자세히 살펴보고 싶지 않을 때 유용합니다. 또한 **GDB**를 열고 싶지 않지만 외부 상호작용을 이해하는 데 관심이 있을 때 자신의 코드에도 유용합니다.
    
    **프로세스에 연결하는 예시**
    
    `strace -p <PID>` - 프로세스를 strace에 연결합니다.
    
    `strace -e trace=read,write -p <PID>` - 이렇게 하면 특정 이벤트(예: 여기서는 읽기 및 쓰기)에 대해 프로세스/프로그램을 추적할 수도 있습니다. 따라서 프로세스의 읽기 및 쓰기 시스템 호출을 포함한 모든 이벤트를 출력합니다.
    
    기타 예시:
    
    - `-e trace=network` - 모든 네트워크 관련 시스템 호출을 추적합니다.
    - `-e trace=signal` - 모든 신호 관련 시스템 호출을 추적합니다.
    - `-e trace=ipc` - 모든 IPC 관련 시스템 호출을 추적합니다.
    - `-e trace=desc` - 모든 파일 디스크립터 관련 시스템 호출을 추적합니다.
    - `-e trace=memory` - 모든 메모리 매핑 관련 시스템 호출을 추적합니다.
    
    유용한 리소스:
    
    - [strace는 어떻게 사용해야 하나요? (원본)](https://stackoverflow.com/questions/174942/how-should-strace-be-used)
    - [strace는 어떻게 이미 실행 중인 프로세스에 연결되나요? (원본)](https://stackoverflow.com/questions/7482076/how-does-strace-connect-to-an-already-running-process)
    - [strace: 재미, 이득, 디버깅을 위해](http://timetobleed.com/hello-world/)
    
    </details>
    
    <details>
    <summary><b>접근 제어 목록을 <code>chmod</code> 명령어 대신 또는 함께 사용하는 경우는 언제인가요? ***</b></summary><br>
    
    작성 예정.
    
    </details>
    
    <details>
    <summary><b><code>/etc/shadow</code> 파일에서 지원되는 알고리즘은 무엇인가요?</b></summary><br>
    
    일반적인 현재 알고리즘은 다음과 같습니다:
    
    - MD5
    - SHA-1 (SHA라고도 함)
    
    둘 다 더 이상 암호화/보안 목적으로 사용해서는 안 됩니다!!
    
    - SHA-256
    - SHA-512
    - SHA-3 (KECCAK이 2012년 10월 새로운 연방 승인 해시 알고리즘 경쟁에서 우승자로 발표되었습니다)
    
    유용한 리소스:
    
    - [Linux 비밀번호를 암호화하는 데 사용되는 알고리즘은 무엇인가요?](https://crypto.stackexchange.com/questions/40841/what-is-the-algorithm-used-to-encrypt-linux-passwords)
    - [비밀번호를 난독화하는 데 사용된 해싱 알고리즘을 찾는 방법은 무엇인가요?](https://unix.stackexchange.com/questions/430141/how-to-find-the-hashing-algorithm-used-to-obfuscate-passwords)
    
    </details>
    
    <details>
    <summary><b>Unix 계열 시스템에서 ulimit의 용도는 무엇인가요?</b></summary><br>
    
    Linux와 BSD를 포함한 대부분의 Unix 계열 운영 체제는 프로세스별, 사용자별로 스레드, 파일, 네트워크 연결과 같은 시스템 리소스 사용을 제한하고 제어하는 방법을 제공합니다. 이러한 "**ulimits**"는 단일 사용자가 너무 많은 시스템 리소스를 사용하는 것을 방지합니다.
    
    </details>
    
    <details>
    <summary><b>소프트 제한(soft limit)과 하드 제한(hard limit)이란 무엇인가요?</b></summary><br>
    
    **하드 제한**은 사용자에게 허용된 최대값으로, 슈퍼유저 또는 root가 설정합니다. 이 값은 `/etc/security/limits.conf` 파일에 설정됩니다. 사용자는 더 많은 리소스가 필요할 때 스스로 **소프트 제한**을 높일 수 있지만, **소프트 제한**을 **하드 제한**보다 높게 설정할 수는 없습니다.
    
    </details>
    
    <details>
    <summary><b>Redis와 함께 작동하도록 HAProxy를 구성하는 중 로그에서 <code>General socket error (Permission denied)</code>가 발생합니다. SELinux가 활성화되어 있습니다. CLI에서 기본적인 SELinux 문제 해결 방법을 설명하세요. ***</b></summary><br>
    
    유용한 리소스:
    
    - [CLI에서 기본 SELinux 문제 해결](https://access.redhat.com/articles/2191331)
    
    </details>
    
    <details>
    <summary><b>RSA 키 로그인을 구성했지만 서버에서 예상대로 <code>Server refused our key</code>가 표시됩니다. 문제 원인을 어디에서 찾아야 하나요?</b></summary><br>
    
    **서버 측**
    
    `/etc/ssh/sshd_config` 파일에서 `LogLevel VERBOSE`를 설정하는 것이 아마 필요한 설정일 것입니다. 더 높은 수준도 있지만요:
    
    SSH 인증 실패는 `/var/log/auth.log`, `/var/log/secure` 또는 `/var/log/audit/audit.log`에 기록됩니다.
    
    다음 명령어는 SSH 관련 로그 줄만 출력합니다 (예시):```bash
    grep 'sshd' /var/log/auth.log
    

    다음으로, 실패한 모든 SSH 로그인을 나열하는 가장 간단한 명령어는 아래와 같습니다:```bash grep "Failed password" /var/log/auth.log

    root@kitploit:~
    또한 유용한 것은:```bash
    grep "Failed\|Failure" /var/log/auth.log
    

    최신 Linux 배포판에서는 Systemd 데몬이 유지하는 런타임 로그 파일을 journalctl 명령어로 조회할 수 있습니다 (ssh.service 또는 sshd.service). 예를 들어:```bash journalctl _SYSTEMD_UNIT=ssh.service | egrep "Failed|Failure"

    root@kitploit:~
    **클라이언트 측**
    
    또한 SSH 클라이언트를 `-v|--verbose` 옵션과 함께 실행해야 합니다. 이는 첫 번째 수준의 상세 출력입니다. 다음으로, `-vv`와 같이 추가적인 (레벨 2 및 3) 상세 출력을 활성화하여 더 많은 디버깅 메시지를 볼 수 있습니다.
    
    유용한 리소스:
    
    - [SSH에서 디버깅 모드를 활성화하여 연결 문제 해결하기](https://www.tecmint.com/enable-debugging-mode-in-ssh/)
    
    </details>
    
    <details>
    <summary><b>대부분의 배포판이 XFS나 다른 파일시스템 대신 ext4를 사용하는 이유는 무엇인가요? 왜 이렇게 많은 파일시스템이 존재하나요? ***</b></summary><br>
    
    작성 예정입니다.
    
    </details>
    
    <details>
    <summary><b>프로젝트 관리자가 새 SQL Server가 필요합니다. 그/그녀에게 무엇을 물어보시겠습니까? ***</b></summary><br>
    
    DBA가 다음과 같은 질문을 하길 원합니다:
    
    - 데이터베이스 크기는 얼마나 될까요? (기존 서버에 데이터베이스를 추가할 수 있는지 여부)
    - 데이터베이스의 중요도는 어느 정도인가요? (클러스터링, 재해 복구, 고가용성 관련)
    
    </details>
    
    <details>
    <summary><b>임의의 값으로 100줄의 파일을 생성하세요.</b></summary><br>
    
    예를 들어:```bash
    cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 100 > /path/to/file