SSH登録認証の詳細


本稿ではまずSSHの機能と特性を紹介し,pythonにより簡易SSHクライアントを実現し,セッション確立の過程を理解する.
認知SSH
機能
  • リモート制御
  • は、通信のためのセキュリティチャネル
  • を提供する.
    ftp、pop、telnetは本質的に安全ではありません.ネットワーク上でパスワードとデータを明文で転送し、仲介者の攻撃を受けやすいからです.SSHは暗号化によってこれらの問題を解決し,その伝送データは圧縮され,伝送速度を速めることができる.SSHにはTelnetの代わりに、FTP、PoP、PPPに安全な「チャネル」を提供する機能がたくさんあります.
    検証#ケンショウ#
  • アカウントとパスワードhi
  • に基づく
  • 公開鍵および秘密鍵(より安全)に基づく
  • ログイン認証プロセスの詳細
    5段階
    1.        
    2.          
    3.     
    4.       
    5.       
    

    バージョン番号交渉フェーズ
  • サービス側はポート22を開き、顧客の接続を待つ.
  • クライアントはサービス側にTCP接続を開始し、双方は握手を完了し、接続
  • を確立する.
  • サービス側は、バージョンフラグ文字列を含む最初のメッセージをクライアントに送信します.フォーマットは「プロトコルバージョン番号セカンダリプロトコルバージョン番号ソフトウェアバージョン番号」です.
  • クライアントはメッセージを受け取った後、プロトコルバージョン番号を解析し、サービス側のプロトコルバージョン番号が自分のより低く、クライアントがサービス側の低バージョンをサポートできる場合は、サービス側のプロトコル番号を使用し、そうでなければ自分のプロトコルバージョン番号を使用します.
  • クライアントは、クライアントが使用を決定するプロトコルバージョン番号を含むサービス側のメッセージに返信する.
  • サービス側はクライアントから送られてきたバージョン番号を比較し、クライアントと対話できるかどうかを決定する.
  • 交渉が成功すると、鍵およびアルゴリズム交渉フェーズに入る.そうでない場合、サービス側はTCP接続を切断します.

  • 鍵とアルゴリズムの交渉フェーズ
    サービス側とクライアントはそれぞれアルゴリズム交渉メッセージを相手に送信し、メッセージには自分がサポートする公開鍵アルゴリズムリスト、暗号化アルゴリズムリスト、メッセージ検証コードアルゴリズムリスト、圧縮アルゴリズムリストなどが含まれている.
    サービス側とクライアントは、相手と自分がサポートしているアルゴリズムに基づいて最終的に使用されるアルゴリズムを導出する.
    サービス側およびクライアントは、DH交換アルゴリズム、ホスト鍵ピアパラメータを用いて、セッション鍵およびセッションIDを生成する.
    s=server
  • サービス側はs公をクライアントに送信する.
  • サービス側はセッションIDを生成し、idとしてクライアントに送信する.
  • クライアントはセッションキーを生成し、keyとして設定し、res=id異またはkeyを計算する.
  • クライアントはresをs公で暗号化し、結果をサービス側に送信する.
  • サービス側はs密で復号しresを得る.
  • サーバはres異またはidを計算し、keyを得る.
  • は、サービス側およびクライアントがセッション鍵およびセッションIDを知っており、以降のデータ転送は、セッション鍵を用いて暗号化および復号化される.

  • 認証フェーズ
    アカウントとパスワードに基づく認証方法
  • クライアントは、鍵とアルゴリズムの交渉段階で生成されたセッション鍵を使用してアカウント、認証方法、パスワードを暗号化し、結果をサーバに送信する.
  • サービス側は、取得したセッション鍵を使用してメッセージを復号し、アカウントとパスワードを取得する.
  • サービス側は、このアカウントとパスワードを判断し、失敗した場合、認証失敗メッセージをクライアントに送信し、再認証可能なメソッドリストを含む.
  • クライアントは、認証方法のリストから、再認証のための方法を選択する.
  • このプロセスは、認証成功または認証回数が上限に達するまで繰り返し行われ、サービス側は今回のTCP接続を閉じる.

  • 公開鍵と秘密鍵に基づく検証方式
  • ssh-keygenプログラムを使用して公開鍵idを生成するdsa.pubと秘密鍵id_dsaは、一般的にクライアント上で生成され、id_dsa.pubは何らかの方法でサービス側に送信される.
  • サービス側は、リモートログインするそのアカウントの公開鍵を置く.sshディレクトリの下.
  • クライアントは、鍵とアルゴリズムのネゴシエーション段階で生成されたセッション鍵を用いてアカウント、認証方法、id_を暗号化するdsa.pubは、結果をサービス側に送信します.
  • サービス側はセッション鍵を用いてメッセージを復号し、アカウント、id_を得るdsa.pub. サービス側はこのアカウントのディレクトリにあります.sshディレクトリの下で対応する公開鍵を探して、もし見つからなかったら、失敗メッセージをクライアントに送信して、もし見つけたら、顧客が送ってきたこの公開鍵と見つけた公開鍵を比較して、内容が同じならば、サービス側はランダムな文字列を生成して、“質問”と略称して、それから見つけた公開鍵でこの質問を暗号化して、それからセッション鍵を使って再び暗号化します.
  • サービス側は、この二重暗号化されたデータをクライアントに送信する.
  • クライアントはセッションキーを使用してメッセージを復号し、id_を使用するdsaは再びデータを復号し,質問を得た.
  • クライアントは、セッションキーを使用して質問を暗号化し、サービス側に送信する.
  • サービス側はセッション鍵を用いてメッセージを復号し、質問を得て、自分が生成した質問であるか否かを判断し、異なる場合は失敗メッセージをクライアントに送信し、同じ場合は認証に合格する.

  • Created with Rapha隻l 2.1.0 Client Client Server以下のプロセスは、*セッション暗号化*に基づいて秘密鍵idを生成します.dsa公開鍵id_dsa.pubはセッション暗号化により公開鍵idを送信するdsa.pubストレージid_dsa.pubは、セッション暗号化送信(アカウント、認証方法、id_dsa.pub)によりメッセージを復号して(アカウント、id_dsa.pub)検証id_を得るdsa.pubがローカルメモリと一致するかどうか質問列を生成しid_を使用するdsa暗号化セッション暗号化送信質問列(2回暗号化)2回復号して得られた文字列セッション鍵を用いて文字列を暗号化し、復号文字列を送信し、一貫性のある検証が完了したことを検証する
    Pythonは簡易SSHクライアントを実現
    
    import paramiko
    
    #  :   linux ssh          
    #          
    def ssh_command(ip, user, passwd, command):
        #       
        client = paramiko.SSHClient()
        #        SSH  
        client.set_missing_host_key_policy('/home/xy/.ssh/known_hosts')
        #           
        client.connect(ip, username=user, password=passwd)
        ssh_session = client.get_transport().open_session()
        if ssh_session.active:
            #    
            ssh_session.exec_command(command)
            print(ssh_session.recv(1024))
        return
    
    
    ssh_command('192.168.100.131', 'kali', 'lovepython', 'id')