[트러블슈팅].. PEM키가 공개된사건

2025. 11. 29. 03:13·개인공부정리페이지

협업을 하는 과정에서 내 AWS pem키를 공유했었는데, 해당파일이 실수로 GitHub 에 올라갔다!

심지어 그상태료 약 1주일간 방치된 사건이다.

 

(심지어 public repository였고, 이미 클라우드환경에서 돌아가고있는 EC2가 있었다.)

 

pem키는 절대 공개되서는 안된다고 알고있었기에 멘붕이었다.

사실 깃허브도 그리 잘 다루지못하는지라, 올라간 특정파일에 대해서 모든 커밋기록을 삭제하고, 레포에서도 삭제하고 하는 일련의 과정을 모두 처음 경험해봤다.

사실 기업들어가면 이런 경험을 언제해보겠어,, 학부생이니까 이런것도 해보는거지 ㅎㅎ

 

팀원에겐 다음부턴 조심하라구 하고 수습에 들어갔다.

(오히려 이런 기회가 생긴것에 어찌보면 감사하다! 나중에 실제 돈많이들어가는 서비스에서 이럼 큰일이니까!! )

 

 

사실 난 주변에 전문가가 겨레언니밖에없었기 때문에, 내 선생님.. GPT한테 물어봤다.

 

 

1. 기존 pem 키를 사용 중단한다.

ec2에서 키페어 - EC2, 그리고 깃허브 secrets에 ssh_key에 연동되어있던 키를 삭제해주었다.

2. GitHub 히스토리에서 PEM 키 완전 삭제(모든 commit 기록 포함)

 방법 1: GitHub 자체 제공 도구 활용을 권유해 주었다.

GitHub이 제공하는 "Repository history rewrite" 기능이 있어.
👉 https → Settings → Code security → Secret scanning→ Push protection
여기에서 노출된 비밀키를 자동 제거하도록 안내해주기도 함.

여기서 맨 아래있는 secret scanning alerts를 켜는건데, 이걸 하려면 맨처음에 해야하는게있음.

advanced Security 에서 Secret Protection을 enable해준다.

 

근데 어이없는건... 감지못함. (된다며 지피티야!!!)

"감지가안돼"에 대한 답변 ... 얼탱x
패턴이 고정된 Key들만 자동 감지해.
근데 PEM 키(.pem) 는 다음 이유로 자동 감지 대상이 아님:

PEM은 다양한 서비스에서 쓰는 일반적인 RSA/ECDSA key 포맷 패턴 기반 탐지가 어렵고 false positive가 너무 많음 → 그래서 GitHub이 기본적으로 “PEM 파일 자체 노출”은 Secret으로 판정하지 않아

➡️ 그래서 Secret Scanning Alerts 페이지에 아무것도 안 뜨는 게 정상이야.

 

이럴거면 왜된다고알려줫냐 처음에 거짓말쟁이야

 

PEM 파일은 직접 히스토리에서 강제 삭제해야한다고 한다.

 

내가 수행한 방법 : 

먼저 해당 명령어를 통해, 이게 깔려있는지 확인한다. (난없어서 설치받음)

pip install git-filter-repo

 

이후, 다음 명령어를 사용한다 : commit 히스토리에서 완전히 삭제시키는 명령어

(여기서 파일명은 공개되어버린,, 아까 EC2에서 삭제한 키페어 파일명임)

git filter-repo --force --invert-paths --path "파일명.pem"

 

이걸 수행하고나면, git filter-repo가 히스토리 재작성하면서 remote 'origin'을 자동으로 삭제한다.

`git remote origin main`으로 연결해놨던 설정이 초기화된다. 그래서 다시 원격 레포지토리랑 연결해주어야함

 

git remote add origin https://<레포주소>.git

 

`git remote -v`로 연결되었는지 확인해주고,

 

그리고 깃허브에 강제 푸쉬 날린다.

git push origin --force --all
git push origin --force --tags

 

 

이제 요런 머지했다고 뜨면서 커밋이 하나 올라가게된다. (그리구 기존 커밋들 되돌아가면 내 pem키가 올라갔던 모든 기록들이 사라진 것을 확인할 수 있었다.)

꺄~ 원래 파일 2개였는데 하나됏어욤

 


이제 AWS 설정을 다시해주자. 

기존 EC2 인스턴스에 새 키로 SSH 접속 설정하기

AWS는 기존 EC2 인스턴스에 바로 새 키를 적용해주지 않는다.
그래서 우리가 직접 EC2 내부의 authorized_keys 파일을 새 키로 교체할 것이다!

 

1) 새로운 키 페어를 발급받는다. -> 이를 EC2, 기존 GitHub secrets에 추가해줄거고, 내 git bash 에서 접속할때도 사용할거다.

 

2)  EC2 Instance Connect(SSM 계열)로 접속 → 새 키 적용 

 git bash에서 접속할대는 항상 pem키로 열어줬어야했는데, EC2 자체에서도 콘솔이있었다! (이걸처음알았음)

전제조건은 다음 두가지이다.

1) EC2가 Amazon Linux 2 혹은 Ubuntu
2) EC2 보안 그룹에 22포트 열려 있어야 함
-> AWS 콘솔에서 "EC2 Instance Connect" 버튼이 활성화됨

 

저기 '연결' 이라고 적혀있는게 그 버튼이다. 저거누르면 ec2 접속성공하면 나오는 그 비둘기모양이 바로나온다. (=aws콘솔에서 바로 접속가능한거임)

 

브라우저에서 바로 터미널 열림! == 바로 로그인된 모습 을 확인할 수 있다ㅎㅎ (난 따로 설정안해줘서 ec2-user 기본값으로 되어있었다.

 

여기 들어가면 이제 root 권한 얻고 authorized_keys 수정할 수 있다.! (저기에 pem키가 저장되어있다구함)

2) `authorized_keys` 파일 열기

터미널에서:

sudo su
cd /home/ec2-user/.ssh
nano authorized_keys

3) 기존에 등록되어 있던 오래된 public key 삭제

기존 pem 노출된 key의 public key 라인을 삭제한다. (`nano authorized_keys`하면 아래와같은게 출력될거임)

 

`authorized_keys` 안에 있던 기존 `public key`들

  • `ssh-rsa` → key 타입
  • `AAAAB3NzaC1yc2EAAAADAQABAAABAQC3...` → 실제 public key
  • `user@hostname` → key 만든 사용자/호스트 정보 (optional)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3... user@hostname

 

그리고 새 pem 파일의 public key를 기존 키가 있던 부분(지워준부분)에 삽입해준다.

 

새로운키에서 추출하기 : 일단 git bash로 pem 키가 있는 경로로 이동해준 뒤, 다음 명령어를 실행해준다. 

ssh-keygen -y -f 새로받은키.pem

이후 `ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC3... user@hostname` 요거를 Linux 복사 단축키 : ctrl + shift + c로 복사한다. 이후에 기존 AWS 콘솔창의 ec2 터미널로 돌아가 기존 키자리에 복붙!!

 

4) 저장하고 나오기

nano에서는
`Ctrl + O` → Enter → `Ctrl + X`

 

5) 파일 권한 확인하기

여기에서 시소실에서 배운, 권한 부여 그걸 생각해주면된다. 600이 뭐였는가? 소유자에게 읽기+쓰기 권한 부여!

chmod 600 authorized_keys

cf) `chmod` ==   Linux/Unix에서 파일 권한(permission) 설정할 때 쓰는 명령어

`chmod XYZ 파일명`

 

  • X → 소유자(owner) 권한
  • Y → 그룹(group) 권한
  • Z → 기타 사용자(other) 권한

각 숫자는 읽기/쓰기/실행 권한을 나타냈었다. 위와같은 600은, 소유자에게는 읽기+쓰기 주고, 그룹/기타사용자에는 아무것도안줌!

권한 숫자
--- 0
--x 1
-w- 2
-wx 3
r-- 4
r-x 5
rw- 6
rwx 7

 

 

6)이제 모든것이 끝났다.

git bash에서 새로 내려받은 pem키로 ec2에 접근해보자.

ssh -i "새키.pem" ec2-user@EC2_공인IP

 

접근 잘된다 ㅎㅎ ^~^

마지막으로 github secrets의 ssh_private_key도 업데이트 해주면 처리 끝!

 

이것으로 회고를 마친다.

 

 

'개인공부정리페이지' 카테고리의 다른 글

<MySQL> DATETIME 타입 DATE로 변환  (0) 2026.02.26
MergeSort implement in C  (0) 2025.09.24
코드 포매터  (0) 2025.08.31
어노테이션 : Bean과 Autowired의 차이  (0) 2025.08.23
C++ 공부  (0) 2025.07.25
'개인공부정리페이지' 카테고리의 다른 글
  • <MySQL> DATETIME 타입 DATE로 변환
  • MergeSort implement in C
  • 코드 포매터
  • 어노테이션 : Bean과 Autowired의 차이
sihyes
sihyes
24학번 컴퓨터공학과
  • sihyes
    시혜적으로개발
    sihyes
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (106) N
      • 단순 설정 (9)
      • 백엔드 공부(BE, AWS) (8)
        • 로그인&회원가입 (3)
        • 파일업로드&GPT (2)
      • 개인 프로젝트 (2)
        • 알바솔로몬 (1)
        • PLACO 프로젝트 (0)
      • 도서 공부(정리) (20)
        • 알고리즘 코딩 테스트 자바 편 (1)
        • SQL첫걸음 (8)
        • 코딩 자율학습 스프링 부트 3 자바 백엔드 개발 .. (6)
        • Do it! 지옥에서 온 문서 관리자 깃&깃허브 .. (5)
      • 컴퓨터공학과 (51)
        • Python - 문해프 (1)
        • Java 1 & 2 (23)
        • 컴퓨터네트워크 (3)
        • 모앱JavaScript (0)
        • Data structures (9)
        • 소프트웨어공학 (5)
        • 오픈SW플랫폼 제출용 (5)
      • 개인공부정리페이지 (7) N
        • 백준 (2)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ㅇ
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.4
sihyes
[트러블슈팅].. PEM키가 공개된사건
상단으로

티스토리툴바