1. harbor
- 1 1. Harbor 개요
- 1.1 Registry란?
- 1.2 Harbor란?
- 1.3 Harbor 특징
- 1.4 Harbor의 구조
- 2 2. Harbor 사용
- 3 3. Harbor 기술자료
- 4 4. Harbor 릴리즈 노트
1. Harbor 개요
Registry란?
쿠버네티스, DevOps, 컨테이너 기반 개발을 위한 이미지를 저장되는데 사용되는 Repository입니다.
퍼블릭 레지스트리에서 사용자가 원하는 이미지를 다운로드 받을 수도 있지만, 개인이나 조직에서 프라이빗 레지스트리를 구축하여 사용할 수도 있습니다.
Harbor란?
역할 기반 접근제어(RBAC), 이미지 서명, 이미지 취약성 스캐닝 등의 기능이 있는 오픈소스 레지스트리입니다.
Harbor 특징
오픈 소스
Harbor는 CNCF의 오픈 소스로서, 컨테이너 이미지를 저장할 수 있는 프라이빗 저장소로 사용 가능합니다.간편한 설치
설치 및 적용이 간편하고, UI도 직관적입니다.
Harbor의 구조
Harbor는 스토리지나 데이터베이스에 데이터를 저장하며, harbor-helm 차트를 이용하여 설치하면 기본으로 postgresql 데이터베이스를 설치합니다.
사용자는 프로젝트를 통해 정책과 롤 기반으로 접근을 제어(RBAC)할 수 있으며, 이미지 저장, 이미지 보안 취약성 검사, 보안, UI 등 사용자가 레지스트리 솔루션을 편리하게 사용할 수 있는 최소한의 기능들을 제공하여 구조가 복잡하지 않습니다.
2. Harbor 사용
Cloud Native Registry
(1) Harbor GUI 페이지 접속 (ex. https://harbor.k8s.test.playce.cloud)
KeyCloak 등 연동되어 있는 경우 OIDC PROVIDER를 통해 로그인 하며, LOCAL DB 통해서 Harbor로 바로 로그인 할 수 있습니다.
(2) Harbor 로그인
(3) [Projects] - [NEW PROJECT]로 프로젝트 생성
(4) [Project Name] 설정. 필요 시 [Storage Quota] 설정
(5) 생성 된 [first-project] 클릭
(6) [PUSH COMMAND] 누르면 예제 명령어 확인 가능
(7) 클라이언트에서 nginx 이미지 업로드
(8) first-project에서 업로드 된 이미지 확인
User 생성 및 할당
(1) User 생성
Local DB의 경우 [Users] 탭에서 생성
OIDC 연동된 경우에는 해당 솔루션(Keycloak)에서 유저 생성
(2) 신규 유저 할당 할 프로젝트로 이동
(3) [members] 탭에서 User 추가 및 Role 할당
Project Admin : 읽기, 쓰기, 구성원 추가 및 제거, 취약성 스캔
Maintainer : 이미지 스캔, 복제 작업 보기, 이미지 및 Helm 차트 삭제
Developer : 프로젝트에 대한 읽기 및 쓰기 권한
Guest : 읽기 전용 권한, 이미지 pull 및 tag 설정은 가능하지만 push는 불가능
Limited Guest : 이미지 pull 만 가능. 이미지 push 및 로그, 다른 멤버는 볼 수 없음
(4) playce-developer 계정 추가 확인
(5) playce-developer로 로그인 시 Role에 맞는 권한으로 화면이 보여짐
이미지 취약점 스캐닝(trivy)
(1) 이미지 취약점 스캔이 필요한 이미지가 있는 프로젝트로 이동
(2) 스캔 할 이미지를 선택
(3) Artifacts 선택 후 [SCAN] 클릭
(4) 스캔이 끝나면 취약점 리스트 상세 보기로 결과 확인
이미지 서명(Cosign)
인터넷에서 다운 받은 이미지에 어떤 코드가 반영되어있는지 확인하기가 어렵고, 어떤 소프트웨어가 설치되어 있는지 확인하기가 어렵기 때문에 확인되지 않은 이미지로 시스템을 구축하면 공격의 대상이 될 수 있습니다.
공식 origin 이미지를 사용하여 생성된 이미지에 Signer를 통해 서명하고 서명된 이미지만으로 시스템을 구축/업그레이드하여 관리가 필요합니다.
TUF(The Update Framework)는 저장소나 서명 키를 손상 시키는 공격자로부터 시스템을 보호하는 프레임워크를 일컬으며, Harbor 프로젝트 v2.5.0까지는 TUF를 구현한 오픈소스 프레임워크인 Notary를 사용하여 이미지 서명 기능을 제공하고 있습니다. 하지만, Notary의 복잡성 및 프로젝트가 활발히 진행되지 않기 때문에 Harbor v2.6.0~v2.8.0에서 Deprecate 되기로 결정되었습니다.
그 대신 OCI artifact 서명 및 확인 솔루션인 Cosign을 이용한 서명을 사용하도록 권장하고 있습니다.
(1) Cosign 설치
# Ubuntu
wget "https://github.com/sigstore/cosign/releases/download/v1.6.0/cosign-linux-amd64"
mv cosign-linux-amd64 /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign
*환경 별 설치 방법 참고 https://docs.sigstore.dev/cosign/installation
(2) Local Keypair 생성
root@playcekube-test-master01:/harbor/cosign# cosign generate-key-pair
Enter password for private key:
Enter password for private key again:
Private key written to cosign.key
Public key written to cosign.pub
root@playcekube-test-master01:/harbor/cosign# ls -l
total 20
drwxr-xr-x 2 root root 4096 Dec 14 14:16 ./
drwxrwxrwt 13 root root 4096 Dec 14 14:16 ../
-rw------- 1 root root 649 Dec 14 14:16 cosign.key
-rw-r--r-- 1 root root 178 Dec 14 14:16 cosign.pub
(3) 이미지 서명
이미지 서명은 로컬 위치한 이미지에는 수행 할 수 없고, Registry에 push 후 수행하여야 합니다.
root@playcekube-test-master01:/harbor/cosign# cosign sign --key cosign.key harbor.k8s.test.playce.cloud/first-project/nginx:1.19
Enter password for private key:
Pushing signature to: harbor.k8s.test.playce.cloud/first-project/nginx
(4) 이미지 서명 확인
Harbor에서 업로드 된 이미지를 선택하여 [Signed by Cosign] 항목을 확인합니다.
3. Harbor 기술자료
Harbor – Harbor 2.5 Documentation
GitHub - sigstore/cosign: Code signing and transparency for containers and binaries
4. Harbor 릴리즈 노트