Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DIY Session Manager

regmarmcem
February 25, 2022

DIY Session Manager

regmarmcem

February 25, 2022
Tweet

More Decks by regmarmcem

Other Decks in Technology

Transcript

  1. DIY Session Manager 氏名 竹中 太基 経歴 学生時代 Web/スマホアプリ開発 2019年4月~

    ヤフー入社、サーバーサイドエンジニア 2021年7月~ BTC入社、AWSエンジニア AWS初心者ですがよろしくお願いします! GitHub: regmarmcem
  2. モチベーション ・EC2インスタンスにSSOで接続したい ・Session Managerを用いない 参考: DIY Single Sign-On for SSH

    https://smallstep.com/blog/diy-single-sign-on-for-ssh/ EC2 step cli step ca IdP on Fargate ①IdPにサインイン ②SSH証明書 ③証明書認証 実装を通して、インスタンスにログインするとはそもそもどういうことなのか知る Session ManagerではAWSの資格情報でSSHのような操作が可能 →Session ManagerのGUIはヒントになりそう
  3. ユーザーの端末 EC2インスタンス AWSの内部システム HTTPS HTTPS※ Session Managerの接続の流れ HTTPS経由でAWSの踏み台に接続し、AWSの内部ネットワーク経由でEC2に接続 # 443のOUTPUTを遮断すると接続できなくなる

    $ sudo iptables –A OUTPUT -p tcp --dport 443 -j DROP $ aws ssm start-session --target <instance-id> --document-name AWS-StartSSHSession –debug # 22のOUTPUTを遮断しても接続できる $ sudo iptables –A OUTPUT -p tcp –dport 22 -j DROP $ aws ssm start-session --target <instance-id> --document-name AWS-StartSSHSession –debug GUI/CLIで共通 Internet AWSの内部ネットワーク
  4. 今回扱う範囲 ユーザーの端末 HTTPS Internet AWS CLI # ssm-userでログインされる $ aws

    ssm start-session --target <instance-id> --document-name AWS-StartSSHSession – parameters ‘portNumber=%p’ func (s *Session) Execute(log log.T) (err error) { (中略) if err = s.OpenDataChannel(log); err != nil { log.Errorf("Error in Opening data channel: %v", err) return } } 参考 https://github.com/aws/session-manager-plugin # ec2-userでログインされる $ ssh –i <path-to-key> ec2-user@<instance-id> -o ProxyComand=“sh –c <上記のコマンド>” session-managerプラグインのWebSocketとブラウザを接続する Proxy Commandを用いる場合
  5. xterm.jsを使った実装 $ aws ssm start-session --target <instance-id> --debug b'{"SessionId":“<session-id>", “StreamUrl”:“wss://ssmmessages.ap-northeast-1.amazonaws.com/v1/data-channel/<params>”,

    "TokenValue":“<token-value>"}' 1. セッション情報を取得 参考 https://xtermjs.org/ 2. WebSocketオブジェクトをxterm.jsのTerminalに渡す ・ブラウザでTerminalを実装するOSS ・Azure Cloud Shell, VSCode, RStudioをはじめ多くの採用例