🗿

SSHの説明とVPSでのsshの接続方法について

2021/10/31に公開

SSHの概略

SSH接続とは、ScurityShellの略称で安全にリモートで外部サーバをshellで動かすことを指します。

貸しサーバを運用するに当たって、貸しサーバに対してコマンドを送る必要があります。例えば、nginxの起動やアプリケーションの起動、サーバの設定の変更などがあげられます。暗号化されていない文を平文といい、平文のまま送るのは危険なことです。コマンドやファイルの盗聴はもちろん、不正なユーザがサーバに対してコマンドを送る恐れもあります。

そこで、送るコマンドやファイルを暗号化して安全に通信をする必要があります。SSHを使うことで、コマンドやファイルを暗号化して送ることを可能にします。

SSHはユーザ認証に公開鍵暗号を使い、通信には共通鍵暗号を行って通信を行っています。この2つの暗号化は後に説明を行います。

公開鍵暗号を使うことでパスワード認証に比べて安全な認証を行い、共通鍵暗号を行いコマンドとファイルを暗号化して安全に通信を行うことができます。

共通鍵と公開鍵

用語の説明

平文

平文とは、暗号化されていない情報を指します。通信を傍受してそのまま閲覧をして通信内容を見ることができる状態を指します。

暗号化

暗号化は、平文を一定の規則によって意味不明な文章にすることを指します。つまり、人が読んでも言っているかわからない文章にして第三者に閲覧されてもいいようにすることを指します。

例えば、以下のような平文を暗号化します。

I like sushi → J mjlf tvtij

暗号化のプロセス

以上の文は各アルファベットを後ろに一文字づつずらした文章になっています。暗号化後の文章は全く意味が通じない文章になっています。

復号化

復号化は暗号化した文章を平文に戻すことを指しています。

J mjlf tvtij → I like sushi

復号化のプロセス

復号化のプロセスを見たとおり、復号化した文章は人が読める文章になっています。これは暗号化の逆を行っていて、暗号文の各アルファベットを前に一文字づつずらした文章になっています。すると、暗号文が人が読んで分かる文章になります。

共通鍵方式について

共通鍵の概略図

概要

共通鍵は、暗号化と復号化を行うときに同じ鍵を使います。

暗号化、復号化の説明のときに使った暗号は共通鍵での暗号を行っています。暗号化、復号化を同じ方法で行う方式は共通鍵というプロセスによって行われています。

メリットとデメリット

メリットは、すばやく暗号化、復号化をすることができる。

しかし、共通鍵が流出してしまえばどれだけ暗号を強化したとしても解読されてします。

公開鍵方式について

公開鍵方式の概略図

概要

公開鍵と秘密鍵で暗号化と復号化を行うことを指します。

公開鍵で暗号化を行い、受け取り側で復号化を行うときに秘密鍵を使って復号化を行います。

これによって、秘密鍵を持っていなければ暗号を復号化を行うことができないです。

メリットとデメリット

メリットは、共通鍵方式と比べて非常に安全です。

共通鍵は共通鍵を持っていていればすぐに復号化ができます。公開鍵の場合は、秘密鍵を持っていなければ復号化ができません。そのため、秘密鍵を公開しない限り安全に通信を行うことができます。

デメリットは、暗号化に時間がかかるところです。RSA方式を例します。RSA方式は素数p, qがあり、その積 n を作ります。このnで暗号化を行います。そして、これを復号化するときに素数p, qを求めなくてはなりません。復号化でp, q を求めることを素因数分解と呼びます。求めるときにかかる計算量はは「掛け算 < 素因数分解」となります。計算量がかかるということは普通のPCでは太刀打ちできないような素数を使って暗号化をすれば、秘密鍵で復号化するかぎり安全に通信をすることができます。

この暗号化で使う積 n の数は大きい数でなくてはならず、そのため共通化に比べて複雑な処理を行わなくてはなりません。そのため、暗号化のスピードが遅くなってしまいます。

ssh接続の方法

こちらの方法は、参考文献にある「ssh接続の方法(conoha)」を参考に作られています。

変更点は、ubuntu用に変更した部分があります。

コードの「#」はコメントアウトを示しています。

前提条件

  • 貸しサーバを借りている
  • os: ubuntu 20.04
  • サービス: conoha(このサービスは別の貸しサーバサービスでもよい)

SSHのパスワードでのやり方

まずパスワードでログインをします。conohaの場合は貸しサーバの初期状態だとパスワード入力をしてssh接続をすることができます。

$ ssh root@IPアドレス

sshコマンド

このコマンドを打つと、パスワードを要求されます。パスワードを入力すると、リモートでShellを叩けます。

ユーザを作成する

ここでssh接続をするユーザを作成します。

ここでユーザを設定するのは、rootユーザでssh接続を回避するためにsudoをできるユーザを作り安全にshellを使うために作成をします。

まず、ユーザ情報を登録をします。その後、ユーザにパスワードを設定する。そして、ユーザにsudoのグループに追加をする。

$ adduser ユーザ名

Adding user `ユーザ名' ...
Adding new group `ユーザ名' (1000) ...
Adding new user `ユーザ名' (1000) with group `ユーザ名' ...
Creating home directory `/home/ユーザ名' ...
Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for ユーザ名
Enter the new value, or press ENTER for the default
	Full Name []: ユーザ名 # ユーザ名を入力
	Room Number []: ユーザ名 # ユーザ名を入力
	Work Phone []: # 空欄
	Home Phone []: # 空欄
	Other []: # 空欄
Is the information correct? [Y/n] Y

# パスワードを入力
$ passwd ユーザ名
New password: # パスワードを入力
Retype new password: # パスワードを再入力
passwd: password updated successfully

$ usermod -aG sudo ユーザ名

sshを公開鍵方式でできるように設定を変更する

$ su ユーザ名 # ユーザ名に変更する
$ mkdir ~/.ssh 
$ chmod 700 ~/.ssh # フォルダの権限を変更する

そして、公開鍵方式を許可をするように/etc/ssh/sshd_configを変更する

PubkeyAuthentication yes

RSAAuthentication yes

AuthorizedkeysFile .ssh/authorized_keys

/etc/ssh/sshd_config

編集後、以下のコマンドを入力してsshを再起動する

$ sudo systemctl restart ssh.service

ssh接続できるようにクライアント機の設定をする

まず、sshで使う公開鍵と秘密鍵を生成する。ここでは作ったユーザを使って生成を行います。

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ユーザ名/.ssh/id_rsa): /home/ユーザ名/.ssh/RSA名 # 公開鍵と秘密鍵の置き場所を設定。未入力の場合は~/.ssh/id_rsaで生成されます。
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ユーザ名/.ssh/conoha_rsa
Your public key has been saved in /home/ユーザ名/.ssh/conoha_rsa.pub

生成後はscpというファイル転送のコマンドで公開鍵を転送します。

$ scp RSA名.pub ユーザ名@IPアドレス:~/.ssh/authorized_keys 

その後、ssh接続を楽にするために「~/.ssh/config」を設定します。このファイルがなければ、空の「~/.ssh/config」を作ってください。

Host conoha
  HostName IPアドレス
  Port 22
  user ユーザ名
  IdentifyFile ~/.ssh/RSA名

~/.ssh/config

以上を設定し終えると以下のコマンドでssh接続ができます。

$ ssh conoha

サーバ側のセキュリティを設定する

まず、ssh接続をより安全な接続にするために/etc/ssh/sshd_configを変更します。

Port 10022
PermitRootlogin no
PasswordAuthentication no
PermitEmptyPasswords no

その後、設定をリセットします。

$ sudo systemctl restart sshd.service

sshの設定をし終えたら、ubuntuのfirewallを設定します。ubuntuのデフォルトで入っているufwを有効にして、Port 10022を有効にします。

ubuntuのfirewallは許可されたport以外を弾くようになっていますので、もし今後httpやhttpsで通信をする場合はPort 80, 443を開いてください。

$ sudo ufw enable
$ sudo ufw allow 10022

以上でサーバ側の設定は完了しました。

クライアント機の設定の変更は~/.ssh/configのportを変更します。

Host conoha
  HostName IPアドレス
  Port 10022 # portを10022に変更
  user ユーザ名
IdentifyFile ~/.ssh/RSA名

~/.ssh/config

以上でssh接続までを変更しました。

参考文献

SSHの概略

SSH_wikipedia

公開鍵について

公開鍵_共通鍵の概略図

公開鍵_共通鍵のメリットデメリットについて

公開鍵の計算量

RSA_wikipedia

公開鍵_wikipedia

秘密鍵_wikipedia

ssh接続の方法

ssh接続の方法(conoha)

ubuntuのufwの設定方法

Discussion