2019/12/03

apt ppa deb 저장소 보안 키 생성.

LINE OS 과 설치되어 있는 여러대의 PC 및 장비를 관리하는 경우, 최신 업데이트 유지해야 한다.

인터넷 제약 사항이나, 현장에서 인터넷이 느리거나 연결이 안될 경우, CD-ROM 또는 USB 저장소를 업데이트 한다.

제품군별 시스템 업데이트와, 소프트웨어가 버전별 설치되어야 한다.

그렇기 위해서는
- 체크섬을 포함한 작은 인덱스 파일인 Release 파일 생성해 만든다.
- 승인되지 않은 사용자들의 방지 하기 위해 디지터 서명을 생성한다.

소프트웨어 설치 프로그램이 신뢰할 수 있는 저장소를 사용하려고 할 때 디지털 서명으로 확인한다.
디지털 서명이 올바르면 설치 관리자 프로그램은 체크섬을 포함하는 색인(목차) 파일의 Release 내용을 신뢰한다.

신뢰할 수 있는 로컬 저장소를 설정하기 전에, 릴리스 파일에 대해 디지털 서명을 생성한다.
생성하기 위해서는 GPT key를 쌍으로 만들어 apt가 사용할 수 있는 신뢰할 수 있는 키로 등록(공개키)해야 한다.
그러면 apt가 모든 디지털 서명을 확인할 수 있다.(개인키)

나중 apt 이부분을 fair pkg 서버로 만들게 변경한다.
그렇면 apt 프로그램이 서명을 할 때 제안을 제약 사항을 만들고, 그 사항에 위배가 되면, fair pkg 서버로 새로운 서비스를 받을수 없다.

이 부분과 인증(RADIUS), 빌링 시스템을 잘 적용한 후 서비스 누수를 막아야 한다.

AWS에서 자동 다운로드 하는 부분을 우리 로컬 서버쪽에서 진행 여부를 판단한다.

1. GPG 개인, 공유 키 생성(로컬 자정소 서버)
=========================================
GPG 개인, 공유키를 생성하려면 다음 명령어를 실행한다.
생성된 두개의 키는 하나의 쌍으로 apt 프로그램에서 신뢰할 수 있다.

gpg --gen-key

대회형 방식으로 진행한다.

디지털 서명시 키를 사용하는 방식이다. 가장 강력한 키의 방식인 RSA를 선택한다.
Please select what kind of key you want:
   (1) DSA and Elgamal (default)
   (2) DSA (sign only)
   (5) RSA (sign only)

Your selection? 5


RSA 키를 선택한 경우, 키에 대한 크기를 묻는다. 보안을 강력하게 하기 위해 가장 큰 4097 비트를 입력하며, 컴퓨터 사항에맞게 이 값을 조절한다.
키값이 길수로 컴퓨터의 자원을 많이 사용하기 때문에 짧게 사용하는 것도 좋다.
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096


키에 대한 만료일을 설정하는 것이다.
우리의 경우 AS 기간을 선정하고 난 다음에 과금을 부과 한 후 서비스 과금이 입고 되면 새로운 테마 버전을 업데이트 한 후 진행을 해준다.
Please specify how long the key should be valid.
         0 = key does not expire 무료
      <n>  = key expires in n days 몇일
      <n>w = key expires in n weeks 몇주
      <n>m = key expires in n months 개월
      <n>y = key expires in n years 년

Key is valid for? (0) 5y

생성할 키의 만료 날짜와 시간을 표시하고 확인한다.
Key expires at Thu 06 Mar 2017 21:12:03 CET
Is this correct? (y/N) Y


사용자 관련 정보를 입력한다.
사용자 관련 정보 항목
- 실명
신원을 증명하는 데 사용할 이름(Local fairUx 75)
- 메일주소
키의 전자 메일 주소를 설정.
제품명으로 지정한다.
- 주석
본 제품의 요점을 설명한다.

예제)
Real name: Local fairUxu Intrepid Ibex Repository
E-mail address:
Comment:
You selected this USER-ID:
    "Local Ubuntu Intrepid Ibex Repository"

사용자 정보 수정 및 적용을 선택할 수 있도록 질의 한다.
Change (N)ame, (C)omment, (E)-mail or (O)kay/(Q)uit? O

암호를 입력한다.
Enter passphrase:
Repeat passphrase:

생성할 공개키, 개인키을 계산한다.
디바이스를 통해 난수를 만들기 때문에 입출력 하드웨어 장치에 많은 인터럽트를 주는게 좋다.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, use the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

하드웨어 인터럽트 및 이벤트가 발생하지 않을 경우 아래의 메세지를 볼 게된다.
..+++++

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy!  (Need 182 more bytes)
.....................................+++++

공개키, 개인키가 준비되면 다음과 같이 출력이 된다.
xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx ID 키값이다.
gpg: /home/luvr/.gnupg/trustdb.gpg: trustdb created
gpg: key xxxxxxxx marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2014-03-06
pub   4096R/xxxxxxxx 2009-03-07 [expires: 2014-03-06]
      Key fingerprint = xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx
uid                  Local Ubuntu Intrepid Ibex Repository

ID : xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx

참고:
생성된 키는 다음 명령어를 사용해 언제든지 확인할 수 있다.

gpg --list-keys

/home/luvr/.gnupg/pubring.gpg
-----------------------------
pub   4096R/xxxxxxxx 2009-03-07 [expires: 2014-03-06]
uid                  Local Ubuntu Intrepid Ibex Repository

2 생성된 공개키 내보내기 (로컬 자정소 서버)
========================================
공개키,개인키 GPG 키들이 준비 되었다 다음 명령을 사용하여 공용키를 텍스트 파일로 만든다.
공용키 pubkey-export-file.txt 매개 변수 이름을 txt로 만들 이름으로 주고, 위에 ID 가 나온 xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx xxxx 입력한다.
gpg --output pubkey-export-file --armor --export xxxxxxxx

3. apt 목록 공개키 가져오기(로컬 자정소 클라이언트)
=================================================
참고:
로컬 저장소에 접속해 패키지를 다운로드 할 수 있다.

위에서 생성된 txt 파일명을 확인 하고 다음 명령을 실행하여 apt가 신뢰할 수 있는 키 목록을 만든다(서버).
sudo apt-key add  pubkey-export-file.txt

참고:
apt가 키를 가지고 왔는지 확인 하려면 다음 명령을 입력해 확인한다.
GUI 를 사용할 경우. 유틸리티 및 암호 키를 확인하면된다.
sudo apt-key list

4. 데비안 패키지 도구 설치
========================
공유키, 개인키를 생성한 1,2 절차 컴퓨터로 돌어간다.(로컬 자정소 서버)
이 패키지가 설치 되면 패키지 저종소를 만들 수 있다.

sudo apt-get install dpkg-dev

5. 로커 저장소 디렉토리 작성(로컬 저장소 클라이언트)
==========================================
저장소 생성.
cd
mkdir LocalRepository
cd LocalRepository

apt를 통해 새로운 소프트웨어 또는 업데이트를 설치할때마다 필요한 패키지는 /var/cache/apt/archivers 디레토리인 apt cache -ie에 로드된다.
이제 모든 패키지를 로컬 저장소에 복사한다.

cp /var/cache/apt/archives/*.deb .

참고:
APT 캐시에 패키지가 포함되어 있지 않으면 'Synaptic Package Manager " 의 "Temporary Files" 설정 을 확인
"Synaptic Package Manager" ( "System" → "Administration" → "Synaptic Package Manager" ) 연다.
"환경 설정"( "설정" → "환경 설정" );
"파일" 탭 페이지를 표시.
"임시 파일" 헤더, 그 중 하나 확인 "캐시에 다운로드 한 모든 패키지를 남겨주세요" 또는 "오직 더 이상 사용할 수있는 패키지를 삭제"를 선택


6 로컬 저장소 파일 목록 작성
==========================
로컬 저장소에 사용 가능한 모든 패키지가 추가되면 저장소에 대한 파일 목록을 만들어야 한다.

dpkg-scanpackages . /dev/null > Packages
gzip -9c Packages > Packages.gz

원래의 압축 파일을 삭제하지 않고 압축이 된다.

7 로컬 저장소 릴리즈 파일 작성.
==============================
릴리즈 파일이 포함되어야 하며, 그 내용은 텍스트 파일이다.

- 헤더
Archive: intrepid
Origin: Ubuntu
Label: Local Ubuntu Intrepid Repository
Architecture: i386
MD5Sum:

파일 목록
 d8cd948e0371a338025d3d99f5f9f304           454617 Packages
 7e43f7e45a7f49dbb01e659c25997446           109619 Packages.gz

MD5 체크섬 생성 명령.
$ md5sum Packages
d8cd948e0371a338025d3d99f5f9f304  Packages

체크섬 값만 유지하고 출력에서 파일 이름 삭제. 첫 번째 공백으로 구분된 출력 필드 만 유지 하기 위해 cut를 사용.
$ md5sum Packages | cut --delimiter=' ' --fields=1
d8cd948e0371a338025d3d99f5f9f304

파일 크기 확인.
$ wc --bytes Packages
454617 Packages

첫 번째 공백으로 구분된 출력 필드 만 유지 하기 위해 cut를 사용.
$ wc --bytes Packages | cut --delimiter=' ' --fields=1
454617

올바른 형식의 출력을 생성하려면 print 명령어를 사용할 수 있다.
$ printf ' '$(md5sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages\n' \
> $(wc --bytes Packages | cut --delimiter=' ' --fields=1)
 d8cd948e0371a338025d3d99f5f9f304           454617 Packages

위에 설명한 기반으로 릴리즈 파일을 생성하는 자동 스크립트이다.

cat > Release <<EOF
Archive: intrepid
Origin: Ubuntu
Label: Local Ubuntu Intrepid Repository
Architecture: i386
MD5Sum:
EOF
printf ' '$(md5sum Packages | cut --delimiter=' ' --fields=1)' %16d Packages\n' \
   $(wc --bytes Packages | cut --delimiter=' ' --fields=1) >> Release
printf ' '$(md5sum Packages.gz | cut --delimiter=' ' --fields=1)' %16d Packages.gz' \
   $(wc --bytes Packages.gz | cut --delimiter=' ' --fields=1) >> Release

8. 릴리즈 파일에 대한 디지털 생성
디지털 서명 기록, 서명이 기록되면 로컬 저장소를 사용할 수 있다.
gpg --armor --detach-sign --output Release.gpg Release

9. apt 로컬 저장소 추가
sudo gedit /etc/apt/sources.list

gksudo gedit /etc/apt/sources.list

deb   file:///home/luvr/LocalRepository   /

sudo apt-get update


방법2)
인증된 저장소 만들기 2
로컬 저장소를 만들기 위해 필요한 도구를 설치한다.
sudo apt-get install dpkg-dev
sudo apt-get install apache2
sudo apt-get install dpkg-sig

심볼릭 링크를 통해 저장소에 접근 할 수 있도록한다.
sudo ln -s ~/repository_dir /var/www/repository_dir

심볼록 링크를 통해 디렉토리를 만든다.
sudo mkdir -p repository_dir/dists/stable/main/binary

생성된 바이너리 디렉토리로 이동한다.
cd repository_dir/dists/stable/main/binary

deb 파일을 바이너리 복사한다.
sudo mv location_of_package/package_name.deb

로컬 저장소 패키지 인증
공개키, 개인키의 쌍키로 생성한다.

gpg --gen-key

디지털 서명 생성, 최대 보안 RSA 사용
  Please select what kind of key you want:
     (1) RSA and RSA (default)
     (2) DSA and Elgamal
     (3) DSA (sign only)
     (4) RSA (sign only)
  Your selection? 4
  RSA keys may be between 1024 and 4096 bits long.
  What keysize do you want? (2048) 4096
  Requested keysize is 4096 bits
요청키를 4096으로 선택한다.

유효기간 설정, 만료일 없음.
Please specify how long the key should be valid.
           0 = key does not expire
        <n>  = key expires in n days
        <n>w = key expires in n weeks
        <n>m = key expires in n months
        <n>y = key expires in n years
  Key is valid for? (0) 0
  Key does not expire at all
  Is this correct? (y/N) y

필수 적 새 키의 이름을 지정
키를 식별하려면 사용자 ID가 필요하다.
소프트웨어 요청으로 실제 이름, 메일주소, 사용자 ID를 구성한다.
  You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form:
      "Zaphod Beeblebrox (Galactic President) <zbeeblebrox@pres.galaxy.com>"
  Real name: Repository
  Email address:
  Comment:
  You selected this USER-ID:
      "Repository"
  Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

비밀키를 보호하려면 암호를 입력한다.
아래의 내용과 비슷한 결과를 얻는다.

  gpg: key 041DA354 marked as ultimately trusted
  public and secret key created and signed.
  gpg: checking the trustdb
  gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
  gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
  pub   4096R/041DA354 2012-06-01
        Key fingerprint = 2253 4C89 DE74 CF68 39D7  2A2E DB3E 384F 041D A354
  uid                  Repository

키에 대한 목록을 확인한다.
gpg --list-keys

생성된 공개키를 텍스트 형태로 내 보낸 다음 저장소의 루트에 저장한다.

sudo gpg --output keyFile --armor --export 041DA354

클라이언트 설정
=============
개인키(열쇠키) 패키지에 서명한다.
sudo dpkg-sig --sign builder file1.deb
sudo dpkg-sig --sign builder file2.deb

패키지 목록을 업데이트 한다.
sudo vi /etc/apt/sources.list

저장소 목록에 추가
deb http://10.31.31.89/repository_dir/dists/stable/main/binary /

패키지 목록 업데이트
sudo apt-get update

저장소의 공개키를 다운로드 한다.
wget -O - http://kr.archive.ubuntu.fair.lan/ubuntu/dists/fairux.txt | sudo apt-key add -

주: 아직 목록 파일이 작성되지 않았으므로 패키지를 찾을수 없음의 오류는 정상이다.

추가된 키 확인.
apt-key list

저장소 시스템에서 루트로 설정하지 않으려면 디렉토리 구조의 모든을 것을 포함하여 사용자에게 소유권을 변경한다.
저장소 디렉토리 내에서 다음 명령실행.

sudo chown user:user -R .

로컬 서버 작업

deb 파일과 동일한 디렉토리 패키지라는 저장소의 목록 파일을 작성하고 압축한다.
압축되지 않은 패키지 파일도 거기에 보관한다.

sudo apt-get install apt-utils

apt-ftparchive packages . > Packages
gzip -c Packages > Packages.gz


Release, InRelease 및 Release.gpg 파일을 생성한다.

apt-ftparchive release . > Release
gpg --clearsign -o InRelease Release
gpg -abs -o Release.gpg Release

받는 사람 컴퓨터의 패키지 목록을 업데이트 한다.
sudo apt-get update
sudo apt-get install package_name

W: http://kr.archive.ubuntu.fair.lan/ubuntu/dists/yakkety/InRelease: Signature by key 6F33E0DEE5CA83F056A7037B74A3CC0F37977826 uses weak digest algorithm (SHA1)

gnu png가 기본적으로 SHA1 를 사용하므로 이 부분을 수정한다.
vi ~/.gpg.conf
cert-digest-algo SHA256
digest-algo SHA256

댓글 없음:

댓글 쓰기