目次
SSH接続
SSHとは、Secure SHellの略でネットワークを介して別のコンピュータにログインして操作するためのソフトウェア、またはプロトコルを言います。以前はtelnetが使われていましたがセキュリティに問題があるため、SSHが使われるようになりました。
SSH接続すると何故安全なのかと言いますと、ネットワーク中でやり取りするデータが暗号化されるため簡単には解読できなくなるからです。telnet接続ではデータが暗号化されていないため、比較的簡単に盗み見ることができてしまいます。
以下に出てくるコマンドやプログラムは、Windows10またはLinux(Ubuntu20.10)で動作確認されたものです。なお、以下の解説ではWindows10をクライアント、Ubuntuをサーバとして解説しています。
SSH接続の設定例
ここでは、Ubuntu20.10をSSHのサーバとして使用するための実例を紹介します。
SSH接続時の認証方式には、パスワード認証と公開鍵認証の2種類あります。
個人のLAN内だけで使用するのであればパスワード認証で十分ですが、大勢の人が共有するLANや、別の場所にあるサーバにログインするような場合には「公開鍵認証」を用いるべきでしょう。
UbuntuにSSHをインストールする
Ubuntuにsshdがインストールされていないときは、下記のコマンドを実行してインストールしてください。公開鍵認証を利用されない場合(パスワード認証で良い場合)は、sshdをインストールするだけでSSH接続できるようになります。
1 2 |
sudo apt-get install ssh systemctl start sshd |
公開鍵認証に使用する鍵のペアを作成する(公開鍵を使う場合)
下記のコマンドを実行して鍵を作成してください。Windows10で作成する場合には①を、Ubuntuで作成する場合には②のコマンドを実行してください。鍵を作る際は安全性を向上させるため、passphraseを入力するようにしましょう。
Ubuntuのssh-keygenはデフォルトで新しい書式の鍵を出力するのですが、後ほど紹介するサンプルプログラムで使用しているライブラリが新しい書式に対応していないため、古い書式で出力するようにオプションを付けています。
他のターミナルソフト(TeraTermなど)であれば、Ubuntuで作成した新しい書式の鍵でも使用できます。
下記コマンドを実行すると、id_rsaとid_rsa.pubというファイルが作成されます。id_rdaが秘密鍵でid_rsa.pubが公開鍵になります。id_rsaをクライアント(端末)側に、id_rsa.pubの方をサーバ側に設定します。
1 2 |
①ssh-keygen ②ssh-keygen -m PEM |
公開鍵ファイルをauthorized_keysファイルに追記する(公開鍵を使う場合)
SSH接続でログインしたいユーザでログインして、作成した公開鍵(id_rsa.pub)を ~/.ssh にコピー後、以下のコマンドを実行してauthorized_keysファイルに追記してください。authorized_keysファイルが無い場合にはコピーでも問題ありません。
1 2 3 4 5 6 7 8 |
#フォルダを移動 cd ~/.ssh #公開鍵を authorized_keys に追記する cat filename.pub >> authorized_keys #パーミッションの変更 chmod 600 authorized_keys |
sshdの設定ファイル(sshd_config)を変更する(公開鍵を使う場合)
ファイル /etc/ssh/sshd_config をエディタで開いて、下記のようにそれぞれ変更してください。
1 2 3 4 5 6 7 8 |
# 公開鍵認証を有効化 PubkeyAuthentication yes # パスワード認証を無効化 PasswordAuthentication no # チャレンジレスポンス認証を無効化 ChallengeResponseAuthentication no |
sshdをリスタート(公開鍵を使う場合)
下記のコマンドを実行してsshdをリスタートすれば、SSH接続の公開鍵認証でログインできるようになります。ただし、パスワード認証ではログインできなくなります。
1 |
systemctl restart sshd |
SSHクライアントを作る
サーバによってはターミナルソフトを使ってSSH接続すれば、コマンドシェルよりコマンドを実行することができます。更に自作プログラム(SSHクライアント)からコマンドを実行できるようになれば、更に自動化できて便利になります。
そこでここでは、Windows10とVisualStudioのC#、SSH接続ライブラリのSSH.NETを用いた簡易ターミナルプログラム(sshTerm)を紹介します。
この簡易ターミナルプログラムはエスケープシーケンスの処理やエラー処理(例外処理)などを端折っていますので実用的ではありませんが、SSH接続してコマンドを実行できますので参考にしてみてください。
SSH接続サンプルプログラム(sshTerm)
下記のプログラムはWindows10、VisualStudio2017のC#、SSH.NET、.NET Framework4.5を利用して作成されています。ホスト名やユーザ名、パスワードなど、ログインに必要な設定が正しくできれば簡易ターミナルソフトとして機能します。
SSH.NETは、VisualStudioのNuGetパッケージマネージャを利用してダウンロード(インストール)してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
/* * (VisualStudio2017)C#, SSH.NET(作成者:renci)用簡易ターミナルプログラム * .NET Framework4.5以上、コンソールアプリケーションとしてコンパイルしてください。 */ using System; using Renci.SshNet; using System.IO; using System.Threading; namespace sshTerm { class Program { public static ShellStream shellStream; public static StreamWriter stdInStreamWriter; public static StreamReader reader; public static SshClient sshClient; // メインループ static void Main(string[] args) { int port = 22; // ポート(22=デフォルト値) string url = “host name”; // ホスト名/サーバURL(ipアドレスも可) string username = “username”; // ユーザ名 string password = “password”; // パスワード bool fPrivateKey = false; // trueにすると鍵を使って認証します。 string passphrase = “passphrase”; // パスフレーズ、鍵を作ったときに設定したときは指定してください string privatekeyFileName = “c:\\ssh\\id_rsa”; // 秘密鍵までのパスを指定 ConnectionInfo CInfo; PasswordAuthenticationMethod _PassAuth; PrivateKeyAuthenticationMethod _PrivateKey; if( fPrivateKey ) { // 秘密鍵認証するとき // ユーザ名 _PassAuth = new PasswordAuthenticationMethod(username, ““ /* password */); // 秘密鍵認証 _PrivateKey = new PrivateKeyAuthenticationMethod(username, new PrivateKeyFile[]{ new PrivateKeyFile( privatekeyFileName, passphrase ) }); CInfo = new ConnectionInfo(url, port, username, new AuthenticationMethod[] { _PassAuth, // パスワード認証 _PrivateKey // 秘密鍵認証 } ); } else { // 秘密鍵認証しないとき CInfo = new ConnectionInfo(url, port, username, new AuthenticationMethod[] { new PasswordAuthenticationMethod(username, password) } ); } // SSH接続 var ts = new TimeSpan( 0, 1, 0 ); // 1分で初期化(デフォルトの30秒では応答が遅くてタイムアウトしてしまうことがあるため!) CInfo.Timeout = ts; sshClient = new SshClient(CInfo); sshClient.Connect(); // ストリーム作成 shellStream = sshClient.CreateShellStream(“console”, 80, 1, 800, 600, 1024); // SSH書き込み stdInStreamWriter = new StreamWriter(shellStream); stdInStreamWriter.AutoFlush = false; // SSH読み込み reader = new StreamReader(shellStream); // コンソール出力スレッド生成 Thread t = new Thread(new ThreadStart(ReadWriteTh)); t.Start(); // スレッドを開始する // コンソールからコマンドを読み込んでサーバへ送信 string command; for (;;) { // コマンド読み込み command = Console.ReadLine(); if( command == “exit” ) { // “exit”と入力すると終了! sshClient.Disconnect(); Console.Out.Flush(); t.Abort(); return; } // コマンド実行 stdInStreamWriter.WriteLine(command); stdInStreamWriter.Flush(); Thread.Sleep(200); // 少し待つ } } // サーバから結果を受信し、コンソールへ出力 private static void ReadWriteTh() { String s = null; for(;;) { s = reader.ReadLine(); if( s != null ) { Console.Write(s); Console.Write(“\n”); Console.Out.Flush(); } } } } } |
最後に
C#とSSH.NETライブラリを用いた認証の仕方とコマンド入力、結果の取得方法など、参考にしてみてください。
また、サーバによってはターミナルソフトを使ってSSH接続するとコマンドシェルを使えるようになります。
コマンドシェル(SSHサーバ)は基本的に人が手作業で入力することを想定して作られていますので、立て続けにコマンドを送りつけると正しく動作しないことがあります。適当にウェイトを入れるように工夫しましょう。
インフラエンジニア専門の転職サイト「FEnetインフラ」
FEnetインフラはサービス開始から10年以上『エンジニアの生涯価値の向上』をミッションに掲げ、多くのエンジニアの就業を支援してきました。
転職をお考えの方は気軽にご登録・ご相談ください。