서버구축 (WEB,DB)

내부 Python 패키지 저장소(PPR) 구축 및 운영 가이드

날으는물고기 2024. 11. 21. 00:40

Python은 광범위한 라이브러리와 패키지를 통해 개발 생산성을 높일 수 있는 언어입니다. 그러나 내부 환경에서 외부 패키지를 직접 사용하는 것은 보안 및 안정성 측면에서 위험을 초래할 수 있습니다. 이를 해결하기 위해 내부에 Python Package Repository(PPR)를 구축하여 허가된 패키지를 관리하고, 내부 사용자들이 안전하게 패키지를 설치할 수 있는 환경을 조성하는 방법입니다.

1. Python Package Repository 개요

Python Package Repository(PPR)는 Python 패키지를 중앙에서 저장하고 관리하는 저장소입니다. 내부에 PPR을 운영하면 다음과 같은 이점을 얻을 수 있습니다.

  • 보안 강화: 외부 인터넷 접근을 최소화하여 보안 위험을 줄입니다.
  • 패키지 통제: 허가된 패키지만 사용하도록 통제하여 안정성을 높입니다.
  • 대역폭 절약: 외부 트래픽을 줄여 네트워크 대역폭을 효율적으로 사용합니다.

내부 사용자는 pip를 통해 이 저장소에서 직접 패키지를 설치할 수 있어 기존 개발 흐름에 큰 변화 없이 운영이 가능합니다.

2. PPR 구성 방법

2.1 서버 준비

PPR을 호스팅할 서버를 준비해야 합니다. 서버는 온프레미스 또는 클라우드 환경 모두에서 운영할 수 있습니다.

  • 운영 체제 선택: Ubuntu, CentOS 등 안정적인 리눅스 배포판을 사용합니다.
  • Python 설치: Python 3.6 이상 버전을 설치합니다.
    sudo apt-get update
    sudo apt-get install python3 python3-pip
  • 네트워크 설정: 내부 네트워크에서 접근 가능하도록 IP 및 포트 설정을 구성합니다.

2.2 Python Package Index(PyPI) 미러 설정

외부 PyPI를 내부에서 미러링하여 패키지 설치 속도를 높이고, 인터넷 의존성을 제거할 수 있습니다. 미러링 도구로는 bandersnatch, devpi, Artifactory, Nexus Repository Manager 등이 있습니다.

2.3 devpi 서버 설치

devpi는 Python 패키지 관리와 PyPI 미러링을 제공하는 도구입니다.

  1. devpi 패키지 설치
    pip install devpi-server devpi-web
  2. devpi 서버 초기화
    devpi-server --init
  3. devpi 서버 실행
    devpi-server --host 0.0.0.0 --port 3141
    • --host 0.0.0.0은 모든 인터페이스에서 접근 가능하도록 설정합니다.
    • --port 3141은 devpi의 기본 포트입니다.
  4. 백그라운드 실행
    nohup devpi-server --start --host 0.0.0.0 --port 3141 &

2.4 사용자 계정 및 권한 설정

보안을 위해 사용자 계정을 생성하고 권한을 설정해야 합니다.

  1. devpi 클라이언트 설치
    pip install devpi-client
  2. 서버에 연결
    devpi use http://your-devpi-server:3141
  3. root 계정 로그인
    devpi login root --password=''
  4. 새 사용자 생성
    devpi user -c username password=yourpassword
  5. 사용자 로그인
    devpi login username --password=yourpassword
  6. 인덱스 생성
    devpi index -c username/dev

2.5 패키지 업로드 및 관리

허가된 패키지를 devpi 서버에 업로드하여 내부에서 사용할 수 있도록 합니다.

 

사용자 홈 디렉토리에 .pypirc 파일을 생성하거나 수정합니다.

[distutils]
index-servers =
    devpi

[devpi]
repository: http://your-devpi-server:3141/username/dev/
username: username
password: yourpassword

패키지 디렉토리에서 다음 명령어를 실행합니다.

python setup.py sdist upload -r devpi

또는 twine을 사용할 수 있습니다.

pip install twine
twine upload -r devpi dist/*

3. 패키지 관리 및 설치

3.1 패키지 허가 및 등록 관리

허가된 패키지만 사용하도록 통제하기 위해 내부 정책을 수립합니다.

  • 패키지 승인 절차: 새로운 패키지 요청 시 보안 및 안정성 검토를 거칩니다.
  • 버전 관리: 특정 버전만 허가하여 예기치 않은 변화로부터 시스템을 보호합니다.

3.2 pip 설정

내부 사용자가 devpi 서버를 통해 패키지를 설치할 수 있도록 pip 설정을 변경합니다.

 

전역 설정 파일 편집

  • 리눅스/맥: ~/.pip/pip.conf
  • 윈도우: %HOMEPATH%\pip\pip.ini

설정 내용

[global]
index-url = http://your-devpi-server:3141/username/dev/+simple/
trusted-host = your-devpi-server

3.3 패키지 설치

이제 내부 저장소를 통해 패키지를 설치할 수 있습니다.

pip install your-package-name

패키지가 devpi 서버에 없을 경우, 설정에 따라 외부 PyPI에서 가져오거나 에러를 발생시킵니다. 외부 접근을 차단하려면 devpi 설정에서 --offline-mode를 사용합니다.

4. 보안 고려 사항

4.1 접근 제어

  • 네트워크 제한: VPN이나 사설 네트워크를 통해서만 devpi 서버에 접근하도록 설정합니다.
  • 방화벽 설정: 서버의 포트 접근을 제어합니다.
  • 인증 강화: 강력한 비밀번호 정책과 인증 방식을 사용합니다.

4.2 로그 및 모니터링

  • 활동 로그 저장: 패키지 업로드 및 다운로드 내역을 기록합니다.
  • 모니터링 도구 사용: Prometheus, Grafana 등을 활용하여 서버 상태를 모니터링합니다.
  • 이상 징후 감지: 비정상적인 트래픽이나 접근 시도를 탐지합니다.

4.3 백업

  • 정기 백업: 데이터베이스와 파일 스토리지를 주기적으로 백업합니다.
  • 복구 테스트: 백업 데이터의 복구 가능성을 주기적으로 검증합니다.

5. 유지 보수 및 업데이트

5.1 devpi 및 패키지 업데이트

  • devpi 업데이트
    pip install --upgrade devpi-server devpi-web
  • 서버 재시작
    devpi-server --stop
    devpi-server --start --host 0.0.0.0 --port 3141

5.2 패키지 업데이트 관리

  • 업데이트 요청 검토: 새로운 버전의 패키지가 필요할 경우 사전 테스트를 진행합니다.
  • 공지 및 교육: 업데이트 사항을 사용자들에게 전달하고 필요한 교육을 제공합니다.

 

내부에 Python Package Repository를 구축함으로써 보안성과 효율성을 모두 확보할 수 있습니다. 위에서 소개한 단계들을 따라 설정하고 운영하면, 내부 사용자들이 안전하게 필요한 패키지를 설치하고 사용할 수 있는 환경을 만들 수 있습니다. 필요에 따라 세부 설정을 조정하고, 지속적인 유지 보수를 통해 안정적인 시스템을 운영할 수 있습니다.

728x90