OpenSSH を使用して、リモート端末を実行するための安全な環境を提供します。 OpenSSH とターミナルの基本的な使用法は非常に簡単ですが、この記事では、リモート ホストへの自動ログインを可能にするその他の要素、リモート アプリケーションを実行する方法、ホスト間でファイルを安全にコピーする方法についても説明します。
このシリーズについて
一般的な UNIX® 管理者は、管理プロセスを支援するために頻繁に使用される一連の主要なユーティリティ、ノウハウ、およびシステムを持っています。さまざまなプロセスを合理化するために、さまざまな主要なユーティリティ、コマンド ライン チェーン、およびスクリプトが存在します。これらのツールの一部はオペレーティング システムから提供されていますが、ノウハウのほとんどは長期的な経験と、システム管理者の仕事のストレスを軽減する必要性から生まれています。この一連の記事では、異種環境での管理タスクを簡素化する方法など、さまざまな UNIX 環境で利用できるツールを最大限に活用することに焦点を当てています。
OpenSSH を使用する理由
FTP、Telnet、RCP、リモート シェル (rsh) など、日常的に使用する標準的なネットワーク サービスは、閉じられた環境でも適切に機能しますが、これらのサービスを使用してネットワーク上で送信される情報は暗号化されません。ネットワーク上またはリモート コンピュータ上でパケット スニファを使用している人は誰でも、交換された情報、場合によってはパスワード情報を閲覧できます。
さらに、このようなサービスでは、ログイン プロセスを自動化するオプションが限られており、多くの場合ステートメントを実行するためにコマンド ラインにプレーン テキストのパスワードを埋め込むことに依存しているため、ログイン プロセスの安全性がさらに低くなります。
Secure Shell (SSH) プロトコルは、これらの制限を回避するために開発されました。 SSH は、ログインおよびパスワード資格情報の交換を含む通信チャネル全体の暗号化を提供し、公開キーと秘密キーと連携してログインの自動認証を提供します。 SSH を基盤となるトランスポート プロトコルとして使用することもできます。この方法で SSH を使用するということは、安全な接続が開かれた後、暗号化されたチャネルを介してあらゆる種類の情報を交換できることを意味し、HTTP や SMTP でもこの方法を使用して通信メカニズムを保護できることになります。
OpenSSH は、SSH 1 および SSH 2 プロトコルの無料実装です。元々は OpenBSD (Berkeley Software Distribution) オペレーティング システムの一部として開発されましたが、現在は UNIX または Linux® および同様のオペレーティング システム用の一般ソリューションとしてリリースされています。
OpenSSHをインストールする
OpenSSH はフリー ソフトウェアであり、メインの OpenSSH Web サイトからダウンロードできます (「参考文献」を参照)。 OpenSSH システムは、Linux、HP-UX、AIX®、Solaris、Mac OS X などを含むさまざまなシステム上のソース コードから構築できます。通常は、選択したプラットフォームとバージョン用のプリコンパイルされたバイナリを見つけることができます。一部のベンダーは、オペレーティング システムの一部として OpenSSH ツールキットを提供しています。
OpenSSH を構築するには、次のものが必要です。
デフォルトの構成設定を使用する必要がある場合は、以下のリスト 1 に示すように、通常のビルド シーケンスを使用してください。
$ ./configure $メイク $メイクインストール |
これにより、バイナリ、ライブラリ、および設定ファイルが /usr/local ディレクトリにインストールされます。たとえば、バイナリは /usr/local/bin に、設定ファイルは /usr/local/etc にインストールされます。さまざまなツールをメイン環境に統合する場合は、--prefix オプションを指定してベース ディレクトリを設定し、--sysconfdir オプションを指定して構成ファイルの場所を設定する必要がある場合があります。
$ ./configure --prefix=/usr --sysconfidir=/etc/ssh |
指定できるその他の一般的なオプションには次のようなものがあります。
設定が完了したら、make を使用して通常の方法でビルドします。
構築とインストールのプロセスが完了したら、最初にシステムを一意に識別する SSH キーを作成し、次にクライアントとホスト間の安全な通信を有効にしてシステムを構成する必要があります。以下を実行できます。
$ ホストキーを作成する |
あるいは、コマンド ラインで個々の手順を手動で実行することもできます。 3 つのキーを作成する必要があります (主要な暗号化アルゴリズム: rsa1、rsa、および dsa ごとに 1 つずつ)。たとえば、リスト 2 は、rsa1 キーの作成方法を示しています。
$ ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key rsa1 公開鍵/秘密鍵ペアを生成しています。 パスフレーズを入力してください (パスフレーズがない場合は空です): 同じパスフレーズを再度入力します。 あなたの ID は /etc/ssh//ssh_host_key に保存されています。 公開鍵は /etc/ssh//ssh_host_key.pub に保存されています。 キーのフィンガープリントは次のとおりです。 43:aa:58:3c:d8:30:de:43:af:66:2a:b2:8d:02:08:86 root@remotehost |
パスワードの入力を求められます。ホスト キーの場合、キー パスワードはおそらく必要ないため、Return キーを押して空のパスワードを使用できます。あるいは、コマンドラインで -N オプションを使用してプロセスを高速化することもできます (リスト 3 を参照)。
$ ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N "" rsa1 公開鍵/秘密鍵ペアを生成しています。 あなたの ID は /etc/ssh/ssh_host_key に保存されています。 公開鍵は /etc/ssh/ssh_host_key.pub に保存されています。 キーのフィンガープリントは次のとおりです。 a3:e3:21:4f:b5:9f:ff:05:46:66:bc:36:a1:47:a0:64 root@remotehost |
次に、このプロセスを繰り返して、rsa キーと dsa キーを作成します (リスト 4 を参照)。
$ ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" $ ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" |
これにより、キーの種類ごとに、公開キー (.pub で終わるファイル内) と秘密キーの 2 つのファイルが作成されます。秘密キーがルートおよび SSH プロセスによってのみ読み取られることを確認する必要があります。これは自動的に設定される必要があります。公開キーをネットワーク ファイル システム (NFS) 共有上の中央の場所にコピーして、既知のホスト キーのリストに追加できるようにすることができます。
最後に、sshd プロセスを開始し、起動時に実行されるように構成する必要があります。 Linux ホストの場合、contrib/redhat/sshd.init に適切な init スクリプトがあり、/etc/init.d に追加できます。
基本的な端末アクセスに SSH を使用する
OpenSSH の主な役割は、UNIX または Linux ホストへの安全なリモート ログインのための Telnet プロトコルに代わる安全な SSH ツールとしての役割です。
標準シェルを使用してリモート ホストに接続するには、ホスト名を入力するだけです。
$ sshリモートホスト |
デフォルトでは、システムは現在のユーザー名をログイン名として使用しようとします。別のログイン名を使用するには、ホスト名の前にログイン名を @ 記号で区切って入力します。例えば:
$ ssh mc@remotehost |
ユーザー パスワードの入力を求められます。これは Telnet と似ています。
初めてホストに接続するとき、リモート ホストの公開鍵のコピーを「既知のホスト」ファイルに保存するかどうかを尋ねられます (リスト 5 を参照)。
$ ssh root@remotehost ホスト「remotehost (10.211.55.3)」の信頼性を確立できません。 RSA キーのフィンガープリントは cc:c8:8b:75:3d:b6:00:2f:a9:9c:53:4c:03:0f:3d:1b です。 接続を続けてもよろしいですか (はい/いいえ) はい 警告: 「remotehost」(RSA) が既知のホストのリストに永続的に追加されました。 |
今後、この警告は表示されなくなりますが、リモート ホストから返された公開キーがホストのファイル内の公開キーと一致しないことをシステムが検出すると、ハッカー攻撃の可能性を示す警告が発行されます。また、管理者がホスト キーのみを再生成したことを意味する場合もあります。
基本的に、SSH セッションと Telnet セッションに違いはありません。ただし、SSH セッションは暗号化されているため、誰かがセッションを覗き見したり、パスワードや実行中のコマンドや操作を知ることはほぼ不可能になります。
SSH を使用すると、シェルを使用せずにリモート ホスト上でコマンドを直接実行することもできます。たとえば、リモート ホストで who コマンドを実行するには、リスト 6 を参照してください。
リスト 6. リモート ホストでの who コマンドの実行$ ssh mc@remotehost 誰 管理コンソール 11月23日 14:04 mc ttyp1 12月2日 10:53 (sulaco.mcslp.pri) mc ttyp2 12 月 10 日 06:50 (sulaco.mcslp.pri) 管理者 ttyp3 12月12日 13:33 mc ttyp4 12月15日 12:38 (nautilus.mcslp.p) |
リモート実行では、クライアント ホストの標準入力、出力、エラーもエミュレートします。これは、出力をリモート コマンドにリダイレクトできることを意味します。たとえば、コマンドからの出力をリモート ホスト上の SSH にパイプすることで、リモート ファイルに情報を直接追加できます (リスト 7 を参照)。
リスト 7. リモート ファイルに情報を直接追加する$ echo "Hello World" |ssh mc@remotehost 'cat >> helloworlds.txt' |
この方法を使用すると、SSH を使用してログイン プロセスを簡素化する際の生産性が向上します。
SFTPを使用したファイル交換
sft コマンドは、SSH プロトコルによって提供される安全な通信チャネルを使用する FTP の代替手段です。
SFTP 接続を開くには、コマンド ラインでホスト名を指定します。
$ sftpリモートホスト |
上記のコマンドは、現在のホストと同じログイン方法を使用することを前提としていることに注意してください。別のログイン方法を使用するには、ホスト名の前にユーザー名を追加します。
$ sftp mc@remotehost |
SFTP は FTP と同様に機能しますが、いくつかの制限と相違点があります。たとえば、FTP の dir は長いファイルリストを提供します (リスト 8 を参照)。
ftp> ディレクトリ 502 'EPSV': コマンドが理解できません。 227 パッシブモードへの移行 (192,168,0,110,150,159) 150 ディレクトリリスト用に ASCII モードのデータ接続を開きます。 合計 1472 drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 デスクトップ drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 文書 drwx------ 18 mc スタッフ 612 11 月 5 日 18:01 図書館 drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 映画 drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 音楽 drwx------ 4 mc スタッフ 136 11 月 4 日 11:17 写真 drwxr-xr-x 4 mc スタッフ 136 11 月 4 日 11:17 公開 drwxr-xr-x 6 mc スタッフ 204 11 月 4 日 11:17 サイト drwxrwxrwx 3 ルート スタッフ 102 12 月 24 日 07:30 tmp drwxr-xr-x 7 ルート スタッフ 238 12 月 11 日 08:39 トライアル 226 転送が完了しました。 |
SFTP では、dir は、ホスト ディレクトリ リスト コマンド (UNIX または Linux では ls) のエイリアスとして機能します。デフォルトでは、 dir は短いリストのみを提供します (リスト 9 を参照)。
SFTP> ディレクトリ デスクトップ ドキュメント ライブラリ 映画 音楽 写真 公開 サイトの tmp トライアル |
長いリストを取得するには、ls と同じオプションを使用します (リスト 10 を参照)。
sftp> ディレクトリ -l drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 デスクトップ drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 文書 drwx------ 18 mc スタッフ 612 11 月 5 日 18:01 図書館 drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 映画 drwx------ 3 MC スタッフ 102 11 月 4 日 11:17 音楽 drwx------ 4 mc スタッフ 136 11 月 4 日 11:17 写真 drwxr-xr-x 4 mc スタッフ 136 11 月 4 日 11:17 公開 drwxr-xr-x 6 mc スタッフ 204 11 月 4 日 11:17 サイト drwxrwxrwx 3 ルート スタッフ 102 12 月 24 日 07:30 tmp drwxr-xr-x 7 ルート スタッフ 238 12 月 11 日 08:39 トライアル |
ディレクトリの変更 (cd、lcd ローカル)、ディレクトリの作成 (mkdir)、ファイルの送信 (put) と受信 (get) などの他のコマンドは変更されません。後の 2 つのコマンド put と get は両方ともワイルドカードを受け入れます (FTP の mput および mget と同様) が、SFTP でワイルドカードを使用せずに複数のファイルを転送する場合は注意してください。たとえば、 sftp> mget file1 file2 file3 は、file1 と file2 を取得してローカル ディレクトリ file3 に配置しようとしていると認識されますが、そのディレクトリが存在しない可能性があります。
scp を使用してホスト間でファイルをコピーする
scp コマンドは、ファイルの転送に SSH プロトコルを使用することを除いて、rc コマンドと同様に機能します。コンテンツ関連のファイルを転送したり、インターネット上でファイルを自動的に交換したりする場合は、scp の方がはるかに優れています。
その形式は rcp に似ており、コピーするファイル パスを指定し、必要に応じてホスト名をそれにマージする必要があります。たとえば、.bashrc ファイルをリモート ホストからローカル マシンにコピーするには、次のコマンドを使用します。
$ scp リモートホスト:/users/mc/.bashrc ~/.bashrc |
前と同様に、使用するユーザー名を指定するには、ホストの前にユーザー名を @ 記号で区切って指定します。
$ scp mc@remotehost:/users/mc/.bashrc ~/.bashrc |
接続先のユーザーが読み取り権限を持っていると仮定すると、ホーム ディレクトリ内の情報にアクセスするには、メタキャラクター ~ も使用する必要があります。
$ scp mc@remotehost:~mc/.bashrc ~/.bashrc |
ログインしているユーザーのホーム ディレクトリからコピーするには、次のコマンドを使用します。
$ scp mc@remotehost:.bashrc ~/.bashrc |
scp コマンドは、標準の展開ルールもサポートしています。したがって、すべての .bash* ファイルをコピーするには、次を使用できます。
$ scp mc@remotehost:.bash* ~ |
展開中括弧 ({}) を使用して、個々のファイルをより具体的に選択することもできます。
$ scp mc@remotehost:".bash{rc,_path,_aliases,_vars}" ~ |
ファイル パス (完全なリモート パス式ではない) 内の展開中括弧は二重引用符で囲まれていることに注意してください。
上記のすべての例で、リモート ホストのパスワードの入力を求められます。これは、ホストに自分の個人キーの公開部分を提供することで回避できます。
公開キーを使用した自動ログインを有効にする
ssh、sftp、または scp を使用してリモート システムにログインする場合でも、ログイン プロセスを完了するにはパスワードが必要です。公開キーまたは秘密キーを作成し、キーの公開部分を ~/.ssh/authorized_keys ファイルに追加し、有効なキーをリモート サイトと交換することにより、パスワードを入力する必要がなく、自動ログインを許可できます。
公開キーまたは秘密キーを作成するには、ssh-keygen を使用してキー暗号化のタイプを指定する必要があります。デモでは rsa キー タイプが使用されていますが、他のキー タイプも有効です。キーを作成するには、リスト 11 を参照してください。
$ ssh-keygen-trsa 公開/秘密 RSA キーのペアを生成しています。 キーを保存するファイルを入力してください (/root/.ssh/id_rsa): |
キー (パブリック コンポーネントとプライベート コンポーネント) を保持するファイルの場所を入力する必要があります。通常は、デフォルト (ホーム ディレクトリの .ssh ディレクトリ内) を使用しても問題ありません (リスト 12 を参照)。
ディレクトリ「/root/.ssh」を作成しました。 パスフレーズを入力してください (パスフレーズがない場合は空です): |
この段階でパスワードを入力すると、セキュリティ キー ファイルが作成されますが、キーを使用するたびにパスワードも入力する必要があります。 Return キーを押すと、パスワードは不要になります (リスト 13 を参照)。
リスト 13. Return キーを押してパスワード要求をスキップする同じパスフレーズを再度入力します。 あなたの ID は /root/.ssh/id_rsa に保存されています。 公開キーは /root/.ssh/id_rsa.pub に保存されています。 キーのフィンガープリントは次のとおりです。 98:da:8d:48:a8:09:44:b1:b3:62:51:2d:a9:6b:61:ba root@remotehost |
これで、公開キー (id_rsa.pub) と対応する秘密キー (id_rsa) が作成されました。
自動ログインを有効にするには、公開キーの内容をリモート ホストの ~/.ssh ディレクトリにあるauthorized_keys ファイルにコピーする必要があります。 SSH を使用してこれを自動化できます (リスト 14 を参照)。
$ cat ./.ssh/id_rsa.pub | ssh mc@remotehost 'cat >> .ssh/authorized_keys'; |
また、これを複数のホスト間で頻繁に行う場合は、リスト 15 に示すように、小さなスクリプトまたはシェル関数を使用して、必要なすべての手順を実行できます。
OLDDIR='pwd'; if [ -z "$1" ]; echo user@host 情報が必要です。 出口; フィ; cd $ホーム; if [ -e "./.ssh/id_rsa.pub" ]; cat ./.ssh/id_rsa.pub | ssh $1 'cat >> .ssh/authorized_keys'; それ以外 ssh-keygen -trsa; cat ./.ssh/id_rsa.pub | ssh $1 'cat >> .ssh/authorized_keys'; フィ; cd $OLDDIR |
setremotekey スクリプトを使用して既存のキーをコピーできます。キーが存在しない場合は、コピーする前にキーを作成します。
$ setremotekey mc@remotehost |
これで、公開キーを使用してリモート ホストにログインする必要があるときはいつでも、リモート ホスト上でそのユーザーが受け入れるキーのリストと組み合わせて個人キー スクリプトを使用できるようになります。
要約する
OpenSSH は、コンピュータ間の通信と情報転送を保護する重要なツールです。 Telnet、FTP、RCP などの従来のツールに代わる安全なツールであるだけでなく、Subversion、X Windows System、rsync などの他のサービスのトランスポート プロトコルとしても機能します。この記事では、OpenSSH を起動して実行するために必要な基本手順、OpenSSH が提供する主要なツールを最大限に活用する方法、およびキー交換ツールを使用してログインと接続の問題を簡素化する方法を説明します。