๐Ÿ” CI/CD์— ๋ฐฑ๋„์–ด๊ฐ€? ๋ฏฟ๋Š” ๋„๋ผ์— ๋ฐœ๋“ฑ ์ฐํžŒ๋‹ค! GitHub Actions ๋ณด์•ˆ ์ด์Šˆ

์„ํ˜„ยท2025๋…„ 3์›” 27์ผ

Issues

๋ชฉ๋ก ๋ณด๊ธฐ
7/8
post-thumbnail

์š”์ฆ˜ ๊ฐœ๋ฐœ์ž๋“ค์ด๋ผ๋ฉด GitHub Actions๋ฅผ ํ•œ ๋ฒˆ์ฏค์€ ์‚ฌ์šฉํ•ด๋ดค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ, ๋ฐฐํฌ๊นŒ์ง€ ๋‹จ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•จ ๋•๋ถ„์— CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ฃ .

๊ทธ๋Ÿฐ๋ฐ ์ตœ๊ทผ ์šฐ์—ฐํžˆ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋‹ค ๋งˆ์ฃผ์นœ ์“ฐ๋ ˆ๋“œ ํ•˜๋‚˜๊ฐ€ ๋ˆˆ์— ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค. "CI/CD ๊ทธ๋ƒฅ ์“ฐ๋‹ค ํ•ดํ‚น๋‹นํ•ด์š”"๋ผ๋Š” ์ œ๋ชฉ. ์ฒ˜์Œ์—” ์ž๊ทน์ ์ธ ์ œ๋ชฉ์ธ๊ฐ€ ์‹ถ์—ˆ์ง€๋งŒ, ๋‚ด์šฉ์„ ๋“ค์—ฌ๋‹ค๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ์‹ฌ๊ฐํ•œ ์ด์Šˆ์˜€์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ๊ด€๋ จ ๋‚ด์šฉ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , ์˜ค๋Š˜ ๊ทธ ์ด์•ผ๊ธฐ๋ฅผ ๊ณต์œ ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงจ ์–ด๋–ค ์ผ์ด ์žˆ์—ˆ๋‚˜?

2025๋…„ 3์›” 14์ผ, GitHub์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋˜ ์•ก์…˜ ์ค‘ ํ•˜๋‚˜์ธ tj-actions/changed-files ์•ก์…˜์ด ๊ณต๊ฒฉ์„ ๋ฐ›์•„ ๋ฐฑ๋„์–ด๊ฐ€ ์‚ฝ์ž…๋˜๋Š” ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์•ก์…˜์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ๋งŽ์ด ์“ฐ์ด๋Š”๋ฐ, ์ด์ฒ˜๋Ÿผ ์ธ๊ธฐ ์žˆ๋Š” ์•ก์…˜์ด ๊ณต๊ฒฉ๋‹นํ•˜๋ฉด์„œ ์ˆ˜๋งŽ์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์œ„ํ—˜์— ๋…ธ์ถœ๋˜์—ˆ์ฃ .

๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‹œํฌ๋ฆฟ์„ ์œ ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œ์ผœ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‹คํ–‰
  2. Python + Shell ์กฐํ•ฉ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋คํ”„
  3. ํŠน์ • ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ์‹œํฌ๋ฆฟ ํƒ์ƒ‰
  4. Base64๋กœ ์žฌ์ธ์ฝ”๋”ฉ ํ›„ ๋กœ๊ทธ์— ์ถœ๋ ฅ
python3 -c 'import os,base64,re; pattern = r"\"value\":\"([^\"]+)\".*isSecret\":true"; re.findall(pattern, memory_dump)'

์ฆ‰, ๋‹จ์ˆœํžˆ ์‹œํฌ๋ฆฟ์„ ํ›”์น˜๋Š” ๊ฒƒ์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ์— ์ถœ๋ ฅ๋˜๋„๋ก ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋กœ๊ทธ๋งŒ ๋ด๋„ ์‹œํฌ๋ฆฟ์ด ๋…ธ์ถœ๋˜๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Š ์‹ค์ œ ํ”ผํ•ด ๊ทœ๋ชจ๋Š”?

์‹œํฌ๋ฆฟ ์œ ์ถœ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
์ด ์›Œํฌํ”Œ๋กœ์šฐ ์‹คํ–‰ ์ˆ˜1104๊ฐœ
๊ณต๊ฒฉ ํ”์  ๋ฐœ๊ฒฌ๋œ ์›Œํฌํ”Œ๋กœ์šฐ276๊ฐœ
์‹คํ–‰ ๋กœ๊ทธ ์‚ญ์ œ๋œ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ237๊ฐœ / 256๊ฐœ ์‹คํ–‰ ๋กœ๊ทธ ์‚ญ์ œ
์œ ์ถœ๋œ ์‹œํฌ๋ฆฟ ์ˆ˜603๊ฐœ
์ฃผ์š” ์‹œํฌ๋ฆฟ ์ข…๋ฅ˜GitHub Token, DockerHub ์ธ์ฆ ์ •๋ณด, AWS ์•ก์„ธ์Šค ํ‚ค

GitHub ํ† ํฐ(gsh_), AWS ํ‚ค ๋“ฑ ๋ฏผ๊ฐํ•œ ์ธ์ฆ ์ •๋ณด๊ฐ€ ๋‹ค์ˆ˜ ์œ ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ›ก ์‹ค๋ฌด์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•ด์•ผ ํ• ๊นŒ?

์ด ๋ฌธ์ œ๋ฅผ ๊ณ„๊ธฐ๋กœ CI/CD์—์„œ์˜ ๋ณด์•ˆ์„ ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ฏผํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 1. ์™ธ๋ถ€ ์•ก์…˜ Pinning ํ•˜๊ธฐ

์™ธ๋ถ€ ์•ก์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ผญ SHA(Pinning)๋ฅผ ๊ณ ์ •ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ• ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ฒ„์ „์œผ๋กœ ๊ณ ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ๊ณต๊ฒฉ์ž๊ฐ€ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์œผ๋กœ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ๊ฐ์ง€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : GitHub Security Hardening Guide

โœ… 2. ๋กœ๊ทธ ์ ๊ฒ€ & ์‹œํฌ๋ฆฟ ํšŒ์ˆ˜

  • ์‹คํ–‰ ๋กœ๊ทธ์— ์‹œํฌ๋ฆฟ์ด ๋…ธ์ถœ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ
  • ์œ ์ถœ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ์ฆ‰์‹œ ๋กœ๊ทธ ์‚ญ์ œ + ํ‚ค ๊ต์ฒด๋Š” ํ•„์ˆ˜

โœ… 3. Honeytoken ํ™œ์šฉ

  • ์ด๋Ÿฐ ๋ช…์นญ์ด ์žˆ๋Š”์ง€๋Š” ๋ชฐ๋ž์ง€๋งŒ, ๊ณต๊ฒฉ ํƒ์ง€๋ฅผ ์œ„ํ•ด ํ—ˆ์œ„ ์‹œํฌ๋ฆฟ์„ ๋„ฃ์–ด๋‘๋Š” Honeytoken ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณต๊ฒฉ์ด ์‹œ๋„๋œ ์‹œ์ ์„ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : Honeytokens์— ๋Œ€ํ•œ ๊ฐœ๋…

โœ… 4. GitHub Action ๋ณด์•ˆ ์ ๊ฒ€ ํˆด ์‚ฌ์šฉ

  • tj-actions/changed-files์™€ ๊ฐ™์€ ์•ก์…˜์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธ
  • GitHub Actions ๋ณด์•ˆ ์ ๊ฒ€ ํˆด์ธ actionlint ๋“ฑ์„ ํ†ตํ•ด ์ „์ฒด Workflow๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ์ด๊ฒŒ ์™œ ์ด๋ ‡๊ฒŒ ์œ„ํ—˜ํ•œ๊ฐ€์š”?

์‹œํฌ๋ฆฟ์€ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜๋‚˜๊ฐ€ ์œ ์ถœ๋˜๋ฉด,

  • ๋ฐฐํฌ๋œ ์ธํ”„๋ผ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • DockerHub ์ด๋ฏธ์ง€ ์กฐ์ž‘ ๊ฐ€๋Šฅ
  • AWS ์ž์› ๋ฌด๋‹จ ์ƒ์„ฑ ๊ฐ€๋Šฅ

์ฆ‰, ์œ ์ถœ ์ฆ‰์‹œ ํ”„๋กœ๋•์…˜ ์ „์ฒด๊ฐ€ ํ•ดํ‚น๋‹นํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.


๐Ÿ“š ์œ ์šฉํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ


๐Ÿš€ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ด๋ฒˆ ์‚ฌ๊ฑด์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋งŽ์€ ๊ฒƒ์„ ์‹œ์‚ฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŽธ๋ฆฌํ•จ ๋’ค์—” ์–ธ์ œ๋‚˜ ๋ณด์•ˆ ๋ฆฌ์Šคํฌ๊ฐ€ ์ˆจ์–ด ์žˆ์Šต๋‹ˆ๋‹ค. CI/CD ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ์˜ฌ๋ ค์ฃผ์ง€๋งŒ, ์ž˜๋ชป๋œ ์„ค์ • ํ•˜๋‚˜๊ฐ€ ์ „์ฒด ์„œ๋น„์Šค๋ฅผ ๋ฌด๋„ˆ๋œจ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋„ GitHub Actions์„ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , ๋‚˜์ค‘์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ํŒ€ ์ „์ฒด๊ฐ€ ํ”ผํ•ด๋ฅผ ์ž…์„ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ์ด ๋ธ”๋กœ๊ทธ๋ฅผ ์“ฐ๊ฒŒ ๋˜์—ˆ์–ด์š”. ์ œ๋ชฉ ๊ทธ๋Œ€๋กœ ๋ฏฟ๋Š” ๋„๋ผ์— ๋ฐœ๋“ฑ ์ฐํž์ˆ˜ ์žˆ์œผ๋‹ˆ ์‚ฌ์ „์— ์ค€๋น„ํ•ด์„œ ๋Œ€๋น„ํ•ฉ์‹œ๋‹ค!


#GitHubActions #์‹œํฌ๋ฆฟ์œ ์ถœ #CI๋ณด์•ˆ #SupplyChainAttack #tj-actions #DevSecOps #๋ณด์•ˆ๋ฆฌ์Šคํฌ #๋ณด์•ˆํŒ #Honeytoken #actionlint

0๊ฐœ์˜ ๋Œ“๊ธ€