0. 과제 설명

가상 머신을 이용해 엄격한 규칙들로 이루어진 나만의 서버를 구현한다.



1. 필요 개념

Server

클라이언트의 요청을 받으면 서비스, 데이터를 제공하는 컴퓨터 혹은 프로그램(요청을 받으면 데이터를 보내주는 기계)

닭갈비집 알바생으로 비유하면 이해가 쉽다.
닭갈비 2인분 주세요~ 하면 닭갈비 2인분을 가져다 주는 것 처럼, 웹서버도 마찬가지로 네이버 웹툰 페이지 주세요~ 하면 네이버 웹툰 페이지를 가져다 준다. 이것이 서버다.

서버를 구축할 때, OS를 선택해야 한다. 운영체제의 종류는 다양하기 때문에 사용성에 맞는 적절한 서버 운영체제를 선택하는 것이 중요하다. 이후 그 운영체제로 돌아가는 서버를 다룬다.

Linux

  • GUI vs CLI Graphical User Interface vs Command-Line Interface

윈도우, 맥OS, 안드로이드, IOS 등은 일반인, 즉 개발자가 아닌 사람들을 대상으로 만들어진 운영체제이기 때문에 GUI로 만들어진 화면에서 만들어진 기능을 사용할 수 있도록 환경을 제공하는 데 초점이 맞춰져 있다.

리눅스는 버전에 따라 GUI도 제공하지만, 가장 큰 장점은 CLI로 사용자가 할 수 있는 무궁무진한 작업들이다. 타 OS들이 완제품이라면 리눅스는 프로그래밍을 할 줄 아는 프로그래머들이 얼마든 이것저것 만져보고 개조해 볼 수 있는 조립식 제품 같은 개념이다.

  • 오픈소스 운영체제

리눅스는 오픈소스 운영체제이다. 오픈소스라 함은 누구나 공짜로 가져다 쓸 수 있을 뿐 아니라, 그 설계도인 코드도 마음대로 들여다볼 수 있고 이를 원하는대로 개조할 수도 있다는 의미다. 리눅스를 사용할 때 Ubuntu, 민트, CentOS 등등 수많은 버전들 중에서 골라야 하는 건 바로 이 때문이다. 리누스 토르발즈가 만든 리눅스에서 출발했지만, 이를 필요에 따라 개조하고 발전시킨 여러 버전들이 만들어졌기 때문이다.

  • Linux 커널(kernel)

커널은 운영체제의 핵심으로 하드웨어와 프로그램 사이에서 인터페이스를 제공한다. OS의 최하단, 하드웨어를 상대하는 최전선에서 하드웨어를 직접 다루고 제어한다. 즉, 운영체제라는 소프트웨어의 존재이유이자 핵심.

Network

  • 네트워크란?

네트워크란 Net + Work의 합성어로 컴퓨터(노드)들이 그물처럼 연결되어 상호작용하는 통신 이용 형태를 말한다.

  • IP 주소란?

네트워크 환경에서 컴퓨터(노드)간에 통신하기 위해 각 컴퓨터에 부여된 네트워크상의 주소.
ip주소는 네트워크 주소와 호스트 주소로 나뉜다.
192.163.0.101 이라는 ip 주소가 있다고 하자.
192.168.0은 네트워크 주소이고, 101은 호스트 주소가 된다.
네트워크 주소는 공통적인 부분이고(ex. 서울시 중랑구 면목동 @@아파트 105동), 호스트 주소가 유일한 식별자 역할을 한다(ex. 202호).

Partition과 Mount

  • Partition

    • 하나의 물리적인 디스크를 여러개의 논리적 디스크로 나누는 것.
    • Primary Partition은 하드 MBR에 기록되는 4개의 파티션을 말한다. 각각의 파티션별로 시작, 끝 지점이 기록되어 있고, OS의 디스크 드라이버는 이것을 인식하고 이 영역 내에서만 쓴다.
    • Logical Partition은 파티션 하나를 내부적으로 파티션 몇 개로 나눈 것이고, 이 때 자기 자신을 몇 개로 나눈 파티션을 확장 파티션이라고 한다.
  • File System

    • 파일 시스템(File System)은 운영 체제에서 파일과 디렉토리를 구성하고 저장하는 방식이다. 파일 시스템은 디스크, CD-ROM 등의 저장 장치를 관리하고, 사용자와 프로그램이 파일을 읽고 쓰는 방법을 제공한다. 리눅스에서는 다양한 파일 시스템이 지원되며, 대표적으로 ext4, XFS, NTFS, FAT32 등이 있다. 각 파일 시스템마다 특정한 특징과 장단점이 있으며, 사용 목적에 따라 선택할 수 있다.
  • Mount

    • 파일 시스템을 운영 체제의 디렉토리 구조에 연결하는 것.
    • 리눅스 파일 단위로 모든 장치를 관리하기 때문에 새롭게 만든 파일 시스템을 사용하기 위해서는 디스크 장치를 임의의 디렉토리에 마운트 시켜 사용해야 한다. 마운트를 통해 해당 파일 시스템을 읽고 쓸 수 있게 되며, 해당 파티션의 파일이 디렉토리 구조에서 접근 가능해진다.
  • Mount Point

    • 파일 시스템을 운영 체제의 디렉토리 구조에 연결할 때 사용되는 디렉토리를 의미한다.
    • 마운트 포인트는 해당 파일 시스템의 루트 디렉토리 역할을 하며, 해당 파일 시스템 내의 파일과 디렉토리는 마운트 포인트를 통해 접근된다.
    • 예를 들어, ‘/dev/sda1’ 파티션을 ‘/mnt/data’ 디렉토리에 마운트하면, ‘mnt/data’는 해당 파티션의 루트 디렉토리가 된다. 따라서 ‘/mnt/data/file.txt’와 같은 경로로 파일에 접근할 수 있다.
    • 마운트 포인트는 일반적으로 빈 디렉토리를 사용한다. 디렉토리 내부에 다른 파일이나 디렉토리가 존재하면, 해당 디렉토리를 마운트 포인트로 사용할 수 없다.

LVM

LVM(Logical Volume Manager)는 리눅스의 저장 공간을 효율적이고 유연하게 관리하기 위한 커널의 한 부분이다.

LVM은 리눅스 안에서 하나의 디스크를 여러 파티션으로 분할해서 파일 시스템을 이용해 특정 디렉토리와 연결시켜 사용한다. 파티션을 논리적인 개념인 볼륨으로 나눠서 더 유동적으로 디스크의 용량을 관리할 수도 있다. 볼륨은 기본적으로 단일 파티션에 상주하게 되지만 다수의 파티션을 하나의 볼륨으로 관리할 수도 있다. 따라서 여러 개의 파티션을 합치거나 분할하기에 용이하다.

파티션

디스크는 파티션이라는 논리적인 크기로 분할/통합해서 사용한다. 하나의 디스크를 여러 개로 분할하기도 하고 여러 개의 디스크를 하나의 파티션으로 통합하기도 한다.

파티션은 고정적이고 물리적인 개념이 강하며 한 번 크기를 설정하면 변경하거나 추가하기 힘들고 OS는 각 파티션을 별도의 디스크처럼 인식한다.

볼륨

파일 시스템으로 포맷된 디스크 상의 저장 영역이라고도 하며 파티션과 비슷한 개념이지만 엄연히 다르다.

볼륨은 디스크의 단일 파티션에 상주하게 되며 파티션보다 논리적으로 유동적이다. 우리는 하나의 디스크를 여러 개의 파티션으로 나누어 사용한다. 이 때 볼륨은 파티션마다 하나씩 존재하기도 하고, 여러 파티션에 하나만 존재할 수도 있다.

LVM vs 일반 disk partitioning

LVM이 아닌 기존 방식의 경우, 하드 디스크를 파티셔닝 한 후 OS 영역에 마운트하여 read/write를 수행했다.

이 경우 저장 공간의 크기가 고정되어서 증설/축소가 어렵다. 이를 보완하기 위한 방법으로 LVM을 구성할 수 있다.

LVM은 파티션 대신에 volume이라는 단위로 저장 장치를 다룬다.

스토리지의 확장, 변경에 유연하며, 크기를 변경할 때 기존 데이터의 이전이 필요 없다.

/boot를 lvm 밖에 설정하는 이유는 lvm을 암호화해놨기 때문에, /boot를 lvm에 넣어놓으면 부트를 하지 못하기 때문이다. 부트를 해야 암호를 물어보던가 말던가 할 수 있다.


SSH

SSH(Secure SHell)는 컴퓨터와 컴퓨터가 인터넷과 같은 Public Network를 통해 서로 통신을 할 때 보안적으로 안전하게 사용하기 위해 사용하는 네트워크 *프로토콜이다.

대표적인 사용 예

  • 데이터 전송(소스 코드를 원격 저장소인 Github에 Push할 때)
  • 원격 제어(AWS와 같은 클라우드 서비스에 접속하여 해당 머신에 명령을 내릴 때)

FTP나 Telnet과 같은 다른 컴퓨터와 통신을 위해 사용하는 프로토콜도 있는 반면 SSH를 사용하는 이유는 ‘보안’이다. FTP, Talnet은 민감한 정보(로그인 정보 등)를 주고 받기에는 정보를 직접 네트워크를 통해 넘기기 때문에 누구나 해당 정보를 열어볼 수 있으므로 보안에 상당히 취약하다. 반면 SSH는 먼저 보안적으로 훨씬 안전한 채널을 구성한 뒤 정보를 교환하기 때문에 민감한 정보를 주고 받기에 훨씬 유용하다.

*프로토콜 : 복수의 컴퓨터 사이나 중앙 컴퓨터와 단말기 사이에서 데이터 통신을 원활하게 하기 위해 필요한 통신 규약. 신호 송신의 순서, 데이터의 표현법, 오류 검출법 등을 정함.

SSH 작동 원리

SSH는 다른 컴퓨터와 통신을 하기 위해 접속을 할 때 우리가 일반적으로 사용하는 비밀번호의 입력을 통한 접속을 하지 않는다. 기본적으로 SSH는 한 쌍의 Key를 통해 접속하려는 컴퓨터와 인증 과정을 거치게 된다.

한쌍의 키는 다음과 같다.

  • Private Key
  • Public Key

SSH는 암호화된 통신을 위해 사용되는 프로토콜로, 키 기반 인증을 지원합니다. 이것은 공개 키/개인 키 쌍을 사용하여 사용자를 인증하고 서버에 안전하게 로그인할 수 있도록 한다.

공개 키/개인 키 쌍은 두 개의 다른 키로 구성됩니다. 공개 키는 다른 사용자들과 공유할 수 있는 키이며, 개인 키는 단 하나의 소유자만이 액세스할 수 있는 비밀 키다.

공개 키는 보안적으로 안전하다. 개인 키를 알지 못하면 공개 키를 통해 암호화된 정보를 해독할 수 없기 때문이다. 공개 키는 일반적으로 사용자가 SSH 서버에 로그인하고자 할 때, SSH 클라이언트에서 서버에 보내지며, 서버는 이를 수신하고 인증을 위해 공개 키와 일치하는 개인 키를 요청한다.

반면에 개인 키는 항상 소유자에게 보관되어야 한다. 개인 키가 유출될 경우, 해당 키로 암호화된 모든 정보는 해독될 수 있으므로 보안에 매우 취약하다. 따라서 개인 키는 안전한 저장소에 보관해야 한다.

이러한 이유로, 공개 키/개인 키 쌍을 사용한 SSH 인증 방식은 매우 안전하고 널리 사용되고 있다.

TTY

TTY는 콘솔 또는 터미널을 의미하며, 사용자와 컴퓨터 간의 상호작용을 위한 인터페이스이다. 즉, TTY는 사용자가 컴퓨터와 상호작용할 때, 문자 기반 인터페이스를 제공하는 장치나 프로그램이다.

일반적으로 리눅스나 유닉스 시스템에서, 새로운 콘솔 창을 열거나 SSH 세션을 열 때마다 TTY가 생성된다. 이 TTY는 터미널 에뮬레이터를 통해 사용자와 컴퓨터 간의 상호작용을 가능하게 한다.

우리가 사용하는 리눅스 환경은 기본적으로 TTY(Teletypewriter) 위에 그려져 있다. 즉, 데스크탑 GUI(xwindows) 환경은 실질적으로 *콘솔 위에 올려져 있는 형태인 것이다.

콘솔은 CLI 혹은 CUI라고도 불리며 컴퓨터를 운용하기 위한 목적으로 텍스트를 사용자와 컴퓨터가 주고 받는 인터페이스를 말한다.

TTY는 일반적으로 /dev/ttyX 또는 /dev/pts/X의 형식으로 표현된다. 여기서 X는 TTY의 번호를 나타낸다. 예를 들어, /dev/tty1은 시스템의 첫 번째 TTY를 나타낸다.

전체 콘솔은 다음과 같은 구성을 가지고 있다.

  • /dev(device)
    • TTY(일반 CLI 콘솔)
      • TTYs(시리얼 tty)
      • PTS(기본 xwindows를 위한 가상 콘솔)
        • PTY(외부의 원격 접속을 위한 가상 콘솔)

콘솔 모드는 모니터, 키보드로 직접 본체에 연결된 모드를 말하고, 2번째 콘솔부터가 가상 콘솔이다. 2번째 모니터, 키보드는 실제로 존재하지 않으니까 가상(pseudo)이라는 말이 붙는다.

*콘솔 : 서버의 로컬 장치(물리적 터미널)에서 직접 명령어를 작성할 수 있는 입출력 장치. 콘솔이 물리적인 장치라면 터미널은 원격제어 환경까지 포함하는 더 넓은 의미라고 할 수 있다.

AppArmor

리눅스 커널에서 동작하는 보안 모듈 중 하나로, 프로세스가 사용할 수 있는 파일, 디렉토리, 네트워크 포트 등의 자원에 대한 접근을 제한하는 보안 기능을 제공한다.

기본적으로 시스템에서 실행 중인 프로세스들에게 보안 정책을 적용하며, 허용되지 않은 동작이나 시도를 감지하고 차단할 수 있다. 예를 들어, 특정 프로그램이 사용할 수 있는 파일이나 디렉토리를 제한하거나, 특정 프로그램이 인터넷에 연결되는 것을 막을 수 있다.

핸드폰 어플의 카메라, 위치 등의 접근 권한과 비슷하다.

*모듈 : 프로그램을 작성할 때 필요한 함수, 클래스, 변수, 상수 등의 코드 블록을 담고 있는 파일 단위. 모듈을 사용하면 코드를 재사용하고 구성 요소를 분리하여 개발 및 유지 보수를 용이하게 할 수 있다.

* MAC(Mandatory Access control) : 컴퓨터 보안에서 사용하는 용어로, 운영체제가 어떤 수행 객체(subject)의 다른 객체(object)로의 접근과 수행 기능을 제한하는 식으로 보안성을 높이는 기능을 의미한다. 운영체제가 직접 관여하기 때문에 이 보안 기능은 강제(Mandatory)된다.

* SELinux : 관리자가 시스템 액세스 권한을 효과적으로 제어할 수 있게 하는 Linux 시스템용 보안 아키텍처. Redhat 계열의 리눅스에서 사용한다.

Ubuntu Package Manager

  • apt

Advanced Package Tool의 약자로, apt-get을 개선한 패키지 관리 도구. apt는 패키지 설치, 업그레이드, 삭제, 의존성 해결 등을 자동으로 처리해준다. apt는 패키지 관리에 필요한 메타 데이터를 인터넷으로부터 다운로드해야 하기 때문에, 인터넷에 연결되어 있어야 한다.

  • dpkg

Debian Package의 약자로, 패키지 설치와 관리를 위한 기본적인 도구이다. dpkg는 패키지를 직접 설치, 삭제하며, 파일 시스템과 관련된 작업을 수행한다. dpkg는 apt-get과 같은 고급 패키지 관리 도구의 기반 기술로 사용된다.

  • aptitude

aptitude는 apt와 비슷한 고급 패키지 관리 도구이다. apt와 마찬가지로 패키지 설치, 업그레이드, 삭제, 의존성 해결 등을 처리한다. aptitude는 apt와 달리 패키지 관리에 대한 명령어를 더 많이 제공하며, 대화형 인터페이스도 제공한다. CLI(Command Line Interface)인 apt과 달리 CUI(Command-line User Interface)를 기반으로 하기 때문에 더 직관적이고 사용자 친화적인 UI를 제공한다.

이들 패키지 관리 도구는 모두 Debian 계열 리눅스에서 사용되며, Ubuntu와 같은 다른 Debian 기반 배포판에서도 널리 사용된다. 이들 도구는 리눅스 시스템에서 패키지 관리를 자동화하고, 개발자 및 시스템 관리자가 소프트웨어 설치와 유지 보수를 효율적으로 수행할 수 있도록 도와준다.

Firewall

네트워크 방화벽은 시스템과 외부 소스 사이에 장벽을 형성한다. 본질적으로 외부에서 발생한 피해가 확산하여 소중한 내부 데이터를 손상시키지 못하도록 차단한다.

방화벽은 다음과 같이 작동한다.

  1. 검사 : 시스템으로 송수신되는 *트래픽을 바이트 단위로 빈틈없이 검사한다.
  2. 결정 : 허용할 작업 또는 특성을 정의합니다. 이 때 정해진 규칙과 비교하여 트래픽을 결정한다.
  3. 실행 : 규칙에 부합하는 트래픽은 허용되며, 그렇지 않은 트래픽은 거부된다.

* 트래픽 : 네트워크에서 “트래픽”은 전송되는 데이터의 양을 의미한다. 즉, 네트워크를 통해 전송되는 모든 데이터의 양을 말한다. 이러한 데이터는 인터넷을 통해 이메일, 웹 페이지, 파일, 미디어 스트림 등 다양한 형태로 전송될 수 있다.

UFW

ufw는 Uncomplicated Firewall의 약자로, Ubuntu 및 Debian 기반 시스템에서 사용할 수 있는 간단한 방화벽 도구이다. ufw는 iptables(기본적인 방화벽 명령어)를 기반으로 하며, 쉬운 사용성과 간단한 구성을 통해 시스템 보안을 유지할 수 있도록 도와준다. 명령줄 인터페이스를 제공하기 때문에 사용자가 수동으로 iptables 규칙을 작성하는 것보다 더 쉽게 사용할 수 있다.

ufw를 사용해 다음과 같은 작업을 수행할 수 있다.

  • 특정 포트의 트래픽 허용 또는 차단
  • 특정 IP 주소 또는 IP 대역의 트래픽 허용 또는 차단
  • 다양한 프로토콜 (TCP, UDP 등)의 트래픽 허용 또는 차단

Gateway

쉽게 말하면 다른 네트워크로 가기 위한 문이다. 서로 다른 프로토콜을 가진 네트워크를 연결하기 위한 translator다. 서로 다른 네트워크 대역을 가진 네트워크끼리 통신을 하려고 하면, 우선 Gateway로 간 후 목적지를 찾아간다.

예를 들어, 하나의 네트워크를 집이라고 하면, 우리가 네트워크가 틀린(옆집) 집으로 가려면 현관문을 거쳐야 우리집이 아닌 다른 곳으로 갈 수가 있다. Gateway도 마찬가지다. 내가 사용하는 네트워크(ex. 192.168.10.0)에서 다른 네트워크(172.16.20.0) 대역으로 통신을 하려면, Gateway를 거쳐야만 통신이 가능하다. 보통 같은 네트워크에서는 *MAC Address를 이용해서 통신을 하기 때문에 Gateway를 몰라도 통신이 가능하다. 같은 네트워크 대역일 때, 즉 아파트 같은 103동일 때 105호에서 1203호를 가도 아파트 현관을 거치지 않아도 되는 것과 마찬가지.

* MAC Address : 주민등록번호와 같이 단 하나의 고유한 주소를 부여해서 통신을 할 수 있도록 만든 일종의 하드웨어 주소

Port Forwarding

포트포워딩은 공유기의 포트를 통해 이 공유기와 연결된 기기들이 특정 포트에 진입할 수 있게 하는 기능이다.

만약 공유기에 컴퓨터와 핸드폰이 연결되어 있는데 그냥 공유기 주소 + 포트번호로 입력한다면 공유기의 ‘어느 기기’의 포트로 들어가야 하는지 알 수 없다. 따라서 포트 포워딩은 공유기에 연결된 기기의 포트를 특정 번호를 통해 전달(forwarding)해 주는 것이라고 이해할 수 있다. 또는 공유기에 기기 + 해당 기기의 포트에 해당하는 포트 번호를 할당해 준다고 봐도 된다. 예를 들어 공유기의 180포트로 접속하면 핸드폰의 5000 포트에 접속하게 하고, 280포트로 접속하면 컴퓨터의 5000포트에 접속하게 하는 것이다. 여기서 180, 280 등을 지정하는 작업이 포트포워딩이다.

명령어 저장 위치

| 디렉토리 | 용도 | 사용권한 | | :—: | :—: | :—: | | /bin | 기본적인 명령어 | 일반 사용자 | | /sbin | 시스템 관리를 위한 명령어 | 슈퍼 유저(root) | | /usr/bin | /bin에 있는 명령어를 제외한 기본적인 명령어 | 일반 사용자 | | /usr/sbin | /sbin에 있는 명령어를 제외한, 시스템 관리를 위한 명령어 | 슈퍼 유저(root) |

Shell & Shell Script

Shell

쉘은 커널과 사용자 간의 다리 역할을 하는 것으로 사용자로부터 명령을 받아 명령을 해독하고 프로그램을 실행하는 역할을 한다. 즉, 사용자가 사용자 프로그램을 이용해 명령어를 입력하면 사용자가 이용하는 쉘이 명령을 받아 커널에 전달해 준다.

쉘 스크립트는 쉘에게 어떠한 명령을 할지 스크립트를 ‘.sh’ 파일 확장자로 작성하여 만든 파일이다. 확장자를 sh 파일로 하는 것은 리눅스 사용자에게 ASCII test 실행파일이라는 암묵적인 약속이다.

쉘 스크립트는

  1. 반복되는 작업의 자동화(cron)가 가능하다.
  2. 다른 프로그래밍 언어 보다 훨씬 더 빠른 경우가 많다.
  3. 컴파일 단계가 없기 때문에 스크립트는 디버깅을 하는 동안 빠르게 실행할 수 있다.
  4. 스크립트의 내용을 모르는 사용자도 실행할 수 있다.
  5. 모니터링, 데이터 백업, 복구, 보안, 인증 등 여러 상황에서 많이 활용된다.

CPU vs Virtual CPU(vCPU)

virtual CPU는 가상화 환경에서 사용되는 가상의 중앙 처리 장치이다. 가상 CPU는 호스트 컴퓨터의 물리적 CPU 자원을 사용하여 가상머신(VM)을 구동하면서 각 VM에게 독립적인 CPU 자원을 할당하는 방식으로 동작한다.

가상 CPU는 가상 머신에 대한 하드웨어 추상화를 제공하며, 여러 가상 CPU를 각각의 가상 머신에 할당함으로써 각각의 VM이 독립적으로 작동하도록 한다. 가상 CPU를 사용하면 여러 개의 가상 머신을 하나의 호스트 컴퓨터에서 실행할 수 있으며, 각각의 가상 머신은 서로 독립적으로 실행되어 상호 간에 영향을 미치지 않는다.

가상 CPU는 클라우드 컴퓨팅, 서버 가상화, 컨테이너 가상화 등에서 사용된다. 이를 통해 하나의 물리적 서버에서 여러 개의 가상 서버를 실행하여 하드웨어 자원을 효율적으로 사용할 수 있다.

Processor vs CPU vs Core

Processor

컴퓨터 운영을 위해 기본적인 명령어들을 처리하고 반응하기 위한 논리회로이다. 보통 소프트웨어의 지시를 읽고 하드웨어의 다른 부분으로 신호를 보내는 제어장치(Control Unit)와 덧셈, 뺄셈 등 사칙연산과 AND, OR과 같은 논리연산 등을 담당하는 연산장치(ALU)로 구성된다. 디바이스가 해야할 일을 총 지휘하는 프로세서를 CPU라고 하며, CPU의 기능을 보조하는 프로세서를 보조 프로세서(Coprocessor)라고 한다. 그러나 프로세서라는 용어는 점차 CPU라는 용어를 대체해왔다.

CPU

컴퓨터를 뇌에 비유하자면 단기기억 담당은 RAM, 장기기억은 하드디스크, CPU는 사고를 담당하는 대뇌피질 정도로 볼 수 있다. 대뇌피질 없이 인간의 사고가 성립하지 않듯이 컴퓨터도 CPU 없이는 그냥 전기 잡아먹는 기계가 된다.

간단하게 말하자면 컴퓨터의 뇌와 같다.

컴퓨터의 구성 단위 중 기억, 연산, 제어의 3대 기능을 종합하는 장치이고 컴퓨터의 가장 중요한 부분이다.

Core

코어란 각종 연산을 하는 CPU의 핵심요소이며, CPU 내부에는 코어 말고도 컨트롤러, 캐시메모리 등이 있다. A가 혼자 100의 일을 다 하기에는 힘들지만 B와 함께 50씩 나눠서 일을하면 일처리가 빠르고 편할 것이다. 이것이 코어의 개념이다.

lighttpd, MariaDB, PHP

lighttpd

경량 웹서버. 적은 메모리와 CPU 자원으로 높은 성능을 내는 것이 특징. Apache와 NGINX가 가장 많이 쓰이는 웹서버이다.

PHP

서버 측에서 동작하는 웹 프로그래밍 언어로, Personal HomePage tools의 약자이다. PHP는 주로 동적 웹 사이트, 웹 애플리케이션 및 웹 서비스를 개발하는 데 사용된다. 무료이며 오픈 소시이기 때문에 다양한 개발자들에게 널리 사용되고 있다. PHP는 웹 개발에 필요한 기능을 포함하고 있으며, 데이터베이스 연결, 파일 업로드 및 처리, 세션 관리, 쿠키 처리 등을 쉽게 구현할 수 있다.

MariaDB

MariaDB는 MySQL 데이터베이스 관리 시스템의 분기 버전이다. MySQL과 동일한 구조와 기능을 제공하며, MySQL과 호환되는 대부분의 애플리케이션 및 도구들과 호환된다.

WordPress

워드프레스는 오픈소스 기반 설치형 블로그 또는 CMS이다.

CMS : Contents Management System의 약자로 게시판, 레이아웃, 모듈 등을 쉽게 관리할 수 있는 프로그램.

언어는 PHP를 사용하고 있다. 설치형 블로그는 무료로 사용할 수 있고, CMS는 유료.

* wget : wget은 웹사이트에서 파일을 다운로드하는 데 사용되는 커맨드 라인 도구이다. 이를 사용하여 웹 서버에서 파일을 직접 다운로드하거나 FTP 서버에서 파일을 가져올 수 있다. ‘wget’은 많은 옵션을 제공하여 다운로드 속도를 제어하고 재시도 횟수를 지정하고, 다운로드 중에 끊어진 연결을 자동으로 다시 연결하고, 다운로드 된 파일에 대한 각종 정보를 표시할 수 있다.

2. 명령어

apt-get(Advanced Packaging Tool)은 우분투(Ubuntu)를 포함한 데비안(Debian)계열의 리눅스에서 쓰이는 패키지 관리 명령어 도구이다.

Package

  • dpkg –get-selections : 설치되어 있는 package 확인
  • apt-get install sudo : sudo 설치
  • apt-get update : 운영체제에서 사용 가능한 패키지들과 그 버전에 대한 정보를 업데이트. 설치되어 있는 패키지를 최신으로 업데이트하는 것이 아닌, 설치가능한 리스트를 업데이트하는 것. → apt-get install 명령을 이용해서 특정 패키지를 설치할 수 없는 경우 패키지 리스트를 최신으로 업데이트 해야 할 필요가 있다.
  • apt-get upgrade : 운영체제에 apt-get install 명령으로 설치한 패키지들을 최신 버전으로 업그레이드 하는 명령어이다. apt-get upgrade 명령을 이용하면 apt-get update로 가져온 각 패키지들의 최신 버전에 맞게 업그레이드를 해준다.
  • apt list <package name> : 패키지 설치 확인

SUDO

  • su - : 사용자 계정에서 root 계정 로그인
  • su - $username : 루트 계정에서 사용자 계정으로 로그인
  • visudo : sudo 권한을 편집. /etc/sudoers에 접근해 직접 편집할 수도 있지만, 문법체크를 해주는 visudo를 쓰는 게 좋다.
  • usermod -aG sudo <username> : 해당 유저를 sudo 그룹에 추가

PASSWORD

  • chage -l <username> : 현재 사용자의 암호정보 확인
  • sudo vi /etc/pam.d/common-password : 현재 패스워드 정책 확인
  • sudo vim /etc/login.defs : 패스워드 정책 커스텀
  • sudo apt install libpam-pwquality : 패스워드 정책 설정에 필요한 모듈 설치
  • passwd -e <username> : 계정 비밀번호 변경. 명령어를 입력 → logout → 다시 로그인 할 때 비밀번호 변경

/etc, /usr/etc 디렉토리는 시스템의 부팅, 셧다운 시에 필요한 파일들과 시스템의 전반에 걸친 설정 파일들 및 초기 스크립트 파일들이 있다. 시스템에 어떤 문제가 생긴다거나, 시스템 전체 환경에 관한 설정을 바꾸기 위해서는 이들 디렉토리 내에 포함되어 있는 파일들에 대하여 잘 알아야 한다.

USER

  • sudo adduser <username> : 새 사용자 계정 생성

  • sudo usermod -aG sudo <username> : sudo 그룹에 사용자 추가

  • sudo deluser username : 사용자 삭제

  • hostnameclt : hostname 확인

  • hostnamectl set-hostname --static <username> : hostname 변경(재부팅 해야함)

  • groupadd user42 : 그룹 추가

  • lsblk : 파티션 구조 확인

  • ss -tunlp : 수신 포트를 확인

  • reboot : 재부팅. 설정이 반영이 안됐을 때는 재부팅 해보자.

IP

  • ip addr : ip 확인
  • ip route : gateway 확인
  • ipconfig getifaddr en0 : 현재 사용중인 Mac의 ip 확인
  • id <username> : user의 그룹 확인

UFW

  • ufw status : ufw 상태 확인
  • ufw enable : ufw 실행
  • ufw disable : ufw 중지
  • ufw allow 4242/tcp : 4242번 포트를 allow
  • ufw delete allow 8080/tcp : 8080번 포트를 delete

AppArmor

  • aa-enabled : AppArmor 실행여부 확인

CRON

  • crontab -e : crontab 실행
  • crontab -l : crontab 내용 확인
  • crontab -r : 크론탭 삭제
  • systemctl disable cron
  • sudo /etc/init.d/cron stop


SSH

  • vi /etc/ssh/sshd_config : ssh 서버 설정 파일 vi로 열기(client는 ssh_config 파일)


BONUS

  • lighttpd -v : lighttpd version 확인
  • systemctl stop/start/enable/status lighttpd.service : lighttpd 서버 중지, 시작, 상태 확인
  • vim /etc/lighttpd/conf-available/15-fastcgi-php.conf : lighttpd의 fastcgi 설정 파일 열기
  • systemctl stop/start/enable/disable/status mysql.service : mysql 중지, 시작, 상태 확인
  • mysql -u <username> -p : mysql 접속, -p option → passwd 입력
  • sudo vim /var/www/html/wordpress/wp-config.php
  • journalctl -f : 실시간 ssh 로그인 실패 기록
  • sudo systemctl status fail2ban
  • sudo vim /etc/fail2ban/jail.local : fail2ban 설정 파일 열기
  • sudo fail2ban-client status sshd : 차단 현황 보기
  • sudo fail2ban-client set sshd unbanip 000.000.000.000 : 차단 풀어주기

📬 Reference

https://www.howtoforge.com/how-to-install-lighttpd-with-php-and-mariadb-on-debian-10/

Leave a comment