Junos PyEZユーザーの認証
Junos PyEZ アプリケーションは、パスワードまたはその他の標準的な SSH 認証 メカニズムを使用してユーザーを認証できます。
Junos PyEZユーザー認証の概要
Junos PyEZでは、シリアルコンソール接続、Telnet、またはSSH経由のNETCONFセッションを使用して、Junosデバイスに直接接続し、管理することができます。Junos PyEZは、デバイスの CONSOLE ポートに接続されたコンソールサーバーへのTelnetまたはSSH接続を介したデバイスへの接続もサポートしています。さらに、Junos PyEZは、要塞ホストやジャンプホストなどの中間デバイスを介してデバイスに接続できます。
リモートデバイスは、接続方法に応じて、パスワードまたはその他の標準的なSSH認証メカニズムを使用してユーザーを認証できる必要があります。SSH 接続を介して Junos デバイスを管理する場合、デバイスにアクセスする最も便利で安全な方法は、SSH キーを設定することです。SSHキーにより、リモートデバイスは信頼できるユーザーを識別できます。
管理対象のJunosデバイスにアクセスできる任意のユーザーアカウントを使用して、デバイスの操作を実行できます。 jnpr.junos.device.Device クラスの新しいインスタンスを作成するときに、ユーザーを明示的に定義できます。ユーザーを指定しない場合、ユーザーはデフォルトで $USER 環境変数の値になります。
SSH接続の場合、Junos PyEZは、~/.ssh/configにあるデフォルトのSSH設定ファイル(存在する場合)に自動的にクエリーを実行します。また、Device引数リストにssh_configを含めて、別の設定ファイルを指定することもできます。Junos PyEZは、ユーザーやIDファイルなど、Device引数リストの引数によって上書きされないSSH設定ファイルの関連設定を使用します。
SSH を使用してデバイスに接続する場合、Junos PyEZ はまず SSH 公開鍵ベースの認証を試み、次にパスワードベースの認証を試みます。パスワードベースの認証を使用する場合、提供されたパスワードがデバイスパスワードとして使用されます。SSHキーが使用されている場合、提供されたパスワードがプライベートキーのロックを解除するためのパスフレーズになります。SSHキーエージェントにキーをロードする場合、またはSSHプライベートキーのパスフレーズが空の場合は、パスワードを指定する必要はありません。ただし、空のパスフレーズでSSHプライベートキーを使用することはお勧めしません。
環境に適した安全な方法で資格情報を取得します。ベストプラクティスとして、認証情報を暗号化されていない形式で保存するのではなく、スクリプトを実行するたびに認証情報の入力を求めます。
以下のセクションでは、さまざまな認証方法について説明します。
パスワードを使用して Junos PyEZ ユーザーを認証する
パスワードを使用してJunos PyEZユーザーを認証するには:
SSHキーを使用してJunos PyEZユーザーを認証する
Junos PyEZ アプリケーションで SSH キーを使用するには、まず構成管理サーバーでキーを生成する必要があります。次に、Junos PyEZクライアントが接続する各デバイスで公開キーを設定します。デバイスには、Junosデバイス、コンソールサーバー、要塞ホスト、ジャンプホストなどが含まれる場合があります。キーを使用するには、 Device 引数リストに適切な引数を含める必要があります。
Junos PyEZは、SSHキーエージェントにアクティブにロードされるSSHキー、デフォルトの場所またはユーザー定義の場所のいずれかで生成されたキー、パスワード保護を使用または放棄するキーを利用できます。 Device 引数がパスワードを指定していないか、SSH キーファイルを参照していない場合、Junos PyEZ はまず SSH キーエージェントでアクティブにロードされている SSH キーをチェックし、次にデフォルトの場所にある SSH キーをチェックします。コンソールサーバーに接続する場合、SSHキーはパスワードで保護する必要があります。
以下のセクションでは、SSHキーの生成、リモートデバイス上のキーの設定、およびキーを使用した管理対象デバイスへの接続の手順について説明します。
SSHキーの生成と設定
構成管理サーバーでSSHキーを生成し、リモートデバイスで公開キーを構成するには:
Junos PyEZアプリケーションでのSSHキーの参照
SSHキーペアを生成し、リモートデバイスで公開キーを設定すると、Junos PyEZアプリケーションはそのキーを使用してデバイスに接続できます。キーを使用するには、 Device コンストラクターに適切な引数を含めます。 Device 引数は、以下によって決定されます。
-
キーの場所
-
キーがssh-agentなどのSSHキーエージェントにアクティブにロードされているかどうか
-
キーがパスワードで保護されているかどうか
-
ユーザーのSSH設定ファイルでそのホストの設定がすでに定義されているかどうか
以下のセクションでは、さまざまなシナリオの概要を説明します。
アクティブにロードされたキーでSSHキーエージェントを使用する
SSHキーエージェントまたは認証エージェントを使用してプライベートキーを安全に保存し、パスワードで保護されたキーのパスフレーズを繰り返し再入力する必要がなくなります。Junos PyEZクライアントは、SSHエージェントにアクティブにロードされているSSHキーを使用してデバイスに接続できます。デフォルトでは、 Device 引数がパスワードを指定していない場合、またはSSHキーファイルを参照していない場合、Junos PyEZはまずSSHキーエージェントでアクティブにロードされているSSHキーをチェックし、次にデフォルトの場所にあるSSHキーをチェックします。SSHキーファイルは、引数リストで明示的に設定するか、SSH設定ファイルの設定を通じて設定 Device できます。
ネイティブSSHキーエージェントにアクティブにロードされているSSHキーを使用してデバイスに接続するには:
-
Junosデバイスに直接接続するには、
Device引数リストに必要なホスト名またはIPアドレスのみを指定する必要があります。dev = Device(host='router.example.com')
-
要塞またはジャンプホストを介してJunosデバイスに接続するには、
hostをJunosデバイスのホスト名またはIPアドレスに設定し、ジャンプホストを介した接続を定義するproxy_command引数を含めます。dev = Device(host='router.example.com', proxy_command="ssh -W %h:%p -q jumphost.example.com")
Device コンストラクターは allow_agent 引数もサポートしており、SSH キー エージェントを使用するタイミングをより細かく制御できます。表1に設定の概要を示します。
| allow_agent値 | 行動 |
|---|---|
|
|
SSH接続は、 |
|
|
SSH接続は、SSHエージェントにロードされたキーを使用します。 |
|
|
SSH接続は、SSHエージェントからのキーを使用しません。 |
例えば、SSHキーエージェントでホストのSSHキーを読み込むとします。さらに、SSH設定ファイルには、そのホストのプライベートキーファイルで IdentityFile オプションを定義するホストエントリが含まれています。Junos PyEZアプリケーションでは、 Device のインスタンスを作成し、 host 引数のみを定義します。デフォルトでは、 Device は IdentityFileで定義されたプライベートキーファイルを使用します。 Device 引数はプライベートキーファイルを参照しているため、Junos PyEZはSSHキーエージェントをチェックしません。プライベートキーファイルにパスフレーズがある場合、パスワードが指定されていないため接続に失敗します。したがって、SSHエージェントを使用し、SSH設定ファイルに IdentityFile オプションを保持するには、 allow_agent=Trueを設定します。
dev = Device(host='router.example.com', allow_agent=True)
パスワード保護なしでSSHキーを使用する
Junos PyEZでは、パスワード保護されていないSSHプライベートキーを使用して、クライアントがJunosデバイスに直接接続できます。ただし、空のパスフレーズでSSHプライベートキーを使用することはお勧めしません。Junos PyEZは、空のパスフレーズでSSHプライベートキーを使用したコンソールサーバーへの接続をサポートしていません。
デフォルトの場所にあり、パスワード保護されていないSSHキーを使用してJunosデバイスに接続するには、次の手順に従います。
-
Device引数リストでは、必要なホスト名またはIPアドレスのみを指定する必要があります。dev = Device(host='router.example.com')
Junos PyEZは、まずアクティブなSSHキーエージェントにロードされているSSHキーを確認し、次にデフォルトの場所にあるSSHキーをチェックします。
デフォルトの場所になく、パスワード保護されていないSSHキーを使用してJunosデバイスに接続するには、次の手順に従います。
-
Device引数リストで、ssh_private_key_file引数をSSHプライベートキーのパスに設定します。dev = Device(host='router.example.com', ssh_private_key_file='/home/user/.ssh/id_rsa_dc')
注:ユーザーのSSH設定ファイルで、特定のホストのローカルSSHプライベートキーファイルパスがすでに指定されている場合は、
Device引数リストでssh_private_key_file引数を省略できます。ssh_private_key_file引数を含めると、ユーザーのSSH設定ファイルでホストに定義されている既存のIdentityFile値が上書きされます。
パスワードで保護されたSSHキーを使用する
Junos PyEZ クライアントは、パスワードで保護された SSH キーを使用して、Junos デバイスに直接接続するか、要塞ホストまたはジャンプ ホストを介して Junos デバイスに接続するか、デバイスに接続されたコンソール サーバーに接続できます。以下のセクションでは、パスワードで保護されたSSHキーの Device 引数を明示的に定義する方法について説明します。代わりに、アクティブなSSHキーエージェントにロードされたパスワードで保護されたキーを使用するには、「 アクティブにロードされたキーでSSHキーエージェントを使用する」を参照してください。
Junosデバイスに直接接続する
パスワードで保護されたSSHキーを使用してJunosデバイスに直接接続するには、次の手順に従います。
-
SSHプライベートキーパスワードの入力を求め、その値を変数に格納するコードを含めます。
from jnpr.junos import Device from getpass import getpass key_password = getpass('Password for SSH private key file: ')
-
Device引数リスト内:-
SSHキーファイルのパスフレーズを含む変数を参照するように
passwd引数を設定します。 -
キーがデフォルトの場所になく、SSH設定ファイルでプライベートキーファイルのパスが定義されていない場合は、
ssh_private_key_file引数をプライベートキーのパスに設定します。
from jnpr.junos import Device from getpass import getpass key_password = getpass('Password for SSH private key file: ') dev = Device(host='router.example.com', passwd=key_password, ssh_private_key_file='/home/user/.ssh/id_rsa_dc') dev.open() # ... dev.close()
-
ジャンプホストを介して接続する
両方のデバイスに対してパスワードで保護されたSSHキーを使用して、要塞またはジャンプホストを介してJunosデバイスに接続するには:
-
ネットワークデバイスのSSHプライベートキーパスワードの入力を求め、その値を変数に格納するコードを含めます。
from jnpr.junos import Device from getpass import getpass host = "router1.example.com" junos_passwd = getpass("SSH key passphrase for network device: ")
-
Device引数リスト内:-
host引数をJunosデバイスのホスト名またはIPアドレスに設定します。 -
passwd引数を設定して、JunosデバイスのSSHキーファイルパスフレーズを含む変数を参照します。 -
キーがデフォルトの場所になく、SSH設定ファイルでプライベートキーファイルのパスが定義されていない場合は、
ssh_private_key_file引数をJunosデバイスのプライベートキーのパスに設定します。 -
proxy_command引数を含め、必要に応じて、ユーザーとIDファイルを含むジャンプホストの接続を定義します。
from jnpr.junos import Device from getpass import getpass host = "router1.example.com" junos_passwd = getpass("SSH key passphrase for network device: ") dev = Device( host=host, passwd=junos_passwd, ssh_private_key_file="/home/user/.ssh/id_rsa_junos", proxy_command="ssh -i /home/user/.ssh/id_rsa_jump -W %h:%p -q user@jumphost.example.com" ) dev.open() print(dev.facts) dev.close()
-
スクリプトを実行すると、スクリプトはプライベートキーのパスフレーズの入力を求めます。
コンソールサーバーを介して接続する
パスワードで保護されたSSHキーファイルを使用するコンソールサーバーを介してJunosデバイスに接続するには、次の手順に従います。
-
Junosデバイスのログイン資格情報の入力を求め、各値を変数に格納するコードを含めます。
from jnpr.junos import Device from getpass import getpass junos_username = input('Junos OS username: ') junos_password = getpass('Junos OS password: ')
-
コンソールサーバーのユーザー名と秘密キーパスワードの入力を求め、各値を変数に格納するコードを含めます。
from jnpr.junos import Device from getpass import getpass junos_username = input('Junos OS username: ') junos_password = getpass('Junos OS password: ') cs_username = input('Console server username: ') cs_password = getpass('Console server key passphrase: ')
-
Device引数リスト内:-
host引数をコンソールサーバーのホスト名またはIPアドレスに設定します。 -
user引数とpasswd引数を、Junos OSログイン資格情報を含む変数に設定します。 -
cs_user引数を、コンソールサーバーのユーザー名を含む変数に設定します。 -
cs_passwd引数を、SSHキーファイルのパスフレーズを含む変数に設定します。 -
キーがデフォルトの場所になく、SSH設定ファイルでプライベートキーファイルのパスがまだ定義されていない場合は、
ssh_private_key_file引数をプライベートキーのパスに設定します。 port引数を、コンソールサーバー上のTTYデバイスにマッピングするTCPポートに設定します。
from jnpr.junos import Device from getpass import getpass junos_username = input('Junos OS username: ') junos_password = getpass('Junos OS password: ') cs_username = input('Console server username: ') cs_password = getpass('Console server key passphrase: ') with Device(host='cs.example.com', user=junos_username, passwd=junos_password, cs_user=cs_username, cs_passwd=cs_password, ssh_private_key_file='/home/user/.ssh/id_rsa_dc', port=3007) as dev: print (dev.facts) # ...
-