Blog

  • 컨테이너 진입

    docker exec -it <컨테이너> /bin/bash

    특정 컨테이너 내부를 살펴 봐야 할 경우가 있다. 이럴 때 이용하면 된다.

  • Pushover with E2EE

    Pushover는 서버에 메시지를 저장하지 않는다고 한다. 내용이 유출될 가능성은 낮다는 뜻이다. 그럼에도 불구하고 보다 안전한 것은 좋은 것이다. 그래서 E2EE를 지원하도록 해보았다. Gemini 의 도움을 받았다.

    공식 홈페이지 내용은 다음과 같다.

    #!/bin/sh
    KEY="your-64-char-hex-key-here"
    
    encrypt() {
      IV=$(openssl rand -hex 16)
      CT=$(echo -n "$1" | gzip -9 | \
        openssl enc -aes-256-cbc -K "$KEY" -iv "$IV" | xxd -p | tr -d '\n')
      HMAC=$(echo -n "${IV}${CT}" | xxd -r -p | \
        openssl dgst -sha256 -mac HMAC -macopt hexkey:"$KEY" | awk '{print $NF}')
      echo -n "${IV}${CT}${HMAC}" | xxd -r -p | openssl base64 -A
    }
    
    curl -s https://api.pushover.net/1/messages.json \
      -F "token=APP_TOKEN" \
      -F "user=USER_KEY" \
      -F "title=$(encrypt "hellorld")" \
      -F "message=$(encrypt "This has been encrypted")" \
      -F "encrypted=1"

    Gemini 에 물어 봤더니 다음과 같은 형식이라고 한다.

    Pushover 홈페이지에서 제공하는 쉘 스크립트 예제는 AES-256-CBC 암호화와 HMAC-SHA256 무결성 검증을 결합한 방식입니다.

    AES-256은 32바이트(256비트)의 키를 사용한다. 하나의 키를 임의로 생성한다.

    import secrets
    
    random_hex = secrets.token_hex(32)

    token, user, 그리고 E2EE에 사용할 키를 json 파일로 만들어 둔다. 보안을 신경쓴다면 하드 코딩을 할 수 없다. 다음과 같은 식으로 불러온다.

    def load_pushover_key():
        with open('pushover.json', 'r') as f:
            return json.load(f)

    Gemini가 E2EE 코드를 다음처럼 구현했다.

    import json
    import requests
    import gzip
    import binascii
    from Crypto.Cipher import AES
    from Crypto.Hash import HMAC, SHA256
    from Crypto.Util.Padding import pad
    from Crypto.Random import get_random_bytes
    import base64
    
    def pushover_encrypt(message, hex_key):
        # 1. 키 준비 (64자 Hex를 바이트로 변환)
        key_bytes = binascii.unhexlify(hex_key)
        
        # 2. Gzip 압축 (쉘의 gzip -9와 동일)
        compressed_data = gzip.compress(message.encode('utf-8'), compresslevel=9)
        
        # 3. IV 생성 및 AES-256-CBC 암호화
        iv = get_random_bytes(16)
        cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
        # PKCS7 패딩 적용
        encrypted_data = cipher.encrypt(pad(compressed_data, AES.block_size))
        
        # 4. HMAC-SHA256 생성 (IV + Ciphertext)
        # 쉘 스크립트의 IV(hex)+CT(hex)를 바이너리로 바꾼 후 HMAC 계산하는 로직 재현
        hmac_obj = HMAC.new(key_bytes, iv + encrypted_data, digestmod=SHA256)
        hmac_signature = hmac_obj.digest()
        
        # 5. 최종 결합 (IV + Ciphertext + HMAC) 및 Base64 인코딩
        final_payload = iv + encrypted_data + hmac_signature
        return base64.b64encode(final_payload).decode('utf-8')

    메시지를 어떻게 보내는지에 따라 메시지 발송 방법이 차이 날 수 있을 것이다. 난 보통 특정 프로그램이 실행될 경우 1번 사용한다. 편하게 함수로 처리했다.

    def send_message_e2ee(msg, title=None):
        key = load_pushover_key()
        url = "https://api.pushover.net/1/messages.json"
        
        payload = {
            "token": key['pushover_token'],
            "user": key['pushover_user'],
            "message": pushover_encrypt(msg, key['secret_key']),
            "encrypted": "1" 
        }
        
        if title:
            payload["title"] = pushover_encrypt(title, key['secret_key'])
    
        response = requests.post(url, data=payload)
        return response.status_code

    참.. 필요한 패키지는 설치해야한다.

    pip install pycryptodome
  • iSCSI 연결

    AI 도움을 받아가며 iSCSI 연결하는 과정을 정리해 본다.

    우선 패키지 설치와 서비스 활성화

    sudo apt update
    sudo apt install open-iscsi
    
    sudo systemctl enable --now iscsid open-iscsi

    iSCSI 서버에서 타겟 찾기. iSCSI를 설정해 둔 TrueNAS Sacle의 주소가 10.10.10.10 이었음.

    sudo iscsiadm -m discovery -t sendtargets -p 10.10.10.10

    iSCSI 연결

    sudo iscsiadm -m node -T iqn.2005-10.org.freenas.ctl:orthanc -p 10.10.10.10 --login

    lsblk 확인. 마운트 후 캡쳐해서 이렇게 보이고 있음. 처음에는 sda만 보임. 사전에 설정해 둔 용량이 2.5T 이어서 이것을 기준으로 찾았음.

    자동으로 연결되도록 하는 설정은 다음이라고 함.

    sudo iscsiadm -m node -T iqn.2005-10.org.freenas.ctl:orthanc -p 10.10.10.10 -o update -n node.startup -v automatic

    변경 확인하기.

    sudo iscsiadm -m node -T iqn.2005-10.org.freenas.ctl:orthanc -p 10.10.10.10 | grep node.startup

    이렇게 실행했을 때 다음과 같이 automatic으로 보이면 되는 것.

    /etc/fstab에 등록하기 위한 UUID 알아내기

    sudo blkid /dev/sda

    마운트 할 폴더를 생성하고 읽고 쓰기가 가능하도록 하기.

    sudo mkdir -p /mnt/iscsi
    sudo chmod 777 /mnt/iscsi

    fstab에 등록하기. 부팅 때 TrueNAS를 확인해서 연결하도록 설정. 하지만 꺼졌있을 경우도 있을 것이므로 이를 고려함

    UUID=9ebcaaa0-ed4c-4263-ba88-0e2a57050da1 /mnt/iscsi ext4 _netdev,nofail,x-systemd.automount,x-systemd.device-timeout=10 0 0
  • 시간관리론

    당신에게는 어떤 문제든 해결하고, 어떤 장애물이든 극복하고, 마음먹으면 어떤 목표를 이룰 수 있는 능력이 있다.

    창의적 사고를 방해하는 3대 적이 있다. 안전지대, 학습된 무기력, 실패나 거절에 대한 두려움이다.