SSHとは何か?
SSHとは、サーバーを遠隔操作する方法の1つで、通信内容を暗号化しているものです。
通信を暗号化していないものにtelnetという通信方法があり、そのパワーアップバージョンです。
簡単にいうと、AWSやGithubなどのサーバー(レンタルサーバー)などに自分のパソコンのコマンドライン(黒画面)からアクセスできる仕組みです。
【追記】
私は元々Lolipop(ロリポップ)で運用していたのですが、数年間運用することでLolipopの重大な問題が発覚したために、いろいろと調べて、Xserver(エックスサーバー)に移管することにしました。
移管に至った経緯や、XserverとConoha Wing(コノハウイング)の比較などについては下記をご参考ください。Xserverの料金が1万円引きになるリンクも紹介しています(私の場合これが最終的な決め手でした)
SSHの認証(ログイン)方式
認証(ログイン)方式には以下の2種類があります。
パスワード
1つ目はパスワード方式です。
パスワード方式は、サーバーに設定されているユーザーのアカウントとパスワードを使用してSSH接続する方法です。
レンタルサーバーlolipopの場合はこちらの方法を用いています。
公開鍵と秘密鍵
2つ目は公開鍵と秘密鍵を使う方式です。
自分のパソコンでコマンドラインを使って公開鍵と秘密鍵を作成し、公開鍵をSSHで接続したいサーバーに登録します。
自分のパソコンからSSHで接続しようとしたときに、公開鍵と秘密鍵が照合されると通信が可能になります。
AWSやGithubなどのサーバーは公開鍵と秘密鍵でSSH接続をする方法を用いています。
どっちがいいか?
安全なのは公開鍵と秘密鍵を使う方式です。
ただし、その分、カギを生成し、公開鍵を登録するといった手間が発生します。
複数人でアクセスするプロジェクトなどは、個々人が公開鍵と秘密鍵を作成し、それをサーバーのユーザー情報登録してSSH接続を行うのが一般的です。
秘密鍵は知られたら非常にマズいものなので、間違えてGithubで公開したり、他の人に渡さないように注意が必要です。(パスワード方式のアカウント名とパスワードと同じです)
lolipopでSSHを使うには?
lolipopのエコノミーやライトプランではSSH接続は使用できません。
SSHを使用するには、スタンダート以上のプランを契約している必要があります。
私はSSHが使いたいのとMySQLを複数作成したいので、スタンダートにアップグレードしました。
以降で、lolipopで実際にSSHを使用する手順を解説します。
SSHの有効化
lolipopはデフォルト状態ではSSHは有効化されていません。
SSHを有効化するには、lolipopの管理画面にログインし、サイドメニューの「SSH」をクリックします。
すると「SSHを有効にする」というボタンが表示されるのでこれをクリックします。
「SSHを有効にする」をクリックして数秒でSSHの有効化が完了し、以下のような画面が表示されます。
以上でSSHの有効化は完了です。
コマンドラインでSSH接続する
コマンドライン(黒画面)からSSHを使ってlolipopにアクセスできる状態になったので実際にアクセスしてみます。
sshコマンドを使ってlolipopのレンタルサーバーにアクセスします。その際、上記の管理画面で表示された「アカウント名」と「サーバ名」を使用します。
$ ssh <SSHアカウント名>@<サーバー名> -p 2222
「-p」オプションはポート番号を指定するオプションです。lolipop側では「2222」ポートがSSH用に開通してあるので、それを指定します。
実例
$ ssh my-acount-name@ssh.kr.lolipop.jp -p 2222
The authenticity of host '[ssh.kr.lolipop.jp]:2222 ([133.130.35.108]:2222)' can't be established.
RSA key fingerprint is SHA256:AAAABBBBCCCCDDDDEEEEFFFF.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
sshコマンドを使ってログインすると、初回の場合は、「ホスト(サーバー)の暗号キーがまだ登録されていません。接続処理を続けてもいいですか?」という確認が表示されます。
以下のように「yes」と入力します。
(なお、RSAとは暗号化方式のことです。)
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[ssh.kr.lolipop.jp]:2222' (RSA) to the list of known hosts.
my-acount-name@ssh.kr.lolipop.jp's password:
すると、ホストとして登録しましたと表示され、パスワード入力画面に進みます。
lolipop管理画面のパスワードをコピペします。※入力内容は見えませんが、入力されています。
パスワードが照合できると以下のように、リモートサーバーにアクセスすることができます。
my-acount-name@ssh.kr.lolipop.jp's password:
client_global_hostkeys_private_confirm: server gave bad signature for RSA key 0
[my-acount-name@std011 ~]$
以上で接続は完了です。
リモート操作
SSH接続ができている状態であれば、[SSHのアカウント名@std011 ~]がコマンド入力画面の前に表示されます。
なお、デフォルトでは「web」というディレクトリにいます。
[my-acount-name@std011 ~]$ ls
web
例えば、lolipop上ではwebディレクトリ配下に各プロジェクトがありファイルが保存されています。
「ls web/ディレクトリ」と入力すれば、リモートサーバーのディレクトリの内容を確認することができます。
[my-acount-name@std011 ~]$ ls web/prograshi
ads.txt wp-activate.php wp-content wp-mail.php
index.php wp-admin wp-cron.php wp-settings.php
license.txt wp-blog-header.php wp-includes wp-signup.php
life wp-comments-post.php wp-links-opml.php wp-trackback.php
readme.html wp-config-sample.php wp-load.php xmlrpc.php
welcome.html wp-config.php wp-login.php
[my-acount-name@std011 ~]$
このように、自分のローカル環境を操作しているのと同じように、リモートサーバーの環境を自分のパソコンで操作できるようになります。
リモートサーバー接続の入力コマンドの省略化
入力の省略化とは?
現状ではログイン時に「SSHアカウント名」「サーバー名」「ポート番号」の3つの情報を指定しなければいけません。
$ ssh <SSHアカウント名>@<サーバー名> -p 2222
さらにこの後にパスワードを入力する作業が非常に面倒です。ランダムかつ長すぎで覚えきれません、、
これを以下のコマンドを入力しただけで接続できるようにします。
$ ssh lolipop
省略化の手順
「ssh lolipop」コマンドだけでパスワードも入力せずに、リモートサーバーに接続できるようにするための手順は以下の4ステップになります。
「公開鍵」や「秘密鍵」など難しそうに見えますが、一つづつ順を追っていけば、思っているよりも簡単に設定できます。
公開鍵と秘密鍵の作成
.sshディレクトリに移動
SSHに関する接続先(ホスト)や公開鍵、秘密鍵などの情報はユーザーのルートディレクトリ配下の「.ssh」ディレクトリに保存します。
このため、公開鍵と秘密鍵を作成するコマンドを実行する前に、対象のディレクトリに移動します。
なお、「.ssh」の「.(ドット)」は隠しディレクトリであることを示しています。
$cd ~/.ssh
公開鍵と暗号鍵の生成
「.ssh」ディレクトリを移動したら「ssh-keygen」コマンドを使って公開鍵と暗号鍵を生成します。
「-C」オプションの後ろに、Githubで使用しているメールアドレスをつけます。
$ ssh-keygen -t ed25519 -C "your_email@example.com"
実行すると以下の3回で入力を求められます。
- どこにカギを作成するか(ファイルパスの確認)
- パスワードの設定
- パスワードの確認
指定された場所(.ssh/id_暗号化形式)にそのまま保存し、パスワードは空にすることが一般的です。
このため、単に3回Enterキーをクリックするといった記述もみかけます。
もちろんセキュリティレベルを上げるために、保存先を変更したりパスワードをかけることも非常に有効です。
-tオプションとは何か?
「ssh-keygen」の「-t」オプションは、作成する暗号化方法を指定するためのオプションです。
暗号化はデフォルトは「RSA」になっています。ここでは「ed25519」を指定しています。
ed25519とは何か?
「-t」オプションで指定している「ed25519」とは、暗号化方法の一つです。
より詳しく言うと「EdDSA(エドワーズ曲線デジタル署名アルゴリズム)」の中の一つです。
EdDSAは比較的新しい暗号で、RSAと比較し鍵の長さが短くセキュリティが高いといったメリットを持っています。
ただし、ed25519を使うには、OpenSSH 6.5以降であるといった条件があります。これらを満たせない場合はRSAを使用する必要があります。
-Cオプションとは何か?
「ssh-keygen」の「-C」オプションは、コメントを指定することができるオプションです。
デフォルトは「ユーザー名@ホスト名」となっています。
-Cをオプションを使用せずに、「ssh-keygen -t ed25519」として公開鍵と暗号鍵を作成することはできます。
実例
「ssh-keygen」を実行すると、以下のように、鍵が生成され、保存場所とパスワードを聞かれます。
基本的には全てEnterで問題ありません。
$ ssh-keygen -t ed25519 -C "example@gmail.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/c/Users/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/user/.ssh/id_ed25519
Your public key has been saved in /c/Users/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:LUzTvf1111111111w75V0lYHH1ZT1l1z1K111X1 example@gmail.com
The key's randomart image is:
+--[ED25519 256]--+
| .o.+o+++o.++o |
| o oooEoo=.o |
| . o .+s..o+ |
| ....o.00= . |
| =. .S o . |
| . . oo . o . |
|o . aa . oo |
| + . a dod . |
| . ..ase o..|
+----[SHA256]-----+
以上で公開鍵と暗号鍵の生成は完了です。
「ls」コマンドでファイルを確認すると「id_ed25519」と「id_ed25519.pub」が生成されていることがわかります。
$ ls
config id_ed25519 id_ed25519.pub known_hosts
「id_ed25519」が秘密鍵(超重要!)、「id_ed25519.pub」が公開鍵となります。拡張子「pub」はpublic(公開用)という意味です。
秘密鍵をssh-agentに登録する
ssh-agentとは何か?
「ssh-keygen」コマンドで生成した秘密鍵は非常に長くてランダムな文字列になっています。
▼秘密鍵の例(Xの部分がランダムなアルファベットや記号になっています)
$ cat id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END OPENSSH PRIVATE KEY-----
これを毎回入力するのは非常に面倒です。
このため、公開鍵と秘密鍵の照合を代理で行ってくれる便利な機能として「ssh-agent」が用意されています。
ssh-agentの起動
「ssh-agent」以下のコマンドで起動します。
$ eval "$(ssh-agent -s)"
実例
$ eval "$(ssh-agent -s)"
> Agent pid 496
プロセスID(pid)が表示されればOKです。
秘密鍵をssh-agentに登録する
秘密鍵をssh-agentに登録します。「ssh-add」コマンドの引数で、生成した秘密鍵のパスを渡します。
$ ssh-add ~/.ssh/id_ed25519
実例
$ ssh-add ~/.ssh/id_ed25519
Identity added: /c/Users/user/.ssh/id_ed25519 (example@gmail.com)
「Identity added(ID追加)」が表示されれば完了です。先ほど「-C」オプションで指定した、コメント内容も表示されています。
公開鍵をlolipopサーバーに登録する
「ssh-copy-id」コマンドを使って生成した公開鍵をリモートサーバーに置きます。
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 <SSHアカウント名>@<サーバー名>
実行するとSSHへのアクセスパスワードを求められるので入力します。
なお、「-i」は対象となる公開鍵を選択するオプション、「-p」はリモートサーバーのポート番号を指定するオプションです。
実例
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 my-account-name@ssh.lolipop.jp
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/c/Users/user/.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
my-account-name@ssh.lolipop.jp's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '2222' 'my-account-name@ssh.lolipop.jp'"
and check to make sure that only the key(s) you wanted were added.
これでローカルにあった公開鍵をリモート環境に登録することができました。
ためしにSSHに入って、ルートディレクトリを確認すると「.ssh」ディレクトリが追加されています。
$ ssh my-account-name@ssh.lolipop.jp -p 2222
[my-account-name@std011 ~]$ ls -a
. .. .bash_history .dav.dir .dav.pag .ssh web
[my-account-name@std011 ~]$ ls -a .ssh
. .. authorized_keys
「.ssh」ディレクトリ内の「authorized_keys」が公開鍵です。
ssh confingの設定
公開鍵をリモートサーバーに置いただけでは、SSH接続が簡単になりません。
「ssh lolipop」のみで接続できるようにするために、ssh配下の「config」ファイルを編集します。
VSCodeを使っている場合は以下のコマンドを入力します。
$ code ~/.ssh/config
Vimを使っている場合は以下のコマンドを入力します。
$ vi ~/.ssh/config
「config」ファイルを開いたら以下を記載します。
Host <好きな名前>
HostName <サーバー名>
User <SSHアカウント名>
Port <ポート番号>
「好きな名前」には「lolipop」と入力します。保存して閉じれば設定は完了です。
ここでHostの横で指定した「好きな名前」を指定して、sshコマンドを実行すると、リモートサーバーに接続することができます。
$ ssh <好きな名前>
実例
configファイルの中身は以下のようになります。
Host lolipop
HostName ssh.lolipop.jp
User my-account-name
Port 2222
保存して終了します。
「ssh lolipop」コマンドを入力すれば接続することができます。
$ ssh lolipop
[my-account-name@std011 ~]$
無事、リモートサーバーに接続できました。
以上で設定は完了です。
リモートサーバーから抜けるときは通常と同じく「exit」を入力し、Enterをクリックします。
[my-account-name@std011 ~]$ exit
ログアウト
Connection to ssh.lolipop.jp closed.
$