two factor ์ธ์ฆ ์‚ฌ์šฉํ•˜๊ธฐ


๋ฐฉํ™”๋ฒฝ์œผ๋กœ ์ ‘๊ทผ ํ†ต์ œ, ๊ณต๊ฐœํ‚ค ์ธ์ฆ, ๊ทธ๋ฆฌ๊ณ  fail2ban ์œผ๋กœ ์ธ์ฆ์— ์‹คํŒจํ•œ ํด๋ผ์ด์–ธํŠธ ์ฐจ๋‹จ๋“ฑ์œผ๋กœ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ–ˆ์ง€๋งŒ ์ง์› PC๊ฐ€ ํ•ดํ‚น๋˜์–ด ์›๊ฒฉ์œผ๋กœ ์กฐ์ •์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฐœํ‚ค์™€ ์•”ํ˜ธ๊ฐ€ ์œ ์ถœ๋  ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์œ„ํ˜‘์€ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ์—ฌ๋Ÿฌ ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ํ˜ผ์šฉํ•˜์—ฌ ์ธ์ฆํ•˜๋Š” Two Factor ์ธ์ฆ์„ ํ†ตํ•ด ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ผํšŒ์šฉ ์•”ํ˜ธ(OTP; One Time Password) ๋ฐฉ์‹์„ ์ ์šฉํ•˜์—ฌ SSH ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ผํšŒ์šฉ ์•”ํ˜ธ(One Time Password)๋ž€

์ „ํ†ต์ ์œผ๋กœ ์•”ํ˜ธ์™€ ๊ฐ™์ด ํŠน์ • ์ •๋ณด๋ฅผ ์•Œ ๊ฒฝ์šฐ ์ธ์ฆํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ "์ง€์‹ ๊ธฐ๋ฐ˜ ์ธ์ฆ(knowledge factor authentication)" ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. "์ง€์‹ ๊ธฐ๋ฐ˜ ์ธ์ฆ"์€ ๋ณ„๋„์˜ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž๋“ค์ด ์ต์ˆ™ํ•œ ์žฅ์ ์ด ์žˆ์ง€๋งŒ ๋ณดํ†ต ๊ทธ ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ์ •๋ณด์™€ ์—ฐ๊ด€๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ ์ถ”์ธก์— ์˜ํ•œ ๋ฌด์ž‘์œ„ ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๊ณ  ์•”ํ˜ธ๊ฐ€ ์œ ์ถœ๋์„ ๊ฒฝ์šฐ ์œ ์ถœ ์‚ฌ์‹ค๋„ ์•Œ๊ธฐ๊ฐ€ ์–ด๋ ค์šด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์•”ํ˜ธ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐ”๊พธ๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๋“ฑ์˜ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ์•”ํ˜ธ์˜ ํŠน์„ฑ์ƒ ์œ ์ถœ์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.


์ผํšŒ์šฉ ์•”ํ˜ธ๋Š” ๊ธฐ์กด ์•”ํ˜ธ์˜ ๋‹จ์ ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์•„์ฃผ ์งง์€ ์‹œ๊ฐ„๋งŒ ์œ ํšจํ•œ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์žฌํ™œ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์•”ํ˜ธ ์œ ์ถœ ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์„œ๋ฒ„์™€ OTP ํด๋ผ์ด์–ธํŠธ๊ฐ„์— ๊ณต์œ  ๋น„๋ฐ€ ํ‚ค(shared secret key)๋ฅผ ๋‚˜๋ˆ  ๊ฐ–๊ณ  ์‹œ๊ฐ„์„ ๋งž์ถ˜ ํ›„์— ์ผํšŒ์šฉ ๋น„๋ฐ€ ๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” TOTP(Time-Based One-time Password) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 


๊ตฌ๊ธ€ OTP ์†”๋ฃจ์…˜

์•ก์ •์ด ๋‹ฌ๋ฆฐ ๋ณ„๋„์˜ ํ•˜๋“œ์›จ์–ด ๋ฐฉ์‹์˜ OTP ์†”๋ฃจ์…˜์ด ์กด์žฌํ–ˆ์ง€๋งŒ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์ด ๋ณต์žกํ•˜๊ณ  ๋„์ž… ๊ฐ€๊ฒฉ์ด ๋น„์‹ธ๋ฉฐ ๋ถ„์‹คํ• ์ˆ˜ ์žˆ๊ณ (๋ณ„๋„๋กœ ํœด๋Œ€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถ„์‹ค์ด ์žฆ์€ ํŽธ์ž…๋‹ˆ๋‹ค.) ๋ฐฐํ„ฐ๋ฆฌ ์‚ฌ์šฉ ๊ธฐ๊ฐ„์ด ์ œํ•œ๋˜์–ด ์žˆ๊ณ  ์„œ๋ฒ„์™€ ๊ณต์œ ํ•˜๋Š” ๋น„๋ฐ€ ํ‚ค๊ฐ€ ์œ ์ถœ๋˜๋ฉด ๊ธฐ์กด OTP ํ•˜๋“œ์›จ์–ด๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ ๋งˆ๋ จํ•ด์•ผ ํ•˜๋Š” ๋“ฑ  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋„์ž…์ด ์‰ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

RSA ์‚ฌ์˜ ํ•˜๋“œ์›จ์–ด OTP

์Šค๋งˆํŠธํฐ ์‹œ๋Œ€๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ ์Šค๋งˆํŠธํฐ ์•ฑ ํ˜•์‹์˜ OTP ๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ๋ฐฐํ„ฐ๋ฆฌ์™€  OTP ํ•˜๋“œ์›จ์–ด ๋ถ„์‹ค ๋ฌธ์ œ๋Š” ์–ด๋Š ์ •๋„ ํ•ด๊ฒฐ์ด ๋˜์—ˆ์ง€๋งŒ ์†”๋ฃจ์…˜ ๋น„์šฉ์€ ์—ฌ์ „ํžˆ OTP ๋„์ž…์˜ ์žฅ๋ฒฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค.


google authenticator ๋Š”  TOTP ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋กœ ์œ ๋‹‰์Šค์˜ ์ธ์ฆ ๋ชจ๋“ˆ์ธ PAM(Pluggable authentication module) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์œ ํ‹ธ๋ฆฌํ‹ฐ, ๋ชจ๋ฐ”์ผ app ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์œผ๋ฏ€๋กœ ์ธ์ฆ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค(์˜ˆ: ssh ์„œ๋น„์Šค)์— ์ ์šฉํ•˜์—ฌ two factor ์ธ์ฆ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‹จ ์ƒ์šฉ ์ œํ’ˆ์ด ์•„๋‹ˆ๋‹ค๋ณด๋‹ˆ ๊ด€๋ฆฌ๊ฐ€ ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กญ๊ณ  ์šด์˜์ด ๋ถˆํŽธํ•œ ์ ์ด ์žˆ์œผ๋ฏ€๋กœ ๋Œ€๋Ÿ‰์˜ ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด Duo Security(https://duo.com/) ๋‚˜ Authy (https://authy.com/)๊ฐ™์€ OTP ์ „๋ฌธ ์„œ๋น„์Šค๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ๊ด€๋ฆฌํ•˜๋Š” ์žฅ๋น„๊ฐ€ ๋งŽ์ง€ ์•Š๊ณ  ์ดˆ๊ธฐ ๋„์ž… ๋น„์šฉ์ด ์—†์„ ๊ฒฝ์šฐ google authenticator ๊ฐ€ ์ ์ ˆํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.


์„ค์น˜

  1. ์‚ฌ์ „์— EPEL ์ €์žฅ์†Œ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ fail2ban์œผ๋กœ SSH ๊ฐ•ํ™”ํ•˜๊ธฐ ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

  2. ์„œ๋ฒ„์šฉ ๊ตฌ๊ธ€ otp ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    $ sudo yum install google-authenticator -y

google-authenticator ์„ค์ •

  1. ๋จผ์ € ์‚ฌ์šฉํ•˜๋Š” ์Šค๋งˆํŠธ ํฐ์˜ ์•ฑ ์Šคํ† ์–ด์—์„œ "google authenticator" ๋˜๋Š” "google OTP" ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ด์„œ ๋‚˜์˜จ OTP ์•ฑ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    otp ์•ฑ ์„ค์น˜
  2. ๊ตฌ๊ธ€ OTP ๋ฅผ ์ ์šฉํ•˜๋ ค๋Š” ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ ํ•œ ํ›„์— two factor ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ณ„์ •(์˜ˆ: lesstif)์œผ๋กœ google-authenticator ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๊ฐ ์˜ต์…˜์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    $ google-authenticator -t -d  --label webserver --issuer example.com -r 3 -R 30 -s ~/.ssh/google_authenticator
    • -t, --time-based: ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ OTP ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    • -d, --disallow-reuse: ์ด์ „์— ์‚ฌ์šฉํ•œ TOTP ํ† ํฐ์˜ ์žฌ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.

    • -l, --label=<label>: ์‚ฌ์šฉํ•  label ์„ ์ง€์ •ํ•˜๋ฉฐ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ์„œ๋ฒ„์˜ ์ด๋ฆ„์ด๋‚˜ ๋„๋ฉ”์ธ ์ด๋ฆ„๋“ฑ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” webserver ๋กœ label ์„ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • -i, --issuer=<issuer>: ์‚ฌ์šฉํ•  ๋ฐœ๊ธ‰์ž๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ์—ฌ๊ธฐ์—์„œ๋Š” ์‚ฌ์ดํŠธ์˜ ๋ฉ”์ธ ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • -r, --rate-limit=N:  -R๋กœ ์„ค์ •ํ•œ M์ดˆ๋™์•ˆ ํ—ˆ์šฉํ•  ๋กœ๊ทธ์ธ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
    • -R, --rate-time=M: M ์ดˆ๋™์•ˆ ํ—ˆ์šฉํ•  ๋กœ๊ทธ์ธ ํšŸ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋ฉฐ -r 3 -R 30 ์€ 30์ดˆ ์ด๋‚ด์— ์ตœ๋Œ€ 3๋ฒˆ์˜ ๋กœ๊ทธ์ธ ์‹œ๋„๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • -S, --step-size=S: OTP ํ† ํฐ์„ ๊ฐฑ์‹ ํ•  ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜๋ฉฐ ๊ธฐ๋ณธ ๊ฐ’์€ 30์ด๋ฉฐ ์ด๊ฒฝ์šฐ 30์ดˆ๋งˆ๋‹ค ํ† ํฐ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • -w, --window-size=W: OTP ํ† ํฐ์€ -S ๋กœ ์ง€์ •ํ•œ ํ† ํฐ ๊ฐฑ์‹  ์‹œ๊ฐ„(์˜ˆ: 30์ดˆ) ๋™์•ˆ๋งŒ ์œ ํšจํ•˜์ง€๋งŒ ์ž…๋ ฅ์‹œ ์ดˆ ๋‹จ์œ„๋กœ ์ด๋ฅผ ๋งž์ถ”๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰ 31์ดˆ์— ์ž…๋ ฅํ•  ๊ฒฝ์šฐ OTP ํ† ํฐ์ด ๊ฐฑ์‹ ๋˜๋ฏ€๋กœ ๋ฌดํšจํ™”๋˜์–ด ๋ฒ„๋ฆฌ๋ฉฐ ์ด๋Ÿฐ ๋ถˆํŽธํ•จ์„ ์ค„์ด์ด๊ณ  -w ๋กœ ์ง€์ •ํ•œ ์‹œ๊ฐ„๋งŒํผ ์•ž์œ„๋กœ ์œ ํšจํ•˜๊ฒŒ ๋˜๋ฉฐ 5๋กœ ์ง€์ •ํ•  ๊ฒฝ์šฐ ํ† ํฐ ๊ฐฑ์‹  ์‹œ๊ฐ„์ด 30์ดˆ๋ผ๋ฉด 35์ดˆ๊นŒ์ง€ ํ•ด๋‹น OTP ํ† ํฐ์ด ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.
    • -s, --secret=<file>: google otp ์˜ secret ์„ ์ €์žฅํ•  ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ ๊ธฐ๋ณธ ์„ค์ •์€ $HOME/.google_authenticator ์ด์ง€๋งŒ SELinux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ssh ๋ฐ๋ชฌ์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•ด์„œ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ SELinux ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ .ssh ํด๋”์— ๋„ฃ์–ด์•ผ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋ฉฐ SELinux ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ ์žฅ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  3. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด URL ๋ฌธ์ž์—ด์ด ํ‘œ์‹œ๋˜๋ฉฐ ํ…์ŠคํŠธ๋กœ QR ์ฝ”๋“œ์™€ secret key๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ OTP ์— ์‚ฌ์ดํŠธ๋ฅผ ๋“ฑ๋กํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ secret key ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ QR Code ๋ฅผ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•˜๋ฉด QR ์ด๋ฏธ์ง€๊ฐ€ ๋œจ๋ฉฐ ์ด๊ฒƒ์€  google OTP ์•ฑ์—์„œ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ QR ์ด๋ฏธ์ง€์ด๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์ง€ ์•Š๊ณ  ์—ด์–ด๋‘ก๋‹ˆ๋‹ค.

    https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/webserver%3Fsecret%3DIVS7VVNOVJ7ZKWQSXOMGNRYW6I%26issuer%3Dexample.com
    
    
    
    
    Your new secret key is: IVS7VVNOVJ7ZKWQSXOMGNRYW6I
  4. ์•„๋ž˜์™€ ๊ฐ™์ด scratch code ๊ฐ€ ํ‘œ์‹œ๋˜๋Š”๋ฐ ๋งŒ์•ฝ ํฐ์„ ๋ถ„์‹คํ–ˆ์„ ๊ฒฝ์šฐ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด OTP ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ์žฌ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋น„์ƒ์‹œ์— ๋Œ€๋น„ํ•œ ๋ณต๊ตฌ ์ฝ”๋“œ๋กœ .ssh/google_authenticator ์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ์œ ์ถœ๋  ๊ฒฝ์šฐ OTP ๋กœ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•ด ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํŒ๋‹จํ•ด์„œ ์‚ญ์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    Your verification code is 323214
    Your emergency scratch codes are:
      73074445
      94801293
      33157957
      70212597
      49916872
  5. ์ด์ œ OTP ์•ฑ์„ ๋„์›Œ์„œ ์šฐ์ธก ์ƒ๋‹จ์˜ ๊ณ„์ • ์„ค์ •์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค


    ๊ณ„์ • ์„ค์ •

    .

  6. ๋ฐ”์ฝ”๋“œ ์Šค์บ”์„ ์„ ํƒํ•˜๊ณ  3๋ฒˆ์—์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์€ QR ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ํ™”๋ฉด์„ ์—ด๊ณ  ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.


    QR Code ์Šค์บ”
  7. ์Šค์บ”์ด ์ •์ƒ์ ์œผ๋กœ ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์•ฑ์˜ ์ดˆ๊ธฐ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋ฉฐ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ถ”๊ฐ€ํ•œ ์‚ฌ์ดํŠธ ๋ชฉ๋ก๊ณผ ํ•จ๊ป˜ OTP ํ† ํฐ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    OTP ์‚ฌ์ดํŠธ ๋ชฉ๋ก


PAM  ์„ค์ •

์ด์ œ ssh ๋ฐ๋ชฌ์ด google authenticator ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก PAM ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. PAM ์˜ sshd ์„ค์ • ํŒŒ์ผ์„ ํŽธ์ง‘๊ธฐ๋กœ ์—ฝ๋‹ˆ๋‹ค.

    vi /etc/pam.d/sshd
  2. "#%PAM-1.0" ์•„๋ž˜์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.. google_authenticator ๋Š” ์„ค์ • ํŒŒ์ผ์˜ ์ด๋ฆ„์ž„.

    #%PAM-1.0
    auth       required     pam_google_authenticator.so secret=${HOME}/.ssh/google_authenticator ##TODO ์ง„ํ•˜๊ฒŒ ํ‘œ์‹œ
    auth       required     pam_sepermit.so

    google authenticator ์„ค์ • ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” ${HOME}/google_authenticator ์ด์ง€๋งŒ ์ด ๊ฒฝ๋กœ์— ์ €์žฅํ•  ๊ฒฝ์šฐ SELinux ๊ฐ€ sshd ์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๋ฏ€๋กœ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    SELinux ์˜ ์ฐจ๋‹จ ์ด์œ ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ์žฅ์ธ "SELinux ์‚ฌ์šฉํ•˜๊ธฐ" ์—์„œ ์ž์„ธํ•˜๊ฒŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค.


  3. ๋งŒ์•ฝ OTP ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ์ •ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด nullok ๋ฅผ ์„ค์ •์— ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    #%PAM-1.0
    auth       required     pam_google_authenticator.so nullok secret=${HOME}/.ssh/google_authenticator ##TODO ์ง„ํ•˜๊ฒŒ ํ‘œ์‹œ
    auth       required     pam_sepermit.so


    nullok ์„ค์ •์ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž์˜ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— .ssh/google_authenticator ๊ฐ€ ์žˆ์œผ๋ฉด OTP ๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ์—†์œผ๋ฉด ๋‹ค๋ฅธ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ๋กœ๊ทธ์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.



sshd ์„ค์ •

์ด์ œ ssh ์ด์ œ ssh ๋ฐ๋ชฌ์ด google authenticator ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก PAM ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

/etc/ssh/sshd_config.๋‚ด์— ์„ค์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •

  1. ํŽธ์ง‘๊ธฐ๋กœ sshd ์„ค์ • ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.

    vi /etc/ssh/sshd_config
  2. ๋‹ค์Œ ์„ค์ •์„ ์ฐพ์•„์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    PasswordAuthentication yes
    ChallengeResponseAuthentication yes
    UsePAM yes
  3. ssh ๋ฐ๋ชฌ์„ ์žฌ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค.

    systemctl restart sshd


์ด์ œ ๋ชจ๋“  ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ๊ณ  ์‚ฌ์šฉํ•˜๋Š” SSH ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์„ค์ •์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฉฐ ์ธ์ฆ ์ˆ˜๋‹จ์œผ๋กœ keyboard-interactive ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


SSH Client ์„ค์ •

SecureCRT ์„ค์ •

  1. ์„ธ์…˜ ์˜ต์…˜์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  2. SSH2 -> Authentication ์— "Keyboard interactive" ๊ฐ€ ์ฒดํฌ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๊ฐ€์žฅ ์œ„์— ์˜ฌ๋ผ ์˜ค๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    SecureCRT ์„ธ์…˜ ์„ค์ •
  3. ์ด์ œ ์Šค๋งˆํŠธํฐ์˜ ๊ตฌ๊ธ€ OTP ๋ฅผ ๊ตฌ๋™ํ•˜๊ณ  ๋ฒ„์— ssh ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ OTP ์ž…๋ ฅ ์ฐฝ์— ๋œน๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ๊ตฌ๊ธ€ OTP ์—์„œ ์ƒ์„ฑํ•œ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    OTP ์ž…๋ ฅ์ฐฝ
  4. ์•”ํ˜ธ ์ž…๋ ฅ์ฐฝ์—๋Š” ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    ์•”ํ˜ธ ์ž…๋ ฅ ํ™”๋ฉด


putty ์„ค์ •

  1. putty ๋ฅผ ๊ตฌ๋™ํ•œ ํ›„์— OTP ๋ฅผ ์‚ฌ์šฉํ•  ์„ธ์…˜ ์„ค์ •์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  2. ConnectionSSHAuth ์„ค์ •์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  3. Authentication methos → Attempt "keyboard-interactive auth ๊ฐ€ ์ฒดํฌ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  4. Verification code: ์— ์ผํšŒ์šฉ ๋น„๋ฐ€ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Password: ์— ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    putty ๋กœ ์—ฐ๊ฒฐ




ssh ํด๋ผ์ด์–ธํŠธ ์„ค์ •

ssh ์ปค๋งจ๋“œ๋‚˜ Mac ์˜ iTerm ๋“ฑ์˜ ssh ํด๋ผ์ด์–ธํŠธ๋Š” ssh ์˜ ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ์ธ ~/.ssh/config ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด OTP ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋˜๋ฉฐ ์•„๋ž˜๋Š” example.com ์— ์—ฐ๊ฒฐํ•  ๊ฒฝ์šฐ ์„ค์ • ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

Host example.com
    HostName example.com
    PasswordAuthentication yes
    ChallengeResponseAuthentication yes
    PreferredAuthentications keyboard-interactive
ssh ํด๋ผ์ด์–ธํŠธ ์„ค์ •

์œ„์˜ ์˜ˆ์™€ ๊ฐ™์ด PasswordAuthentication, ChallengeResponseAuthentication ๋ฅผ yes ๋กœ ํ•˜๊ณ  PreferredAuthentications ์— keyboard-interactive ๋ฅผ ์„ค์ •ํ•œ ํ›„์— ssh example.com ์ฒ˜๋Ÿผ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•œ ํ›„์— ์•„๋ž˜์˜ ํ”„๋กฌํ”„ํŠธ์— OTP ์™€ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

$ ssh example.com

Verification code: 
Password: 
OTP ์™€ ์•”ํ˜ธ ์ž…๋ ฅ ํ”„๋กฌํ”„ํŠธ


๋งŒ์•ฝ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์„œ๋ฒ„์˜ OTP ์„ค์ •ํŒŒ์ผ์ธ .ssh/google_authenticator  ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋ฉด ๊ตฌ๊ธ€ OTP ์•ฑ์˜ ์ฃผ์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


TOTP ๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ณต์œ ํ•˜๋Š” secret key ๋ฅผ ํ˜„์žฌ ์‹œ๊ฐ„ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ 1ํšŒ์šฉ ์•”ํ˜ธ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ํ‹€๋ฆฌ๋‹ค๋ฉด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€๊ฐœ์˜ ์Šค๋งˆํŠธํฐ์€ ์ž๋™์œผ๋กœ ์‹œ๊ฐ„์ด ๋™๊ธฐํ™”๋˜์ง€๋งŒ ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„๋Š” ์•„๋‹ˆ๋ฏ€๋กœ ๋กœ๊ทธ์ธ์ด ์•ˆ ๋  ๊ฒฝ์šฐ ๋ฆฌ๋ˆ…์Šค์˜ ํ˜„์žฌ ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๊ณ  ๋‹ค๋ฅด๋‹ค๋ฉด ๋™๊ธฐํ™”๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ €์ž๋Š” ntpdate ntp.postech.ac.kr ๋ช…๋ น์œผ๋กœ ํฌํ•ญ๊ณต๋Œ€์˜ ์„œ๋ฒ„์™€ ์‹œ๊ฐ„์„ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.



Ref