CLI에서 Authy와 함께 MFA Token 생성

11363 단어 AWSoathtool2FAauthyMFA
AWS와 Google 등 이용 가능한 MFA의 가상 장치로서 여러 장치 간의 동기화와 크롬 ExtensionAuthy을 갖추는 것은 편리하지만, 특히 CLI를 사용하면 장치 or 크롬 Extension을 하나씩 켜야 하기 때문에 상당히 번거롭다.
CLI를 사용하여 TokenOATH Toolkit의 oathttool을 생성하면 이 번거로움을 조금 없앨 수도 있고 스크립트를 통해 자동으로 처리할 수도 있다.
단, oathttool 자체는 매번 시크릿키(SecretKey)가 필요하기 때문에 mfacodegen이라는 wrapper script를 준비해 편리하게 사용할 수 있도록 해야 한다.
이용 인상은 다음과 같다.

Authy Desktop에서 Secret Key 가져오기


MFA에서.
  • TOTP (Time-based One Time Password) RFC 6238
  • HOTP (HMAC-based One Time Password) RFC 4226
  • , 하지만 이러한 Token을 생성하려면 SecretKey가 필요합니다.
    시크릿 키는 MFA 설정 당시 QR 코드 내에서 훈련했지만, 이미 아우티가 설정되면 앱에서 시크릿 키를 볼 수 없게 된다.
    그러나 Authy는 정기적으로 Token을 생성하기 위해 내부에 시크릿 키를 유지하고 있다.
    Authy Desktop은 JS에서 Token을 생성하기 때문에 디버그 포트가 활성화된 상태에서 프로그램을 시작하고 Developer Tools를 통해 내부를 들여다보면 순조롭게 얻을 수 있습니다.
    Mac에서 Terminal을 열고 다음 명령을 사용하여 Authy Desktop을 엽니다.
    open -a "Authy Desktop" --args --remote-debugging-port=5858
    
    Windows에서 Authy Desktop의 단축키를 만들고 오른쪽 키-> 속성-> 단축키-> 링크의 마지막 추가--remote-debugging-port=5858를 누르면 저장됩니다.만들어진 단축키에서 앱을 열어보자.
    먼저 Authy Chrome Extension을 열고 로그인한 계정 일람 화면에서 마우스 오른쪽 단추를 눌러 Inspect(검증)를 엽니다.
    Authy Desktop을 시작하면 Chromehttp://localhost:5858에서 열립니다.
    디버그 포트에 정상적으로 연결되면 다음 화면이 표시됩니다.

    Twilio Authy를 클릭하면 다음과 같이 Developer Tool을 사용할 수 있습니다.

    Developer Tools가 열리면 Console 탭을 열고 다음 코드를 입력한 후 실행합니다.
    appManager.getAuthenticatorApps().forEach(app=>console.log(app.name,app.originalName,app.decryptedSeed))
    
    그러면 계정 이름, SecretKey가 Constore로 출력될 것입니다.

    받은 Secret Key는 암호 관리 애플리케이션과 같이 안전하게 보관하십시오.

    oathttool에서 MFA Token 생성 시도


    Mac라면 brew를 사용하면 간단하게 설치할 수 있습니다.
    brew install oath-toolkit
    
    다음 명령을 통해token을 생성할 수 있는지 확인하십시오.
    stty -echo; echo -n 'Enter SecretKey: '; read skey; echo; stty echo; oathtool -b --totp $skey
    
    oathtool -b --totp [SecretKey]만 확인할 수 있지만, 그 상황은 셸의hitory에 시크릿 키를 남기고 나중에.bash_히스토리야.zsh_history에서 제거해야 합니다.

    wrapper script(mfacodegen) 만들기


    이렇게 되면 시크릿 키의 처리가 까다로워 사용하기 힘들다
  • Service ID, SecretKey 키 list
  • 쓰기 준비
  • openssl에서 키 리스트에 대한 encrypt
  • wrapper script 참조 키 리스트, decrypt
  • wrapper script의 매개 변수로 전달된 서비스 ID의 항목을 바탕으로 oathttool에서 token
  • 생성
    를 참고하십시오.

    암호화된 SecretKey 목록 파일 만들기


    적당한 위치에서 한 줄[ServiceID]\t[SecretKey]의 목록을 생성합니다.
    ServiceID를 CLI 옵션으로 설정하여 나무랄 데 없는 문자열로 설정하십시오.

    S/MIME의 개인 키와 인증서를 생성합니다.
    openssl req -x509 -days 3650 -newkey rsa:2048 -keyout /path/to/mfa.key -out /path/to/mfa.crt -subj '/'
    
    생성된 인증서를 사용하고openssl 명령encrypt를 사용합니다.
    openssl smime -encrypt -aes256 -in /path/to/mfalist.txt -out /path/to/mfalist.dat -binary -outform PEM /path/to/mfa.crt
    
    혹시 모르니까 가능한지 먼저 확인해 봐.
    다음 명령이 표준 출력에 decrypt 결과를 표시하면 성공합니다.
    openssl smime -decrypt -in /path/to/mfalist.dat -inkey /path/to/mfa.key -binary -inform PEM
    
    원/path/to/mfalist.txt가 필요하지 않기 때문에 먼저 삭제합니다.

    mfacodegen 설정


    다음 파일을 path를 통과하는 적당한 위치에 설정합니다.
    첫 번째mfalist.txtLIST_PATH를 적절하게 수정하십시오.
    또 잊지 마세요KEY_PATH.
    mfacodegen
    #!/bin/bash
    set -e
    
    LIST_PATH=/path/to/mfalist.dat
    KEY_PATH=~/path/to/mfa.key
    
    usage() {
      echo "Usage: $0 [-clh] [-s service]" 1>&2
      exit 1
    }
    
    while getopts cls:h OPT; do
      case $OPT in
        c)  mode='copy'
            ;;
        l)  cmd='show'
            ;;
        s)  cmd='generate'
            service=$OPTARG
            ;;
        h)  usage
            ;;
        \?) usage
            ;;
      esac
    done
    
    [ -z "$cmd" ] && usage
    
    generateToken() {
      list=$(loadList)
      seckey=$(echo "${list}" | awk "\$1==\"${service}\"{print \$2}")
      [ -z "$seckey" ] && { echo "Service ${service} not found." >&2; exit 1; }
      if [ "$(uname)" = 'Darwin' -a "$mode" = 'copy' ]; then
        echo -n $(oathtool -b --totp $seckey) | pbcopy
      else
        oathtool -b --totp $seckey
      fi
    }
    
    loadList() {
      if [ -p /dev/stdin ]; then
        stdin=$(cat -)
        openssl smime -decrypt -inkey $KEY_PATH -in $LIST_PATH -binary -inform PEM -passin "pass:$stdin"
      else
        openssl smime -decrypt -inkey $KEY_PATH -in $LIST_PATH -binary -inform PEM
      fi
    }
    
    showServiceList() {
      list=$(loadList)
      echo "${list}" | cut -f1 | sort
    }
    
    case "$cmd" in
      'show' )
        showServiceList
        ;;
      'generate' )
        generateToken
        ;;
    esac
    

    동작 확인

    chmod +x 옵션은 서비스 목록을 표시합니다.
    mfacodegen -l
    
    -l 옵션은 지정된 서비스 ID의 token을 생성합니다.
    mfacodegen -s github
    
    Mac의 경우 -s [ServiceID] 에서 토큰을 클립보드에 복사합니다.
    mfacodegen -c -s github
    
    이렇게 되면 CLI는 MFA token을 획득할 수 있다.

    좋은 웹페이지 즐겨찾기