-
웹알못의 데이터 어드민 사이트 만들기(feat. Streamlit) 4. 보안을 보완etc. 2022. 9. 10. 02:19
데이터 보안에 대한 피드백을 받은 후 바로 보안 팀과 논의에 들어갑니다.
보완해야 할 부분은 두 가지였습니다.
1. 허용된 구성원만 접근할 수 있게 할 것
2. 데이터 추출 시 기록을 남길 것
다른 오픈소스나 SaaS의 경우 몇 가지 설정을 통해 구글 oauth 로그인을 추가할 수 있었기 때문에
이번에도 그냥 추가하면 되겠거니 했지만 Streamlit은 호락호락하지 않았습니다.
Flask도, django도 아닌 tornado 프레임워크 기반인데다,
라이브러리를 건드리지 않고 페이지 코드에서 로그인을 추가할 수 없었습니다.
왜냐면 정해진 방법 외에는 리다이렉트 페이지를 생성할 수 있는 방법이 없었기 때문입니다.
...는 사실 등잔 밑이 어두운 웹알못이었습니다.
Streamlit 공식 문서에서 친절하게도 k8s 기반으로 배포할 때 인증에 대해 알려주고 있었기 때문이죠.
Streamlit Docs
Join the community Streamlit is more than just a way to make data apps, it's also a community of creators that share their apps and ideas and help each other make their work better. Please come join us on the community forum. We love to hear your questions
docs.streamlit.io
앞으로 공식 문서를 더 잘 살펴보자는 반성을 하며
oauth2-proxy 사이드카 컨테이너를 통해 인증 과정을 추가하게 됩니다.
https://oauth2-proxy.github.io/oauth2-proxy/docs/configuration/oauth_provider#google-auth-provider
OAuth Provider Configuration | OAuth2 Proxy
You will need to register an OAuth application with a Provider (Google, GitHub or another provider), and configure it with Redirect URI(s) for the domain you intend to run oauth2-proxy on.
oauth2-proxy.github.io
특히 조직의 모든 구성원이 아닌 허용된 사용자만 접근할 수 있도록
GCP 콘솔에서 그룹과 Service Account를 생성하고 연동했습니다.
이제 다시 오픈해도 되겠다 생각한 순간,
인간의 욕심은 끝이 없다고.. 이왕 보안을 도입한거 개인정보 처리 시스템까지 만들어버릴까? 의욕이 샘솟아 버립니다.
프롤로그에서 이야기한 것처럼 데이터 애드혹 중 큰 비중을 차지하는 것이 바로 개인정보 요청이기 때문입니다.
그래서 아래 로직대로 페이지를 구성해 봤습니다.
1. 허용된 사용자가 로그인한다.
2. 개인정보 열람 신청 페이지에서 신청서를 작성한다.
- 신청자는 구글 로그인한 본인으로 고정
- 신청 목적, 파기 일정 입력
- 개인정보 활용 및 파기 동의 체크
3. 신청서가 제출되면 해당 건에 대한 신청 uid가 발급된다.
4. 개인정보 관리자가 별도의 페이지를 통해 uid를 입력하고 신청서를 승인한다.
- uid는 승인 후 한 시간 동안 유효하며, 다른 사용자가 사용할 수 없다.
5. 신청자가 개인정보 추출 페이지를 방문해 승인받은 uid를 입력하고 user id 리스트 파일을 업로드한다.
6. 원하는 개인정보 필드를 선택하고 최종 파일을 다운로드한다.
사용 기록을 남기는 구간은 다음과 같습니다.
1. 신청서 작성 시 : REQUESTED
2. 신청서 승인 시 : CONFIRMED
2-1. 신청서 반려 시 : DENIED
3. 파일 다운로드 시 : DOWNLOADED
사용 기록은 아래와 같이 저장합니다.
1. 내역
- 신청자 정보
- 신청 uid
- 신청 시각
- 신청 목적
- 파기 일정
- 동의 여부
- 승인 담당자
- 승인 시각
- 다운로드 시각
- 다운로드한 정보 목록
2. 상세 내역
- 신청 uid
- 다운로드 시각
- 다운로드한 user id 목록
그리고 슬랙을 연동해 개인정보 관리자들이 현황을 바로 파악할 수 있게 구성했습니다.
다운로드되는 파일 역시 암호화된 zip 형식으로 보안을 강화했습니다.
def encrypt_zip(df, password): csv = df.to_csv(f"privacy_data.csv", index=False, encoding='utf-8-sig') pyminizip.compress(f"privacy_data.csv", None, f"privacy_data.zip", password, 1) os.remove(f"privacy_data.csv")
보완 후 한 달만에 정식으로 서비스를 오픈하게 됩니다.
다음 과제는 이제 어떻게 구성원들이 이 서비스를 사용하게 할 것인가..? 가 되었습니다.
서비스 접근 자체에 허가가 필요하다 보니 선뜻 먼저 써보려는 분들이 많지 않고 이대로는 유령 서비스가 되겠다 싶어
가이드 문서도 작성하고 주변을 통해 직접 알리기도 하고
매일 개인정보를 다루어야 하는 물류, CRM 등 담당자들에게 우선적으로 계정을 부여하기도 하는 등
사실상 서비스 회사 안의 또다른 서비스를 만든 느낌입니다(?)
'etc.' 카테고리의 다른 글
빅쿼리로 데이터 인프라 이전하기 (1) 비용 최적화 with Dataform (0) 2023.06.10 웹알못의 데이터 어드민 사이트 만들기(feat. Streamlit) 5. Epilogue (0) 2022.09.10 웹알못의 데이터 어드민 사이트 만들기(feat. Streamlit) 3. 오픈은 실전 (1) 2022.09.10 웹알못의 데이터 어드민 사이트 만들기(feat. Streamlit) 2. 페이지 작성 (0) 2022.09.10 웹알못의 데이터 어드민 사이트 만들기(feat. Streamlit) 1. 환경 구축 (0) 2022.09.10