728x90
반응형

취약점 공격

SQL Injection

  • 웹 응용 프로그램에 SQL 삽입하여, 서버 데이터 유출 및 관리자 인증 우회 방법
  • 동적 쿼리에 사용되는 입력 데이터에 예약어 및 특수만자 입력되지 않게 필터링시켜 방지
    • 동적 쿼리: 질의어 코드를 문자열 변수에 넣어 조건에 따라 질의를 동적으로 변경하여 처리

크로스사이트 스크립팅 XSS

  • 웹페이지에 악의적인 스크립트를 삽입하여 방문자들의 정보를 탈취 및 비정상적 기능 수행 유발
  • HTML 태그의 사용을 제한 및 스크립트에 삽입되지 않도록 다른 문자로 치환하여 방지

운영체제 명령어 삽입

  • 외부 입력값을 통해 시스템 명령어의 실행 유도하여 권한 탈취 및 시스템 장애 유발
  • 웹 인터페이스를 통해 시스템 명령어가 전달되지 않도록하고, 외부 입력값을 검증 없이 내부 명령어로 사용하지 않게끔 함

서비스 공격 유형

서비스 공격 (Dos; Denial of Service)

  • 서비스 자원을 고갈시킬 목적으로, 다수의 공격자/시스템에서 대량의 데이터를 한 곳의 서버에 집중적으로 전송

Ping of Death

  • Ping 명령을 전송할 때, 인터넷 프로토콜 허용 범위 이상으로 전송하여 네트워크 마비시키는 공격

스머핑 SMURFING

  • IP 나 ICMPO의 특성을 악용하여, 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄으로써 네트워크를 불능 상태로 만드는 공격

DDoS

  • 여러 곳에 분산된 공격 지점에서 한 곳의 서버에 대해 서비스 거부 공격을 수행하는 것
  • 취약점 가진 호스트들에 공격용 툴을 설치해 에이전트로 만듬

네트워크 침해 관련 용어 정리

  • 스미싱: 문자 메세지를 이용해 정보 빼내는 기법
  • 스니핑: 네트워크의 중간에서 남의 패킷 정보를 도청하는 유형. 수동적 공격에 해당
  • ARP 스푸핑: 자신의 물리적 주소(MAC)을 공격 대상의 것으로 변조해서 공격 대상에 도달해야하는 데이터 패킷을 가로채거나 방해

정보 보안 침해 공격 관련 용어 정리

  • 웜: 네트워크를 통해 자신을 복제하여 시스템 부하를 높여 다운시키는 바이러스의 일종.
    • 분산 서비스 거부 공격, 버퍼 오버플로 공격, 슬래머 등
  • 랜섬웨어: 인터넷 사용자의 컴퓨터에 잠입해 내부 문서나 파일등을 암호화하여 돈 요구
  • 트로이목마: 정상적인 기능을 하는 프로그램으로 위장하여 숨어있다가 부작용 일으킴. 복제 기능 없음

취약점 방어

NULL 포인터 역참조

  • NULL Pointer가 가리키는 메모리의 위치에 값을 저장할 때 발생하는 보안 약점
  • 포인터 이용 전 NULL 값 존재 여부 체크 함으로 방지

스택가드

  • 주소가 저장되는 스택에서 발생하는 보안 약점을 막는 기술
  • 프로그램 복귀 주소와 변수 사이 특정 값을 저장한 후, 그 값이 변경되었을 경우 오버플로우 상태로 판단하여 실행 중단
728x90
반응형

'백엔드 Backend' 카테고리의 다른 글

[테스팅] 어플리케이션 테스팅  (2) 2024.11.01
[결합도/응집도] 결합도와 응집도란  (0) 2024.10.24
악성코드 종류  (0) 2024.10.16
SOLID 원칙  (0) 2024.10.08
비동기 Asynchronous 란?  (0) 2024.10.04
728x90
반응형

보안을 위해서라면 암호화는 중요하다.

 

해시 계열

 

해시(Hash)

해시는 암호화 과정이라고 하기에는 어렵고 보안이 이미 뚫린 바가 있으나,

암호화 기법과 함께 사용하여 시너지를 발휘할 수 있다.

 

  •  임의의 크기를 가진 데이터를 하나의 고정된 데이터로 변환시킨 것
  • 예시: "12345" -> 고정 길이 해시 값

 

MD5 (Message Digest algorithm 5)

RFC1321로 지정된 128비트의 해시 함수.

본 데이터가 다를지라도 같은 해시 값이 생성(충돌) 되고 이미 보안이 뚫린 바가 있기에, 보안 관련 용도로는 사용하지 않음.

  • 원프로그램 / 파일 무결성 검사할 때 사용
  • 32개의 16진수로 이루어진 해시 값 생성 (16^32)

 

SHA (Secure Hash Algorithm)

서로 관련된 암호학적 해시 함수들의 모음.

  • TLS, SSL, PGP, SSH, IPSec 등 많은 보안 프로토콜에서 채택
  • 원본 데이터의 작은 변화에도 해시 값의 변동이 매우 큼
  • SHA-2 계열 알고리즘은 현재까지 많이 쓰이고,SHA-256 / SHA-512가 널리 쓰임

 

 

암호화 알고리즘

 

Adaptive Key Derivation Dunction

  • 다이제스트(해시화된 데이터)를 생성할 때 **Salting**과 **Key-Stretching**을 반복하여 공격자가 유추할 수 없게 보안의 강도를 선택할 수 있는 함수
  • Salting: 해시 함수 실행 전 원문에 임의의 문자를 덧붙여 보안성을 높이는 기법
  • Key-Stretching: 입력한 패스워드의 다이제스트를 생성하고, 생성된 다이제스트를 입력값으로 하여 다이제스트를 생성하는 것을 반복하는 기법

 

PBKDF2 (Password-Based Key Derivation Function)

해시 함수의 컨테이너 역할을 하는 함수

  • 검증된 해시함수만을 사용
  • 해시함수와 salt를 적용하여 해시함수의 반복 횟수를 지정하여 암호화
  • 가장 많이 사용되는 ISO 표준에 적합한 알고리즘

 

Bcrypt

패스워드 해싱 함수 (Blowfish 암호 기반)

  • 현재까지 가장 강력한 암호화 알고리즘
  • 해시화 반복횟수를 늘려 연산속도를 늦출 수 있어, 연산 능력이 강화된 Brute-Force 공격에 대비 가능

 

Blowfish 알고리즘

- 32비트 ~ 448비트의 가변길이의 키를 이용하는 비밀키 블록암호

 

Brute-Force

- 랜덤한 값을 무차별적으로 대입하여 해시 알고리즘의 원본 데이터를 알아내는 공격 기법

 

Scrypt

PBKDF2와 유사한 함수

  • 다이제스를 생성할 때 메모리 오버헤드를 갖도록 설계되어 Brute-Force 시도 시 병렬화 처리 어려움
  • Bcrypt보다 더 경쟁력 있다고 평가 됨

 

Seed

한국인터넷진흥원(KISA)에서 개발한 128비트의 대칭키 블록 암호 알고리즘

728x90
반응형

'백엔드 Backend > 암호화' 카테고리의 다른 글

[암호화] 암호화 - 2  (0) 2024.09.25
728x90
반응형

 

본 글은 Ubuntu 20.04 를 기준으로 작성되었습니다.

 

도커 이미지 허브

도커 이미지는 빌드되어 정적인 상태로 관리된다. 때문에 저장장치에 이미지를 업로드하여 url을 통해 내려 받아 와 사용할 수 있다. 이른바 CI/CD 의 일종으로 볼 수 있을 것 같다. 그런데 개인적인 프로젝트나, 회사 내부 프로젝트일 경우 이미지는 내부에서 관리되어야 하고 유출되면 곤란하다. 때문에 도커 이미지 레지스트리 관리 오픈소스 툴인 harbor 를 이용해 이미지를 관리해 왔다.

 

보안

이미지를 업로드한 저장소에 접근하기 위해선 저장소 접근 권한을 통해 로그인을 해야 한다. 그런데 리눅스 기반의 운영체제에서 (다른 운영체제는 잘 모르겠다) docker login 명령어를 통해 접근하려고 하면, 로컬에 해당 민감정보가 저장되어 버린다는 끔찍한 문제점이 존재한다. 때문에 도커에서도 공식적으로 이러한 방식이 아닌 credential을 이용해 접근하라고 권고하고 있다.

 

Docker Credential

- [공식 레포지토리](https://github.com/docker/docker-credential-helpers

Credential은 로컬에 그대로 저장하는 것이 아닌, 암호화 시키고 사용할 때 인증을 해서 접근 권한을 가져와 사용할 수 있게 해 준다. 어떤 능력자 분이 설치하는 스크립트를 공유해 주셔서 이를 공유해본다.

 

- [스크립트 원문](https://geoffhudik.com/tech/2020/09/15/docker-pass-credential-helper-on-ubuntu/)

#!/bin/sh
# Sets up a docker credential helper so docker login credentials are not stored encoded in base64 plain text.
# Uses the pass secret service as the credentials store.
#
# If previously logged in w/o cred helper, docker logout <registry> under each user or remove ~/.docker/config.json.
#
# For Swarm use just run once on a manager.
# Script written for use on Ubuntu.
# Run elevated logged in as the target user.
# To remove cred helper:
#   - delete /usr/local/bin/docker-credential-pass
#   - remove '{ "credsStore": "pass" }' from ~/.docker/config.json
# Ensure executable in git:
# git update-index --chmod=+x path/docker-credentials.sh
if ! [ $(id -u) = 0 ]; then
   echo "This script must be run as root"
   exit 1
fi
# Install dependencies - jq more optional for existing varying configuration in ~/.docker/config.json.
apt update && apt-get -y install gnupg2 pass rng-tools jq
# Check for later releases at https://github.com/docker/docker-credential-helpers/releases
version="v0.6.3"
archive="docker-credential-pass-$version-amd64.tar.gz"
url="https://github.com/docker/docker-credential-helpers/releases/download/$version/$archive"
# Download cred helper, unpack, make executable, move it where it'll be found
wget $url \
    && tar -xf $archive \
    && chmod +x docker-credential-pass \
    && mv -f docker-credential-pass /usr/local/bin/
# Done with the archive
rm -f $archive
config_path=~/.docker
config_filename=$config_path/config.json
# Could assume config.json isn't there or overwrite regardless and not use jq (or sed etc.)
# echo '{ "credsStore": "pass" }' > $config_filename
if [ ! -f $config_filename ]
then
    if [ ! -d $config_path ]
    then
        mkdir -p $config_path
    fi
    # Create default docker config file if it doesn't exist (never logged in etc.). Empty is fine currently.
    cat > $config_filename <<EOL
{
}
EOL
    echo "$config_filename created with defaults"
else
    echo "$config_filename already exists"
fi
# Whether config is new or existing, read into variable for easier file redirection (cat > truncate timing)
config_json=`cat $config_filename`
if [ -z "$config_json" ]; then
    # Empty file will prevent jq from working
    $config_json="{}"
fi
# Update Docker config to set the credential store. Used sed before but messy / edge cases.
echo "$config_json" | jq --arg credsStore pass '. + {credsStore: $credsStore}' > $config_filename
# Output / verify contents
echo "$config_filename:"
cat $config_filename | jq
# Help with entropy to prevent gpg2 full key generation hang
# Feeds data from a random number generator to the kernel's random number entropy pool
rngd -r /dev/urandom
# To cleanup extras from multiple runs: gpg --delete-secret-key <key-id>; gpg --delete-key <key-id>
echo "Generating GPG key, accept defaults but consider key size to 2048, supply user info"
gpg2 --full-generate-key
echo "Adjusting permissions"
sudo chown -R $USER:$USER ~/.gnupg
sudo find ~/.gnupg -type d -exec chmod 700 {} \;
sudo find ~/.gnupg -type f -exec chmod 600 {} \;
# List keys
gpg2 -k
# Grab target key
key=$(gpg2 --list-secret-keys | grep uid -B 1 | head -n 1 | sed 's/^ *//g')
echo "Initializing pass with key $key"
pass init $key
# Image can't be found when Swarm attempts to pull later if a pass phrase is here.
echo "Do not set a passphrase for this step (*IMPORTANT*)"
pass insert docker-credential-helpers/docker-pass-initialized-check
# Optionally show password but mask ***
# pass show docker-credential-helpers/docker-pass-initialized-check | sed -e 's/\(.\)/\*/g'
echo "Docker credential password list (empty initially):"
docker-credential-pass list
echo "Done. Ready to test. Run: docker login <registry>"
echo "After login run: docker-credential-pass list; cat ~/.docker/config.json; pass show"

 

도메인 등록

도커 로그인을 진행해서 도메인을 등록한다.

sudo docker login <docker hub | registry address>
>>username:
>>password:
>> succeed

 

리스트 업

sudo docker-credential-pass list
>> {"example.com":"username"}

 

활성화

아래 명령어를 입력하면 위에서 인증 키를 생성할 때 입력한 패스워드를 입력할 수 있는 창이 뜰 것이다. 이후에 저장소에 접근하면 정상적으로 가능해진다.

sudo pass ls docker-credential-helpers/docker-pass-initialized-check
728x90
반응형

'데브옵스 devOps > Docker' 카테고리의 다른 글

[DOCKER] 도커 port / expose 에 대해  (1) 2024.10.21
[DOCKER] 도커 네트워크에 관하여  (0) 2024.10.18
[DOCKER] 헬스체크  (2) 2024.10.03
[Docker] 도커 및 도커 컴포즈 설치  (0) 2024.09.25
[Docker] 도커란?  (1) 2024.09.25

+ Recent posts