SSH接続とは?|SSH接続の仕方、パスワード認証と公開鍵認証について解説

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サーバ)は基本的に人が手作業で入力することを想定して作られていますので、立て続けにコマンドを送りつけると正しく動作しないことがあります。適当にウェイトを入れるように工夫しましょう。
ネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。

