Client-Side(Frontend) / Server-Side(Backend)

 

Monolithic Architecture / MSA

Monolithic Architecture

여러 기능이 하나의 거대한 단일 애플리케이션으로 통합된 전통적인 소프트웨어 개발 방식

 

모놀리식 아키텍처의 특징

  • 단일 코드베이스: 사용자 인터페이스, 비즈니스 로직, 데이터베이스 액세스 등 모든 기능이 하나의 코드베이스에 통합되어 있습니다.
  • 배포: 전체 애플리케이션 코드가 함께 배포됩니다.
  • 개발 단순성: 초기에는 개발이 비교적 간단하고, 하나의 애플리케이션을 빌드하고 배포하기 쉽습니다.

모놀리식 아키텍처의 단점

  • 확장성 한계: 애플리케이션이 커지면 코드가 복잡해져서 수정 및 관리가 어려워집니다.
  • 장애 영향: 일부 기능에서 장애가 발생하면 전체 애플리케이션에 영향을 줄 수 있습니다.
  • 기술 선택 제약: 전체 애플리케이션이 단일 기술 스택을 사용해야 하므로, 특정 기능에 최적의 기술을 선택하기 어렵습니다. 
Web <-> DB
AWS - 모놀리식 아키텍처를 타개하기 위해 만들어짐. 빅데이터 활용
라이브러리: 함수의 모음
라이브러리 목적: 기능 단위로 패치하기 위함

 

Microservices Architecture(MSA)

하나의 큰 애플리케이션을 특정 비즈니스 기능을 담당하는 작고 독립적인 서비스들의 모음으로 개발하는 아키텍처 스타일

 

MSA의 특징

  • 독립적인 서비스: 각 서비스는 특정 비즈니스 도메인에 집중하며, 독립적으로 개발, 배포, 확장이 가능합니다.
  • 느슨한 결합: 서비스 간 의존성이 낮아 특정 서비스의 장애가 다른 서비스로 전파되지 않아 장애 격리가 용이합니다.
  • 기술 다양성: 각 서비스에 가장 적합한 기술 스택(언어, 프레임워크 등)을 자유롭게 선택하여 사용할 수 있습니다.
  • 확장성: 개별 서비스의 부하에 따라 필요한 서비스만 독립적으로 확장(Scale-out)할 수 있어 효율적입니다.
  • API 기반 통신: 서비스들은 API(Application Programming Interface)를 통해 상호작용하며, 이는 외부와의 통신을 위한 표준화된 방법입니다. 

 

DevSecOps

 

클라우드
컨테이너화
ci cd pipeline / devops - 코드 베이스로 가동
보안도 인프라 영역을 알아야 한다.

 

* 스케일링

scale out: 리소스 늘림, 고가용성(HA)

scale in: 리소스 줄임

scale up: 스펙 늘림

scale down: 스펙 낮춤

 

CS(Client-Serever) Architecture

2-tier (client-db server)

3-tier (client-application server-db)

 

윈도우 '미티게이션(Mitigation)': 윈도우 시스템 어플리케이션 보호 기법

윈도우 '미티게이션(Mitigation)'은 공격자가 악용하는 기술을 차단하여 시스템의 보안을 강화하는 다양한 보안 기술과 기능의 집합체를 의미합니다. 이는 맬웨어, 바이러스, 메모리 기반 공격 등으로부터 시스템을 보호하며, 실시간 보호 기능, SmartScreen, 프로세스 완화 옵션 등이 대표적인 예시입니다.
API dictionary - internal / external
라이브러리 형태로 형식을 만듦
api 만들고 dictionary를 만들어야 api가 완성됨
내부 이용/외부 이용 구분
api pentest - dictionary 필요

 

 

Azure Serverless Architecture

Serverless Architecture

클라우드에서 function 기능을 제공

요청 단위 비용 청구

리소스 요청 - 재요청 관련 처리 문제

function 최적화가 중요

벤더 종속성이 높음 (ex. AWS)

 


 

가상화

  • 하드웨어를 소프트웨어로 생성
  • isolation
  • auto scaling
  • 성능 저하가 발생할 수 밖에 없는 구조. 왜? virtual device 위에 올려야 하기 때문에

컨테이너

  • 명령을 실행할 수 있는 라이브러리 모음
  • 가상화 X

 

가상화의 한계

: 성능 저하, 복잡한 관리, 높은 라이선스 및 하드웨어 비용, 새로운 보안 위협, 그리고 호스트 서버의 물리적 한계

-> 이러한 한계점들로 인해 최근에는 가상화의 단점을 보완하고 더 가볍고 효율적인 컨테이너 기술이 주목받고 있다. 

 

컨테이너의 필요성

: 컨테이너는 소프트웨어 개발 및 배포에서 환경 의존성을 제거하고 이식성과 확장성을 극대화하기 위해 필요합니다. 모든 실행에 필요한 요소들을 하나의 패키지에 포함하여, 개발, 테스트, 운영 환경 어디서든 일관된 실행 환경을 보장하며, 가상 머신(VM)보다 경량화되어 빠르고 효율적인 운영을 가능하게 합니다. 

 

가상화 vs 컨테이너

 

on premise 환경이 불필요

온프레미스(On-premise)는 기업이 자체 전산실에 서버, 소프트웨어 등 IT 인프라를 직접 구축하고 운영하는 방식

 

Docker

Docker는 애플리케이션을 컨테이너라는 표준화된 단위로 패키징하여 개발, 테스트, 배포 과정을 효율화하는 소프트웨어 플랫폼입니다. 
컨테이너 안에는 애플리케이션 코드와 실행에 필요한 모든 라이브러리, 시스템 도구, 런타임 등이 포함되어 있어 환경에 구애받지 않고 어디서든 일관되게 실행될 수 있습니다. 
이는 개발 환경과 운영 환경 간의 차이로 인한 오류를 줄여주고, 애플리케이션의 이식성을 높여줍니다. 

Kubernetes

쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 오픈소스 시스템입니다. 이는 여러 서버를 하나의 클러스터로 묶어, 사용자가 개별 서버가 아닌 추상화된 컴퓨팅 환경에서 애플리케이션을 쉽게 관리할 수 있게 해주는 컨테이너 오케스트레이션 플랫폼입니다. 줄임말로 K8s라고도 불립니다.

 

자바가 개발된 이유:
C언어는 하드웨어 아키텍처에 따라 컴파일을 다시 해줘야함. Java 는 JVM 세팅만 하면 실행 가능.
=> 개발자 위주의 언어. 코드를 해석할 수 있는 환경만 만들면 됨

 

EOL은 일반적으로 ' 수명 종료(End-of-Life)'를 의미하며, 제품이나 서비스가 더 이상 공급업체로부터 지원, 유지보수, 또는 업데이트를 제공받지 못하는 시점을 나타냅니다. 이 시점 이후에는 제품이 기술적으로 더 이상 유효하지 않게 되어 보안 문제에 취약해지며, 새로운 기능이 추가되지 않고 기존 문제에 대한 수정도 중단됩니다.

https://endoflife.date/docker-engine

Release Released Security Support Latest

28.5 2 weeks and 4 days ago(02 Oct 2025) Yes 28.5.1(08 Oct 2025)

버전 정보가 eol 됐다 → 해당 버전에 취약점이 존재할 가능성이 높다.

검색 키워드: docker 28.4 CVE details

 

Footprinting
목적: 공격 대상 시스템의 취약점, 보안 설정을 파악하고 공격 계획을 세우기 위함
방법: 조직의 프로필, 네트워크 구성, 호스트, 직원 정보, 제3자 파트너에 대한 정보를 수집
단계:
1. 평판 및 개요 수집
2. 네트워크 정보 수집 (IP 주소, 도메인 등)
3. 호스트 정보 수집 (운영체제, 열린 포트 등)
4. 직원 정보 수집 (이메일 주소 등)
5. 제3자 파트너 정보 수집

특징: 실제 공격 전에 이루어지는 필수적인 사전 작업
Banner Grabbing
네트워크상의 서비스나 시스템에서 반환되는 '배너'라 불리는 안내 메시지를 수집하여, 해당 시스템의 운영체제, 서비스 종류 및 버전에 대한 정보를 알아내는 기술
이는 시스템 관리자의 네트워크 인벤토리 확보는 물론, 침입자가 시스템의 취약점을 파악하는 데 활용될 수 있어 보안 관점에서 중요하게 다루어짐
PoC 코드(Proof of Concept 코드)
특정 아이디어나 기술의 실현 가능성을 증명하기 위해 만든 최소한의 기능 구현 코드
완벽한 제품이 아니라, 핵심 아이디어가 기술적으로 작동하는지를 빠르게 확인하는 것이 목적
소프트웨어 개발, 신기술 도입, 보안 취약점 검증 등 다양한 분야에서 활용됨

 

 

Docker 실습

# docker repository 추가
[user@client ~]$ sudo dnf config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>
[sudo] password for user:
Adding repo from: <https://download.docker.com/linux/centos/docker-ce.repo>

# 패키지 설치
[user@client ~]$ sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# systemd docker 서비스(dockerd) 시작 및 활성화
[user@client ~]$ sudo systemctl --now enable docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

# docker-ce: 이 패키지는 도커 컨테이너를 빌드하고 실행하는 데 사용되는 기본 기술을 제공합니다 (dockerd). 
# docker-ce-cli: 명령 줄 인터페이스 (CLI) 클라이언트 도커 도구 (docker)를 제공합니다.
# containerd.io: 컨테이너 런타임 (runc)을 제공합니다.
# docker-compose-plugin: 'docker compose' 하위 명령을 제공하는 플러그인입니다.
# docker 그룹에 user 추가
[user@client ~]$ sudo usermod -aG docker user
# 사용자 로그아웃 후 재로그인 해야 터미널 실행 시 docker 관련 명령어 실행 가능(환경변수 특성)

 

이미지 리스트

[user@client ~]$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[user@client ~]$ docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

 

이미지 검색

[user@client ~]$ docker search ubuntu
NAME                             DESCRIPTION                                     STARS     OFFICIAL
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   17709     [OK]
ubuntu/squid                     Squid is a caching proxy for the Web. Long-t…   119
ubuntu/nginx                     Nginx, a high-performance reverse proxy & we…   133
ubuntu/cortex                    Cortex provides storage for Prometheus. Long…   4
ubuntu/bind9                     BIND 9 is a very flexible, full-featured DNS…   116
ubuntu/kafka                     Apache Kafka, a distributed event streaming …   55
ubuntu/apache2                   Apache, a secure & extensible open-source HT…   97
ubuntu/prometheus                Prometheus is a systems and service monitori…   75
ubuntu/zookeeper                 ZooKeeper maintains configuration informatio…   13
ubuntu/mysql                     MySQL open source fast, stable, multi-thread…   70
ubuntu/jre                       Distroless Java runtime based on Ubuntu. Lon…   21
ubuntu/postgres                  PostgreSQL is an open source object-relation…   41
ubuntu/dotnet-aspnet             Chiselled Ubuntu runtime image for ASP.NET a…   25
ubuntu/redis                     Redis, an open source key-value store. Long-…   23
ubuntu/python                    A chiselled Ubuntu rock with the Python runt…   27
ubuntu/dotnet-deps               Chiselled Ubuntu for self-contained .NET & A…   15
ubuntu/dotnet-runtime            Chiselled Ubuntu runtime image for .NET apps…   21
ubuntu/grafana                   Grafana, a feature rich metrics dashboard & …   12
ubuntu/memcached                 Memcached, in-memory keyvalue store for smal…   5
ubuntu/prometheus-alertmanager   Alertmanager handles client alerts from Prom…   10
ubuntu/cassandra                 Cassandra, an open source NoSQL distributed …   2
ubuntu/mlflow                    MLFlow: for managing the machine learning li…   6
ubuntu/loki                      Grafana Loki, a log aggregation system like …   2
ubuntu/telegraf                  Telegraf collects, processes, aggregates & w…   4
ubuntu/chiselled-jre             [MOVED TO ubuntu/jre] Chiselled JRE: distrol…   3

 

이미지 다운로드

→ 컨테이너에 담는 것과는 다름. 설치만

→ namespace

[user@client ~]$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
4b3ffd8ccb52: Pull complete
Digest: sha256:66460d557b25769b102175144d538d88219c077c678a49af4afca6fbfc1b5252
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
[user@client ~]$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    97bed23a3497   2 weeks ago   78.1MB
[user@client ~]$ docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[user@client ~]$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

작고 빠르게 배포할 수 있는 것이 가상화의 단점

docker 명령어로 외부에서 프로세스를 확인할 수 있다는 점은 보안상 좋지 않음

[user@client ~]$ docker image inspect ubuntu:latest
[
    {
        "Id": "sha256:97bed23a34971024aa8d254abbe67b7168772340d1f494034773bc464e8dd5b6",
        "RepoTags": [
            "ubuntu:latest"
        ],
        "RepoDigests": [
            "ubuntu@sha256:66460d557b25769b102175144d538d88219c077c678a49af4afca6fbfc1b5252"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2025-10-01T13:01:37.838375075Z",
        "DockerVersion": "26.1.3",
        "Author": "",
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 78122856,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/027b371218dd9f60e7ef8d71ee634dbadc7095b58f17f24ad978bd23eb268a90/merged",
                "UpperDir": "/var/lib/docker/overlay2/027b371218dd9f60e7ef8d71ee634dbadc7095b58f17f24ad978bd23eb268a90/diff",
                "WorkDir": "/var/lib/docker/overlay2/027b371218dd9f60e7ef8d71ee634dbadc7095b58f17f24ad978bd23eb268a90/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:073ec47a8c22dcaa4d6e5758799ccefe2f9bde943685830b1bf6fd2395f5eabc"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        },
        "Config": {
            "Cmd": [
                "/bin/bash"
            ],
            "Entrypoint": null,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Labels": {
                "org.opencontainers.image.ref.name": "ubuntu",
                "org.opencontainers.image.version": "24.04"
            },
            "OnBuild": null,
            "User": "",
            "Volumes": null,
            "WorkingDir": ""
        }
    }
]

컨테이너의 최대 장점: auto scaling

자산 규모 별 가변적 인프라 구성 - 보안 관리의 쟁점

[user@client ~]$ docker container run --name first-docker ubuntu:latest

-i

-t: tty(가상 콘솔 터미널) 활성화

[user@client ~]$ docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS                      PORTS     NAMES
e142daf48a5c   ubuntu:latest   "/bin/bash"   23 seconds ago   **Exited (0)** 21 seconds ago             first-docker
[user@client ~]$ docker container ls -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS                      PORTS     NAMES
e142daf48a5c   ubuntu:latest   "/bin/bash"   42 seconds ago   **Exited (0)** 41 seconds ago             first-docker

컨테이너에 접근해서 실행해야 함

[user@client ~]$ docker container run -it --name ubuntu_2 ubuntu /bin/bash
root@412c477e4a01:/# id
uid=0(root) gid=0(root) groups=0(root) # 권한 상승
root@412c477e4a01:/# ps
    PID TTY          TIME CMD
      1 pts/0    00:00:00 bash
     10 pts/0    00:00:00 ps
root@412c477e4a01:/# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 06:12 pts/0    00:00:00 /bin/bash
root          11       1  0 06:12 pts/0    00:00:00 ps -ef

 

 

부팅하지 않고 쉘이 열림 = 가상화가 아님

ubuntu 환경이지만, 운영체제가 아니다. = 가상화가 아니다

컨테이너 = 가상화? X

컨테이너란? 이 환경에서 명령을 실행할 수 있는 라이브러리를 제공

‘우분투라는 이미지를 올린 것’

이미지 안에 웹 코드를 올린다

or 웹 코드를 마운트 한다 (nfs 방식)

최소한의 환경(command 실행)

해커가 docker container에 접근 (쉘 획득) → 할 수 있는 것이 없음

SBOM은 **Software Bill of Materials(소프트웨어 자재 명세서)**의 약자로, 소프트웨어 제품을 구성하는 모든 구성 요소(라이브러리, 모듈 등)의 목록을 의미합니다. 이는 소프트웨어의 공급망을 관리하고 취약점을 식별하는 데 중요한 역할을 하며, 구성 요소의 버전, 라이선스, 공급업체 등의 정보를 담고 있습니다. SBOM은 소프트웨어의 투명성을 높이고, 보안 위험을 줄이며, 신속한 취약점 대응을 가능하게 합니다.

컨테이너는 스케일링 목적

함께 쓰기 위함. 작지만 빠르게 확산 ⇒ 피해가 클 수 있음

container 장점: 제한된 환경.

SBOM - 소프트웨어 관점에서 자재(라이브러리 등)들이 문제가 없도록 관리하는 명세. for 라이브러리 점검/공급망 점검

만든 이미지의 라이브러리 검증

버전 정보를 확인

컨테이너 점검 - SBOM을 통해 취약한 부분을 확인, 제거 (보안 점검)

일반적으로 말하는 리눅스 시스템 점검 - 스크립트를 통해 점검(레거시)

클라우드의 주요 개념 - 컨테이너, k8s

스크립트를 통한 점검

docker compose

compose 명령어로 여러 컨테이너를 한번에 동작시킴

docker는 응용 개념. k8s 공부해라. + Linux, Shell

데이터 파싱 연습

docker attach CONTAINER
# exit 하면 컨테이너 종료됨
# ctrl+p+q 하면 유지하면서 쉘 종료
[user@client ~]$ docker attach ubuntu_2
You cannot attach to a stopped container, start it first
[user@client ~]$ docker start ubuntu_2
ubuntu_2
[user@client ~]$ docker attach ubuntu_2
root@412c477e4a01:/# read escape sequence # ctrl+p+q
[user@client ~]$ docker container ls -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS                      PORTS     NAMES
412c477e4a01   ubuntu          "/bin/bash"   35 minutes ago   **Up** 39 seconds                         ubuntu_2
9303c5a3ea29   ubuntu          "/bin/bash"   40 minutes ago   Exited (0) 40 minutes ago             ubuntu_1
e142daf48a5c   ubuntu:latest   "/bin/bash"   55 minutes ago   Exited (0) 55 minutes ago             first-docker
[user@client ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:c0:2c:5d brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.100/24 brd 10.0.2.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::9de:81bc:b644:1aa3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:25:c7:49 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.108/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s8
       valid_lft 541sec preferred_lft 541sec
    inet6 fe80::a00:27ff:fe25:c749/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
**4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 2e:37:e9:52:af:7b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 #** cidr 주의. 16 사용
       **valid_lft forever preferred_lft forever
    inet6 fe80::2c37:e9ff:fe52:af7b/64 scope link
       valid_lft forever preferred_lft forever**
11: veth217a646@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether 6a:b8:aa:71:97:60 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::68b8:aaff:fe71:9760/64 scope link
       valid_lft forever preferred_lft forever

네트워크가 브릿지로 구성되어 있음

접근 통제에 용이

docker container [run, create/start, exec] -it --name [이름] IMAGE CMD

run (create + attach)

run: docker pull > docker create > docker start > docker attach

create: docker pull > docker create (중지)

운영체제 종류 확인 명령어(컨테이너도 확인 가능)

cat /etc/*release

root@412c477e4a01:/# cat /etc/*release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.3 LTS"
PRETTY_NAME="Ubuntu 24.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.3 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="<https://www.ubuntu.com/>"
SUPPORT_URL="<https://help.ubuntu.com/>"
BUG_REPORT_URL="<https://bugs.launchpad.net/ubuntu/>"
PRIVACY_POLICY_URL="<https://www.ubuntu.com/legal/terms-and-policies/privacy-policy>"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
[user@client ~]$ cat /etc/*release
NAME="Rocky Linux"
VERSION="9.6 (Blue Onyx)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.6"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Rocky Linux 9.6 (Blue Onyx)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
HOME_URL="<https://rockylinux.org/>"
VENDOR_NAME="RESF"
VENDOR_URL="<https://resf.org/>"
BUG_REPORT_URL="<https://bugs.rockylinux.org/>"
SUPPORT_END="2032-05-31"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
ROCKY_SUPPORT_PRODUCT_VERSION="9.6"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.6"
Rocky Linux release 9.6 (Blue Onyx)
Rocky Linux release 9.6 (Blue Onyx)
Rocky Linux release 9.6 (Blue Onyx)

docker 에서 ps 명령어 대체

[user@client ~]$ ps -ef | grep ssh[d]
root        1320       1  0 12:58 ?        00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root        5360    1320  0 14:17 ?        00:00:00 sshd: user [priv]
user        5364    5360  0 14:17 ?        00:00:00 sshd: user@pts/1
root        6171    1320  0 15:10 ?        00:00:00 sshd: user [priv]
user        6175    6171  0 15:10 ?        00:00:00 sshd: user@pts/3

[user@client ~]$ pstree -p 1320
sshd(1320)─┬─sshd(5360)───sshd(5364)───bash(5365)───docker(6897)─┬─{docker}(6898)
           │                                                     ├─{docker}(6899)
           │                                                     ├─{docker}(6900)
           │                                                     ├─{docker}(6901)
           │                                                     └─{docker}(6902)
           └─sshd(6171)───sshd(6175)───bash(6176)───pstree(6915)

[user@client ~]$ sudo ls -l /proc/1320/exe
[sudo] password for user:
lrwxrwxrwx. 1 root root 0 Oct 20 16:13 /proc/1320/exe -> /usr/sbin/sshd

# ps 동작과 동일
[user@client ~]$ for i in `sudo ls /proc | grep ^[0-9] | sort -n`
> do
> sudo ls -l /proc/$i/exe 2> /dev/null
> done

컨테이너 환경 점검 등에 활용

$ docker container run --privileged -it --name web2 -p 172.17.0.1:8008:80 ubuntu:latest /bin/bash
# apt-get update 
# apt-get install -y apache2 
# service apache2 start 
# echo “ubuntu test page” > /var/www/html/index.html ctrl + p +q 
$ curl  <http://172.17.0.1:8008> ubuntu test page

-d: daemon

$ docker container run -d -it --privileged --name web3 -p 172.17.0.1:8088:80 ubuntu:latest /bin/bash
$ docker ps
$ docker container exec web3 apt-get update 
$ docker container exec web3 apt-get install -y apache2 
$ docker container exec web3 service apache2 start 
$ docker container exec web3 service apache2 status 
$ docker container cp index.html web3:/var/www/html/index.html # index.html 이 아닌 점검 스크립트를 복사할 때 사용
$ curl <http://172.17.0.1:8088>

/dev/shm : shared memory. 메모리 공간

cp 명령어가 안될 경우 위 공간에 복사

점검 스크립트

pre_linux_v1.0.sh

Wayback Machine

브루스터 케일이 창립한 미국의 비영리재단인 인터넷 아카이브(Internet Archive)에서 제작한 디지털 타임캡슐이다. 전세계의 각종 웹사이트를 크롤링한 뒤 날짜와 시간대별로 저장, 보존하여 해당 웹사이트의 과거 모습을 다시 볼 수 있게 해 주는 서비스로, 2025년 9월 기준 현재 9464억 개의 페이지가 아카이브되어 있다.

컨테이너에 권한을 부여한 파일을 복사해야 할 때

컨테이너 내부에 chmod 명령어 없는 경우

실행해야 할 스크립트를 복사해야 하는 경우 밖에서 실행 권한을 주고 컨테이너 환경에 cp

chmod +x linux.sh

 

python 설치(Windows)

  • PATH 설정 옵션 선택
    • 쉘을 새로 열어 명령어 사용
  • 설치 경로 변경(권장): C:\Python314
  • flask 설치: pip install flask

url

도메인/경로?변수=value&변수=value

sql injection

공격 벡터: 공격이 되는 지점

url parameter (≠ api) → 구조화 되어 있기는 하나, 일방적으로 붙음

http는 자체적으로 암호화가 불가능함

capsulation - 443 포트로 던져서 암호화

GET/POST 둘다 안전하지 않다 - 민감한 정보 넘기면 안된다

icmp - 통신하려는 상대방이 존재하는지, port unreachable 판단 등

http status code - 통신이 잘 이루어졌는지 판단

REST (Representational State Transfer): 자원의 상태를 표현하고 전송하는 방식 ,

  • 웹에서 자원을 정의하고 HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 상태를 주고받는 아키텍처 스타일

deface 공격 (사이트 변조)

정형 데이터 - RDB

비정형 데이터 - 이미지 파일, 오디오/비디오 파일, 텍스트 데이터, 센서 데이터 등

MSA 실습

msa-docker-manual/
├── user-service/
│   ├── app.py
│   └── Dockerfile
├── product-service/
│   ├── app.py
│   └── Dockerfile
├── order-service/
│   ├── app.py
│   └── Dockerfile
[user@client msa-docker-manual]$ ls -lR .
.:
total 0
drwxr-xr-x. 2 user basic-group 38 Oct 21 14:54 order-service
drwxr-xr-x. 2 user basic-group 38 Oct 21 14:53 product-service
drwxr-xr-x. 2 user basic-group 38 Oct 21 14:53 user-service

./order-service:
total 8
-rw-r--r--. 1 user basic-group 423 Oct 21 14:53 app.py
-rw-r--r--. 1 user basic-group  99 Oct 21 14:54 Dockerfile

./product-service:
total 8
-rw-r--r--. 1 user basic-group 250 Oct 21 14:52 app.py
-rw-r--r--. 1 user basic-group  99 Oct 21 14:53 Dockerfile

./user-service:
total 8
-rw-r--r--. 1 user basic-group 237 Oct 21 14:52 app.py
-rw-r--r--. 1 user basic-group  99 Oct 21 14:53 Dockerfile
# 네트워크 생성
[user@client msa-docker-manual]$ docker network create msa-net
9fcb6c197af1c9d1e309abed89115e90497eabbd36be2d0f659df18a623e1f72

# 각 서비스 빌드
[user@client msa-docker-manual]$ docker build -t user-service ./user-service
[+] Building 36.1s (9/9) FINISHED                                      docker:default
 => [internal] load build definition from Dockerfile                             0.1s
 => => transferring dockerfile: 195B                                             0.0s
 => [internal] load metadata for docker.io/library/python:3.9                    5.2s
 => [internal] load .dockerignore                                                0.0s
 => => transferring context: 2B                                                  0.0s
 => [1/4] FROM docker.io/library/python:3.9@sha256:ace56aa808ac8bea1ebbb13b0eb  24.5s
 => => resolve docker.io/library/python:3.9@sha256:ace56aa808ac8bea1ebbb13b0eb9  0.0s
 => => sha256:f0c9d6d993ac93f222ba87ca01097d40f632be9b48f6b5e 67.78MB / 67.78MB  3.2s
 => => sha256:ace56aa808ac8bea1ebbb13b0eb99fb15b135b98ed2a90e 10.30kB / 10.30kB  0.0s
 => => sha256:6db99093baa0dcca8f9ab1ffabc53f8a6b6640ba66586de6d 6.14kB / 6.14kB  0.0s
 => => sha256:bd090f42c4b7844c5846f9b4c719994f496fac3befe1d30 25.61MB / 25.61MB  2.2s
 => => sha256:ddc13ba3b1b04bdc61c60698740fee16f957c76c7516cc8e0 2.32kB / 2.32kB  0.0s
 => => sha256:cae3b572364a7d48f8485d67baee38e4e44e299b8c8c4d0 49.28MB / 49.28MB  3.2s
 => => sha256:a2ade626d67af90eb146ef31070d6021beb378ab38f64 235.93MB / 235.93MB  9.8s
 => => sha256:48fcb9e811570ebe79723445e94ea554cbc0d9e860df83638 6.10MB / 6.10MB  3.9s
 => => extracting sha256:cae3b572364a7d48f8485d67baee38e4e44e299b8c8c4d020ff7fb  2.3s
 => => sha256:0001e22f10a7e8471449ba2c2a536614d76f8f1fce2110a 20.37MB / 20.37MB  4.7s
 => => sha256:792a4763ca0d414bef79efd8a3c8f4b9cfe72553a5edc73bcfdc0 248B / 248B  5.3s
 => => extracting sha256:bd090f42c4b7844c5846f9b4c719994f496fac3befe1d30f0ff207  1.2s
 => => extracting sha256:f0c9d6d993ac93f222ba87ca01097d40f632be9b48f6b5e399f2c5  4.0s
 => => extracting sha256:a2ade626d67af90eb146ef31070d6021beb378ab38f6477493190  10.9s
 => => extracting sha256:48fcb9e811570ebe79723445e94ea554cbc0d9e860df83638ab807  0.3s
 => => extracting sha256:0001e22f10a7e8471449ba2c2a536614d76f8f1fce2110ac674ccd  0.9s
 => => extracting sha256:792a4763ca0d414bef79efd8a3c8f4b9cfe72553a5edc73bcfdc07  0.0s
 => [internal] load build context                                                0.1s
 => => transferring context: 331B                                                0.0s
 => [2/4] WORKDIR /app                                                           0.8s
 => [3/4] COPY app.py .                                                          0.1s
 => [4/4] RUN pip install flask requests                                         4.8s
 => exporting to image                                                           0.2s
 => => exporting layers                                                          0.2s
 => => writing image sha256:555453da093250bdbaf9108626d39ad56a1527c854db069b2c4  0.0s
 => => naming to docker.io/library/user-service                                  0.0s

# 컨테이너 실행
[user@client msa-docker-manual]$ docker run -d --name user-service --network msa-net -p 5001:5001 user-service
347bcf0106cbb05a4b3608bd8e653be384b5da2866231a10a5ce16d8215b0d9b

[user@client msa-docker-manual]$ docker build -t product-service ./product-service
[+] Building 7.6s (9/9) FINISHED                                       docker:default
 => [internal] load build definition from Dockerfile                             0.0s
 => => transferring dockerfile: 195B                                             0.0s
 => [internal] load metadata for docker.io/library/python:3.9                    1.9s
 => [internal] load .dockerignore                                                0.0s
 => => transferring context: 2B                                                  0.0s
 => [1/4] FROM docker.io/library/python:3.9@sha256:ace56aa808ac8bea1ebbb13b0eb9  0.0s
 => [internal] load build context                                                0.0s
 => => transferring context: 344B                                                0.0s
 => CACHED [2/4] WORKDIR /app                                                    0.0s
 => [3/4] COPY app.py .                                                          0.1s
 => [4/4] RUN pip install flask requests                                         5.0s
 => exporting to image                                                           0.3s
 => => exporting layers                                                          0.3s
 => => writing image sha256:4364f4d10e4cd81c7dbb8683e64faf35ee1812122b95ebdf6c7  0.0s
 => => naming to docker.io/library/product-service                               0.0s
 
 [user@client msa-docker-manual]$ docker run -d --name product-service --network msa-ne
t -p 5002:5002 product-service
acf1b5c073ec4d1d84f44fbc0b953fcdbb212c6e465759f77f17268b3901fd07

[user@client msa-docker-manual]$ docker build -t order-service ./order-service
[+] Building 9.0s (9/9) FINISHED                                       docker:default
 => [internal] load build definition from Dockerfile                             0.0s
 => => transferring dockerfile: 195B                                             0.0s
 => [internal] load metadata for docker.io/library/python:3.9                    4.1s
 => [internal] load .dockerignore                                                0.0s
 => => transferring context: 2B                                                  0.0s
 => [1/4] FROM docker.io/library/python:3.9@sha256:ace56aa808ac8bea1ebbb13b0eb9  0.0s
 => [internal] load build context                                                0.0s
 => => transferring context: 526B                                                0.0s
 => CACHED [2/4] WORKDIR /app                                                    0.0s
 => [3/4] COPY app.py .                                                          0.1s
 => [4/4] RUN pip install flask requests                                         4.3s
 => exporting to image                                                           0.3s
 => => exporting layers                                                          0.2s
 => => writing image sha256:5904dafdb3e465a23778ffe5d26bac523bafd363abfad415c92  0.0s
 => => naming to docker.io/library/order-service                                 0.0s

[user@client msa-docker-manual]$ docker run -d --name order-service --network msa-net
-p 5003:5003 order-service
7e6e6480a0925a0abb4405bed96deff670c92c395d04e98b5c8eaa366f507147

[user@client msa-docker-manual]$ docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED              STATUS              PORTS                                         NAMES
7e6e6480a092   order-service     "python app.py"   30 seconds ago       Up 30 seconds       0.0.0.0:5003->5003/tcp, [::]:5003->5003/tcp   order-service
acf1b5c073ec   product-service   "python app.py"   About a minute ago   Up About a minute   0.0.0.0:5002->5002/tcp, [::]:5002->5002/tcp   product-service
347bcf0106cb   user-service      "python app.py"   5 minutes ago        Up 5 minutes        0.0.0.0:5001->5001/tcp, [::]:5001->5001/tcp   user-service
  • --network msa-net 옵션으로 세 컨테이너가 같은 네트워크에서 통신 가능하게 설정함
  • 실행중인 컨테이너 목록
    • docker ps
  • 네트워크 연결 확인
    • docker network inspect msa-net
  • 로그 확인
    • docker logs user-service
    • docker logs product-service
    • docker logs order-service

실행 중인 브라우저의 메모리 커널에 인증 정보가 적재됨

덤프 파일이콘 추가

멀티 세션 체크

멀티 세션 체크를 해제하고 있기 때문에 다중 접근이 가능

서버에서 보내준 세션 정보 (함께 가지고 있음)를 브라우저에 가지고 있음

ip 단위로 접근하게 하는 것은 불가능 → 브라우저/단말/아이디로 구분, session id

관련 공격: side jacking

숙제

side jacking 알아오기 - 정리하기

http 3

hsts

session expire 방법: 1. 로그아웃 2. 만료 시간

인증에서 중요한 부분

  1. 어떻게 처리되는가
  2. ip 검증을 하는가
  3. 어떤 방식으로 만료가 되는가
  4. 변조의 위험이 없는가

kt 펨토셀 사건

https는 하이브리드 방식이기 때문에 http보다 속도가 빠름

세션 id는 위험하다 → 토큰 방식 사용

토큰: 임의의 api로 다시 요청을 하는 것

토큰도 완전한 것은 아님

urlquery.net

Drive-by download(드라이브 바이 다운로드) 공격

ddos live

→ 시간이 지날 수록 더욱 많이 발생 중. 잘 대응하는 것이 중요

+ Recent posts