[Preview] 프리뷰 컨테이너를 node 로 돌린다 [ #332 ] - #357
Merged
Merged
Conversation
#332 2·3단계. 둘은 나눌 수 없다 — 사용자를 뒤집으려면 워크스페이스가 먼저 그 사용자 소유여야 하고, 반대로 소유자만 바꾸면 root 명령이 전부 막힌다. 프리뷰 컨테이너는 사용자가 연결한 저장소를 실제로 빌드해 돌린다. npm install 의 postinstall 과 빌드 스크립트는 저장소가 정하는 코드이고, 그것이 지금까지 root 로 돌았다. cap-drop ALL + no-new-privileges 라 탈출로 바로 이어지지는 않지만, 지금 안전한 진짜 이유는 바인드 마운트가 없기 때문이다 — 나중에 누가 마운트를 하나 붙이는 순간 root 라는 사실이 갑자기 중요해지고, 그때는 이 전제가 기억나지 않는다. 방향이 요점이다. 워크스페이스를 만지는 곳을 하나씩 node 로 바꾸면 40곳을 훑어야 하고 하나 빠뜨리면 그 경로만 조용히 깨진다. 기본을 뒤집으면 root 가 필요한 목록이 짧다: - 패키지 설치 — installPackages 로 모았다. 호출부마다 "여긴 root 여야 하나" 를 다시 판단하게 두면 한 곳만 빠뜨려도 그 경로가 조용히 깨지므로, 설치라는 행위 자체를 root 로 고정했다 - nginx 기동·종료 — 워크스페이스를 읽기만 하므로 root 로 둔다. 끄는 것도 root 여야 한다(node 는 root 프로세스에 시그널을 못 보낸다) - 컨테이너 생성 직후의 mkdir + chown 이슈 본문의 root 목록에 없던 두 곳을 채웠다. 템플릿 씨딩과 diff 기준 커밋은 apk 를 명령 체인 안에 품고 있었다. 그대로 두면 체인 전체가 root 로 돌아 작업 트리에 root 소유 파일이 섞이고, 그 뒤 node 명령이 막힌다. 설치만 떼어 root 로 보냈다. 빌드 컨테이너는 한 줄도 바뀌지 않는다. 1단계에서 역할을 가른 이유가 이것이다. dev 에서 실제 컨테이너로 전 경로를 태웠다: - 소유자 준비 → installPackages(root) → 씨딩(node) → 기준 커밋(node) → 수정 후 diff - git config --global · npm install 이 HOME=/home/node 로 정상 동작 - nginx: root 기동 exit=0, node 소유 파일 정상 서빙, node 는 못 끄고 root 는 끈다 - 격리: node 가 /etc/shadow 를 못 읽고 apk 가 거부된다 - exec -u root 는 no-new-privileges 와 무관하게 동작한다(데몬이 정하는 값) 기존 컨테이너는 영향받지 않는다 — 사용자 설정이 없어 그대로 root 로 돌고, execAsRoot 도 같은 결과라 재생성 없이 이어진다. 테스트 1682건 통과. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013y8USoCXTsRTATAhy88M93
6 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#332 2·3단계. 둘은 나눌 수 없다 — 사용자를 뒤집으려면 워크스페이스가 먼저 그 사용자 소유여야 하고, 반대로 소유자만 바꾸면 root 명령이 전부 막힌다. 1단계는 #356.
왜
프리뷰 컨테이너는 사용자가 연결한 저장소를 실제로 빌드해 돌린다.
npm install의 postinstall 과 빌드 스크립트는 저장소가 정하는 코드이고, 그것이 지금까지 root 로 돌았다.cap-drop ALL+no-new-privileges라 탈출로 바로 이어지지는 않는다. 지금 안전한 진짜 이유는 바인드 마운트가 없기 때문인데, 나중에 누가 마운트를 하나 붙이는 순간 root 라는 사실이 갑자기 중요해진다. 그때 기억나지 않을 종류의 전제다.방향이 요점이다
워크스페이스를 만지는 곳을 하나씩 node 로 바꾸면 40곳을 훑어야 하고, 하나 빠뜨리면 그 경로만 조용히 깨진다. 기본을 뒤집으면 root 가 필요한 목록이 짧다.
installPackages(신설)mkdir+chown/가 root 소유라 node 스스로는/workspace를 못 만든다이슈 목록에 없던 두 곳을 채웠다
템플릿 씨딩과 diff 기준 커밋이
apk를 명령 체인 안에 품고 있었다. 그대로 두면 체인 전체가 root 로 돌아 작업 트리에 root 소유 파일이 섞이고, 그 뒤 node 명령이 막힌다. 설치만 떼어 root 로 보냈다.빌드 경로는 한 줄도 안 바뀐다
1단계에서 역할을 가른 이유가 이것이다.
BUILD는 사용자 설정이 없어 그대로 root 이고, 소유자 준비도 하지 않는다.dev 실측 — 전 경로를 실제 컨테이너로 태웠다
기존 컨테이너
영향받지 않는다. 사용자 설정이 없어 그대로 root 로 돌고
execAsRoot도 같은 결과라, 재생성 없이 이어진다.검증
withUser("node")+HOME=/home/node, 빌드는withUser(null)이고 소유자 준비 exec 조차 하지 않음, 설치는installPackages로만, diff·씨딩 명령에apk가 섞이지 않음남은 것 (#332 완료 기준 중)
./gradlew bootRun까지 태운 실측은 아직입니다🤖 Generated with Claude Code
https://claude.ai/code/session_013y8USoCXTsRTATAhy88M93