๐ง ATMS - CICD ํธ๋ฌ๋ธ์ํ (SSH Permission Deniedํธ)
์ง๋ ์๊ฐ์ Jenkins ์ปจํ ์ด๋๋ฅผ ๋์ฐ๊ณ , GitLab๊ณผ ๋ฐฐํฌ ์๋ฒ ์์ชฝ์ ์ธ์ฆ์ ์ฐ๊ฒฐํด ํ์ดํ๋ผ์ธ์ ๋ผ๋๋ฅผ ๋ง๋ค์๋ค.
์ด๋ฒ ์๊ฐ์๋ ๊ทธ ํ์ดํ๋ผ์ธ์ ์ค์ ๋ก ๋๋ฆฌ์๋ง์ ๋ง์ฃผ์น ์ฒซ ๋ฒ์งธ ๋ฒฝ โ SSH Permission Denied๋ฅผ ๋ค๋ฃจ๊ฒ ๋ค.
Jenkinsfile์ Deploy ์คํ
์ด์ง, sshagent ๋ธ๋ก ์์์ ๋ฐฐํฌ ์๋ฒ๋ก ์ ์ํ๋ ์๊ฐ ๋ค์ ์๋ฌ๊ฐ ๋จ์ด์ก๋ค.
deploy@10.0.20.15: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
ํค ํ์ด๋ ๋ถ๋ช
ํ Jenkins ์ปจํ
์ด๋ ์์์ ์์ฑํด์ ์๋ฒ ~/.ssh/authorized_keys์ ๋ฑ๋กํ๋๋ฐ๋ ๊ฑฐ๋ถ๋นํ๋ค.
๋ฌด์์ ์ค์ ์ ์ด๊ฒ์ ๊ฒ ๋ฐ๊ฟ๋ณด๊ธฐ ์ ์, ssh -vvv ๋ก ํ๋ณดํ ์์ธ ๋ก๊ทธ๋ฅผ ๊ทธ๋๋ก Claude Code์ ๋ถ์ฌ๋ฃ๊ณ "Offering public key ๋ค์์ ๋ฐ๋ก ๊ฑฐ๋ถ๋นํ๋ ํจํด์ด๋ฉด ๋ญ ์์ฌํด์ผ ํ๋" ๋ฅผ ๋ฌผ์ผ๋ฉฐ ์์ํ๋ค. ๋์์จ ๋ฐฉํฅ์ "ํค ์์ฒด๋ณด๋ค, ์๋ฒ๊ฐ ํค๋ฅผ ์ ๋ขฐํ์ง ์๋ ์กฐ๊ฑด(๊ถํ ยท SELinux)๋ถํฐ ํ๋์ฉ ์๊ฑฐํ์"์๋ค โ ๊ทธ ์์๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ๋ค.
๊ฐ์ฅ ๋จผ์ ์์ฌํ ๊ฑด ๋จ์ํ ์ค์ โ ๋ฑ๋กํ ๊ณต๊ฐํค์ ์ค์ ์ฌ์ฉ ์ค์ธ ๊ฐ์ธํค๊ฐ ์๋ก ์ง์ด ์ ๋ง๋ ๊ฒฝ์ฐ๋ค.
# Jenkins ์ปจํ
์ด๋: ๊ฐ์ธํค โ ๊ณต๊ฐํค ๋์ถ
ssh-keygen -y -f /var/jenkins_home/.ssh/atms_deploy_key
# ์์ชฝ ํ๊ฑฐํ๋ฆฐํธ ๋น๊ต
ssh-keygen -l -f /var/jenkins_home/.ssh/atms_deploy_key
ssh-keygen -l -f /home/deploy/.ssh/authorized_keys
๋ SHA256 ํด์๋ ์ ํํ ์ผ์นํ๋ค. ํค ์์ฒด๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ป์ด๋ค.
โ ๊ธฐ๊ฐ.
Windows ํ๊ฒฝ์์ ๊ณต๊ฐํค๋ฅผ ๋ณต์ฌํด ๋ถ์ฌ๋ฃ๋ ๊ณผ์ ์ด ์์๊ธฐ ๋๋ฌธ์, CRLF๊ฐ ์์ฌ ๋ค์ด๊ฐ ํค๊ฐ ๊นจ์ก์ ๊ฐ๋ฅ์ฑ๋ ํ์ธํ๋ค.
cat -A /home/deploy/.ssh/authorized_keys | grep '\^M'
^M์ ๋ณด์ด์ง ์์๋ค. ์ค๋ฐ๊ฟ ์ค์ผ๋ ์๋์๋ค.
โ ๊ธฐ๊ฐ.
์ฌ๊ธฐ๊น์ง ํ์ธํ๊ณ ๋๋ ์ฌ์ฌ ์ด์กฐํด์ก๋ค. ํค๋ ๋ง๊ณ , ํ์ผ๋ ๋ฉ์ฉกํ๋ฐ ์ ๊ฑฐ๋ถ๋นํ๋๊ฐ?
SSH๋ authorized_keys๋ฟ ์๋๋ผ ๊ทธ ์์ ๋๋ ํ ๋ฆฌ๋ค์ ๊ถํ๊น์ง ๊น๊นํ๊ฒ ๊ฒ์ฌํ๋ค. ํ์ธํด๋ณด๋:
stat /home/deploy | grep Access
# (0775/drwxrwxr-x)
๊ทธ๋ฃน(Group)์ ์ฐ๊ธฐ(w) ๊ถํ์ด ์ด๋ ค์์๋ค. SSH ์ ์ฅ์์๋ "๋ค๋ฅธ ๊ทธ๋ฃน ๊ณ์ ์ด ์ด ๋๋ ํ ๋ฆฌ ๋ด์ฉ์ ๋ฐ๊ฟ ์ ์๋ค = ์ ๋ขฐํ ์ ์๋ค"๊ณ ํ๋จํ๊ณ ํค ์ธ์ฆ ์์ฒด๋ฅผ ๊ฑฐ๋ถํ๋ค.
chmod 755 /home/deploy
deploy)๋ ์๋๋ rwx๋ผ ๋ณํ ์์ โ ๊ธฐ์กด ๋์์ ์ํฅ ์๋ค.atms/, .ssh/ ๋ฑ)๋ ๊ทธ๋๋ก๋ค.๊ถํ์ ๊ณ ์น๊ณ ๋ค์ ์๋ํ๋ค.
...์ฌ์ ํ Permission denied.
๋ฐฐํฌ ์๋ฒ๋ CentOS 7์ด์๊ณ , SELinux๊ฐ Enforcing ์ํ๋ก ์ผ์ ธ ์์๋ค. ์ด๋ฒ์ ํ์ผ ๊ถํ(chmod)์ด ์๋๋ผ SELinux ์ปจํ
์คํธ(๋ผ๋ฒจ) ๋ฅผ ์์ฌํ๋ค.
ls -Z /home/deploy/.ssh/authorized_keys
unconfined_u:object_r:httpd_sys_content_t:s0
ssh_home_t์ฌ์ผ ํ ์ปจํ
์คํธ๊ฐ httpd_sys_content_t(์น์๋ฒ์ฉ ๋ผ๋ฒจ)๋ก ์ง์ ๋์ด ์์๋ค. SELinux๋ ํ์ผ ๊ถํ๊ณผ ๋ณ๊ฐ๋ก "์ด ํ๋ก์ธ์ค๊ฐ ์ด ๋ผ๋ฒจ์ ํ์ผ์ ์ ๊ทผํด๋ ๋๋๊ฐ"๋ฅผ ์ ์ฑ
์ผ๋ก ํ ๋ฒ ๋ ๊ฒ์ฌํ๋๋ฐ, sshd ์
์ฅ์์๋ ์ด ๋ผ๋ฒจ์ ์ ๋ขฐํ์ง ์์ผ๋ ์กฐ์ฉํ ์ ์์ ๊ฑฐ๋ถํ ๊ฒ์ด๋ค.
sudo restorecon -Rv /home/deploy/.ssh/
ls -Z /home/deploy/.ssh/authorized_keys
# โ ssh_home_t ๋ก ๋ณต์๋จ
SELinux ๋ผ๋ฒจ๋ง ์ ์ฑ
๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๋๋ฆด ๋ฟ, ํ์ผ ๋ด์ฉยท์์ ์ยทchmod ๊ถํ์ ์ ํ ๊ฑด๋๋ฆฌ์ง ์๋๋ค. /home/deploy/.ssh/ ๋ฐ์ ๋ค๋ฅธ ์๋น์ค์๋ ์ํฅ์ด ์๋ค.
๋ค์ ์ ์์ ์๋ํ๋ค.
ssh -i /var/jenkins_home/.ssh/atms_deploy_key \
-o PasswordAuthentication=no \
deploy@10.0.20.15 "echo ์ ์์ฑ๊ณต"
์ ์์ฑ๊ณต
๋๋์ด ๋ซ๋ ธ๋ค.
๊ฒฐ๋ก
ํ๋์ ์๋ฌ ๋ฉ์์ง ๋ค์ ์์ธ์ด ๋ค ๊ฐ๋ ๊ฒน์ณ ์์ ์ ์๋ค๋ ๊ฑธ ์ด๋ฒ์ ์ ๋๋ก ๋ฐฐ์ ๋ค. ํนํ SELinux๋ chmod/ls -l๋ง ๋ด์๋ ์ ๋ ๋๋ฌ๋์ง ์์์, ๊ถํ์ ๋ค ๋ง์ท๋๋ฐ๋ ์ฌ์ ํ ๊ฑฐ๋ถ๋นํ๋ค๋ฉด ls -Z๋ถํฐ ํ์ธํ๋ ์ต๊ด์ ๋ค์ด๊ฒ ๋๋ค.