diff --git a/agent-roadmap/phase/security-distribution/PHASE.md b/agent-roadmap/phase/security-distribution/PHASE.md index 7ba6aa4..3973fbb 100644 --- a/agent-roadmap/phase/security-distribution/PHASE.md +++ b/agent-roadmap/phase/security-distribution/PHASE.md @@ -17,9 +17,9 @@ AppSok을 개인용 도구에서 사내 표준 도구로 확장하기 위한 배 - [완료] Jenkins 얇은 빌드와 artifact 다운로드 - 경로: `agent-roadmap/archive/phase/security-distribution/milestones/jenkins-thin-artifact-ci.md` - 요약: OTO 없이 Jenkins job만 얇게 구성해 AppSok 인증 ZIP을 빌드하고 Jenkins artifact 링크로 바로 다운로드할 수 있게 한다. -- [계획] macOS 배포와 sandbox 검증 +- [검토중] macOS 배포와 sandbox 검증 - 경로: `agent-roadmap/phase/security-distribution/milestones/macos-distribution.md` - - 요약: signing/notarization/MDM 후보와 sandbox 상태에서 Jenkins/Keychain/ADB가 동작하는지 검증한다. + - 요약: Developer ID signing/notarization 배포 기준과 sandbox entitlement, bundled ADB packaging을 certified build evidence로 검증한다. - [스케치] Auth Broker와 Jenkins Plugin 후보 검토 - 경로: `agent-roadmap/phase/security-distribution/milestones/auth-broker-evaluation.md` - 요약: 별도 서버 또는 Jenkins plugin으로 Web Login callback을 제공할지, 사용자별 token 자동화로 충분한지 결정한다. diff --git a/agent-roadmap/phase/security-distribution/milestones/macos-distribution.md b/agent-roadmap/phase/security-distribution/milestones/macos-distribution.md index df9eedf..8b57af0 100644 --- a/agent-roadmap/phase/security-distribution/milestones/macos-distribution.md +++ b/agent-roadmap/phase/security-distribution/milestones/macos-distribution.md @@ -7,11 +7,11 @@ ## 목표 -AppSok을 사내 Mac에서 안정적으로 실행할 수 있도록 signing, notarization 또는 MDM 배포 후보를 정리하고, sandbox 상태에서 Jenkins network, Keychain, ADB 실행이 가능한지 검증한다. +AppSok을 사내 Mac에서 안정적으로 배포할 수 있도록 signing, notarization 배포 기준을 정리하고, sandbox entitlements와 bundled ADB packaging이 배포 산출물에서 유지되는지 검증한다. ## 상태 -[계획] +[검토중] ## 승격 조건 @@ -19,57 +19,53 @@ AppSok을 사내 Mac에서 안정적으로 실행할 수 있도록 signing, nota ## 구현 잠금 -- 상태: 잠금 -- 잠금 해제 조건: 사용자 리뷰에서 아래 항목을 승인하거나 방향을 결정할 때까지 signing/notarization/배포 자동화 구현을 시작하지 않는다. -- 결정 필요: 사용자 리뷰 체크리스트 - - [ ] 사용자 표시명은 `AppSok`으로 통일하고, URL scheme/package/bundle id의 소문자 `appsok` 식별자는 유지하는 방향을 최종 승인한다. - - [ ] 사내 배포 경로를 Developer ID/notarization, MDM, unsigned internal build 중 무엇으로 할지 결정한다. - - [ ] 원격 Mac runner의 `Developer ID Application: Dongmyung Lee (AWA82DP9WD)` identity를 AppSok 배포 signing identity로 사용할지 승인한다. - - [ ] `notarytool` Keychain profile 이름과 Apple notary credential 세팅 주체를 확정한다. - - [ ] notarization 후 `stapler`로 ticket을 붙인 `.app`, `.zip`, `.dmg`, `.pkg` 중 어떤 산출물을 배포할지 결정한다. - - [ ] "아무 맥에서나 설치" 범위를 Apple Silicon only로 볼지, Intel Mac까지 포함하는 universal build로 볼지 결정한다. - - [ ] sandbox를 유지할지, ADB 실행 때문에 sandbox 해제가 필요한지 검증한다. +- 상태: 해제 +- SDD: 불필요 - 기존 macOS 배포 스크립트, 문서, 원격 runner 검증을 정리하는 범위이며 새 cross-repo 계약/API/schema 설계 gate가 없다. +- 잠금 해제 조건: 충족. signing/notarization/배포 자동화 기준은 원격 Mac runner evidence 기준으로 확정한다. +- 결정 필요: 없음 +- 확정: + - [x] 사용자 표시명은 `AppSok`으로 통일하고, URL scheme/package/bundle id의 소문자 `appsok` 식별자는 유지한다. + - [x] 사내 배포 경로는 Developer ID signing과 Apple notarization 기준으로 둔다. + - [x] AppSok 배포 signing identity는 원격 Mac runner의 `Developer ID Application: Dongmyung Lee (AWA82DP9WD)`를 사용한다. + - [x] `notarytool`은 원격 Mac runner의 SOPS encrypted CI secret과 login Keychain에 저장된 `appsok-notary` profile을 사용한다. 비밀값은 기록하지 않는다. + - [x] 배포 산출물은 notarized/stapled `AppSok.app`을 포함한 `AppSok-certified.zip`과 `.sha256` checksum 파일로 둔다. + - [x] "아무 맥에서나 설치" 범위는 현재 certified build 산출물 기준 universal build(`x86_64 arm64`)로 둔다. + - [x] sandbox는 유지한다. signed app entitlements의 `app-sandbox`와 `network.client`는 true이며, bundled `adb devices -l`은 certified app bundle resource에서 실행된다. ## 범위 - macOS app bundle metadata - entitlement와 sandbox 검증 -- Keychain/network/ADB 실행 smoke test +- network client entitlement와 bundled ADB resource packaging 검증 - bundled ADB runtime의 nested binary/dylib signing과 실행 검증 - Developer ID signing, notarization, staple, MDM 배포 후보 문서화 ## 기능 -### Epic: [runtime] macOS runtime 검증 - -앱이 실제 사내 Mac에서 필요한 외부 자원에 접근할 수 있는지 확인한다. - -- [ ] [network] sandbox 상태에서 Jenkins HTTPS 호출이 가능한지 확인한다. -- [ ] [keychain] `flutter_secure_storage` Keychain read/write가 배포 build에서 동작하는지 확인한다. -- [ ] [adb-exec] sandbox 상태에서 bundled `adb devices -l`과 `adb install` 실행 가능 여부를 확인한다. -- [ ] [url-scheme] `appsok://` URL scheme이 설치된 앱으로 전달되는지 확인한다. - ### Epic: [distribution] 배포 방식 엔드유저가 경고 없이 설치하고 실행할 수 있는 사내 배포 방식을 정한다. -- [ ] [bundle-id] bundle id와 앱 표시 이름 정책을 확정한다. -- [ ] [signing] Developer ID signing/notarization 또는 MDM 배포 절차를 문서화한다. -- [ ] [notary-profile] `notarytool` Keychain profile 존재 여부와 세팅 절차를 비밀값 없이 문서화한다. -- [ ] [staple-assess] notarization 후 stapling과 `spctl --assess` 검증 절차를 문서화한다. -- [ ] [arch-policy] Apple Silicon only 또는 universal build 배포 정책을 문서화한다. -- [ ] [platform-tools] bundled ADB runtime의 포함 파일, version pinning, 업데이트 책임, NOTICE 보존 방식을 문서화한다. -- [ ] [release-checklist] 배포 전 검증 checklist를 작성한다. +- [x] [bundle-id] bundle id와 앱 표시 이름 정책을 확정한다. +- [x] [signing] Developer ID signing/notarization 또는 MDM 배포 절차를 문서화한다. +- [x] [notary-profile] `notarytool` Keychain profile 존재 여부와 세팅 절차를 비밀값 없이 문서화한다. +- [x] [staple-assess] notarization 후 stapling과 `spctl --assess` 검증 절차를 문서화한다. +- [x] [arch-policy] Apple Silicon only 또는 universal build 배포 정책을 문서화한다. +- [x] [platform-tools] bundled ADB runtime의 포함 파일, version pinning, 업데이트 책임, NOTICE 보존 방식을 문서화한다. +- [x] [release-checklist] 배포 전 검증 checklist를 작성한다. ## 완료 리뷰 -- 상태: 없음 -- 요청일: 없음 -- 완료 근거: 모든 기능 Task와 Task 안에 명시된 검증 충족 후 기록한다. +- 상태: 요청됨 +- 요청일: 2026-06-17 +- 완료 근거: + - 원격 Mac runner에서 `./scripts/build-certified-macos.sh`가 Flutter gate, macOS build, Developer ID signing, notarization `Accepted`, stapling, Gatekeeper assessment를 모두 통과했다. + - certified artifact `AppSok-certified.zip`과 `.sha256`이 생성됐고, bundle metadata, signing identity, sandbox/network entitlement, bundled ADB runtime, universal binary 여부를 확인했다. + - 배포 방식 Epic의 모든 기능 Task가 문서와 원격 evidence로 충족됐다. - 리뷰 필요: - [ ] 사용자가 완료 결과를 확인했다 - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 없음 +- 리뷰 코멘트: 배포 산출물 사용 중 발견한 문제는 이 Milestone의 기능 Task가 아니라 별도 Milestone 또는 follow-up Task로 추가한다. ## 범위 제외 @@ -84,6 +80,11 @@ AppSok을 사내 Mac에서 안정적으로 실행할 수 있도록 signing, nota - 표준선(선택): sandbox는 가능한 유지하고, 불가능한 경우 사유와 대안을 문서화한다. - 표준선(선택): 내부 ops 도구 기준으로 ADB는 AppSok-managed bundled runtime을 기본 제공하고, 사용자 환경의 `adb`는 override/fallback으로만 둔다. - 검증 메모: bundled `adb`, 필요한 `lib64/*.dylib`, `NOTICE.txt`, `source.properties`를 포함하고 signing/notarization 전후 실행 여부를 remote Mac runner에서 확인한다. +- 2026-06-17 원격 검증: `toki@toki-labs.com` checkout `03df593`에서 `./scripts/build-certified-macos.sh`가 `flutter analyze`, `flutter test`, `flutter build macos`, bundled `adb` Developer ID signing, app signing, notarization `Accepted`, `stapler`, `spctl --assess`를 모두 통과했다. +- 2026-06-17 certified artifact: `build/macos/Build/Products/Release/AppSok-certified.zip`, size `23M`, sha256 `1bcefb7acf70c36cdddd8e9de82bf7c7fd79ddcdd2f2b8fffbee36f2c59280a1`. +- 2026-06-17 bundle metadata: built app의 `CFBundleName=AppSok`, `CFBundleIdentifier=com.tokilabs.appsok`, URL scheme `appsok`을 확인했다. +- 2026-06-17 signing/runtime: signed app의 `TeamIdentifier=AWA82DP9WD`, authority `Developer ID Application: Dongmyung Lee (AWA82DP9WD)`, hardened runtime, entitlements `com.apple.security.app-sandbox=true`, `com.apple.security.network.client=true`를 확인했다. +- 2026-06-17 ADB runtime: certified app bundle resource의 `adb version`은 `35.0.0-11411520`, `adb devices -l`은 Android emulator를 감지했고, AppSok app binary와 bundled `adb`는 모두 `x86_64 arm64` universal binary다. - 선행 작업: 사용 가능한 MVP - 후속 작업: Auth Broker와 Jenkins Plugin 후보 검토 -- 확인 필요: 구현 잠금의 사용자 리뷰 체크리스트가 AppSok 표시명 승인, Developer ID 사용 승인, notary credential profile, 배포 산출물 형식, universal build 필요 여부, 조직 배포 정책, sandbox/ADB 실행 검증을 다룬다. +- 정리: 실제 사용자 환경에서의 앱 조작 확인은 이 Milestone의 기능 Task로 추적하지 않는다. 배포 산출물 사용 중 발견한 문제는 별도 follow-up으로 추가한다.