この投稿は
- sshを使い始めたい人
- sshをアバウトでいいから知りたい人
- 周りがssh使って遠隔サーバーで作業してて,自分も使えるようになりたい人
- 教えてもらった通りにssh使うのはいいけど,そもそも何なのか理解していないから気持ち悪い人
- よくわからず使ってたけど,そろそろよくわかりたい人
のような人(つまりは自分)のために,sshのことや使い方を,ほんとの最初の部分まで平易に書いてみようと試みました.ぶっちゃけ,自分が上の様な状態からある程度理解するためのメモをまとめたもの.「sshって,他のパソコンをネットワーク経由で操作することでしょ」ぐらいの知識を持っている方であれば十分理解できるように書いてみました.
「ssh入門」とかのタイトルにするといわゆる「入門詐欺」になりそうだったので,「初めてのssh」ってタイトルにしてみました.ssh, SSH と気分によって小文字と大文字が混在しています.混ぜても危険じゃないはず.
理論や概念の簡単なまとめ
SSH という言葉の意味
Secure SHell (安全なシェル)の略.シェルというのはOSが理解できるプログラム言語みたいなものです.とりあえず,コンピューターに出す指示ぐらいの理解でオッケー.何が安全かというと,遠隔操作(リモートコントロール)を安全にするという意味.遠隔(リモート)のコンピューター動かすのを安全にするからSecureShell,略して SSH.遠隔操作にはいろんな方法がありますが,どのような遠隔操作をするかの枠組み(ルール)の一種のことで,具体的な遠隔操作の方法の総称.正確には「安全な通信プロトコル」の一種.
シェルについて気になる方は次のページがわかりやすいです.
遠隔操作は魔法ではない
遠隔操作からだといって,アニメとかで見る凄腕ハッカーみたいに,相手のパソコンにはいってカタカタカッターン,とはならない.SSHの中身はというと,
遠隔する操作する側が遠隔操作される側に対して「あのぉー,ネット経由で君のパソコンまで来た者なんですけど,ちょっと君のパソコンの中身いじってもいいかな?」という申請を出した後,遠隔操作される側が「じゃぁ証明書見せて.知らない人は受け付けないよ.」と返答するので,申請側はその証明書を見せることでめでたく相手のパソコンの中に入れる.
ということを電気信号を用いて行っているだけです.
ここでわかっていただけると思いますが,遠隔操作する側と遠隔操作される側,どっちにも証明書のようなものが必要です(遠隔操作を受け入れる側は,相手の証明書が有効かどうか判断する方法がないといけない).この証明書がいわゆる鍵とか言われているものに相当します.遠隔操作をする側はもちろんですが,遠隔操作される側も「遠隔操作の申請」を正しく読み取るためのルールが必要です(上の例だと,日本語が理解できないと申請内容も理解できない.この日本語がルールに相当).このルールがSSHと考えると,遠隔操作する側とされる側,どちらにもSSHの機能があるべきであることがわかります.
SSHの種類
SSHは方法の総称なので,具体的にはいろんな方法があります.遠隔操作の申請とその受け入れの方法として,代表的なのが,パスワード認証方式と公開鍵認証方式の2つがあります.
パスワード認証方式
遠隔操作をされる側に「遠隔操作してもいいですか?」という許可をパスワードを使って許可する方法.早い話が,「山」と聞かれるので「川」と答えればパソコンの中に入れてくれるっていうことです.日常で使うメールのように,IDとパスワードでログインする各種サービスに似ていますね.この場合遠隔操作する人は「川」というパスワードを知っている必要があるので,パスワード認証をする際には事前にこのパスワードを知っておかなければならないという特徴があります.
「だったら,そのパスワード伝えるときに,遠隔操作したい内容を教えてあげれば,そもそも遠隔操作しなくてもいいじゃん」となりますが,その通りなのです.この「事前に知っておかなければならない」という面倒さを克服したものが次の公開鍵認証方式です.
公開鍵認証方式
パスワードの代わりに,「鍵」というものを使う方法.鍵という名前がついていますが,正体は遠隔操作する信号を暗号化するものです.この認証方式には公開鍵と秘密鍵という2つの鍵が必要になります.
公開鍵というカギは信号を暗号化してくれます.安全な遠隔操作を目指しているので,暗号化は必須ですね.そしてこの暗号化の方法は「暗号化するのは簡単だけど,その暗号を戻すのは大変なもの」を用います.暗号をもとの暗号に戻す方法を復号といいます.このような暗号化の話は「P≠NP予想」とかの専門的な話になるので,今回のsshの話では省きます.
2つの認証方式の違い
パスワード認証方式は,前もってパスワードを知っておかないと遠隔操作できません.それに対して公開鍵認証方式は,暗号化するカギ(公開鍵)は誰でも見れるようにしておく(公開しておく)ので,公開されているのを見ればよいだけで,前もって知っている必要はありません.「(公開鍵で)暗号化するのは簡単だけど,その暗号を戻すのは大変(だけど,秘密鍵を使えば一発)なもの」という「鍵の不平等さ」みたいなものが公開鍵認証方式のポイントです.
安全性の問題で,パスワード認証方式よりも公開鍵認証方式がオススメです.というか,周りが SSH を使っているというのであれば,間違いなく公開鍵認証で,むしろそうじゃないところはそもそも安全ではないと考えた方がよいでしょう.
暗号化の方法
先ほどの「不平等な」暗号化の方法ですが,実はいろいろ方法があります.中でも RSA と DSA という方法ががSSHで主に用いられる暗号化方法になります.詳しくは数学チックになってしまうので,初めての方は暗号化の方式に違い種類の2つがあるんだぐらいでオッケーです.
RSA
「サルでもわかるRSA暗号」という素晴らしいサイトがあるので,気になる方はそちらをぱらーっと読んでいただければよろしいかと思います.
サルでもわかるRSA暗号 – http://www.maitou.gr.jp/rsa/
リンク先に「読者対象は中高生や純文系の大学生,そして専門書ではRSA暗号を理解できなかった理系の大学生」と書いてあり,煽り文句かと思いきや本当に読みやすくて,助かりました.
DSA
数学チックなので気になる人だけ見てください.
Digital Signature Algorithm – Wikipedia
SSHのデフォルトはRSAで暗号化
DSAという方法よりもRSAで暗号化した方がより安全なので,SSHで遠隔操作する際,通常はRSAを用います.
サーバーとクライアント
遠隔操作する側がクライアント(依頼人),遠隔操作される側がホスト(受け入れ側)とかサーバーといいます.
SSHで遠隔操作をしてくれるソフト
SSHが方法のことであれば,具体的にその方法を使って遠隔操作を可能にしてくれるソフトウェアがあります.その種類をいくつか紹介します.
OpenSSH
OpenSSHはSSHを用いて遠隔操作するソフトウェアの一種.ワードとかエクセルとかと同じレベルの意味でのソフトウェア.ワードとかとOpenSSHの大きな違いはコマンドライン(文字)でやり取りすることでしょう.はじめて遠隔操作をする際に敷居を上げている一因でしょう.Linux で一般的にSSHといえばこのソフトを使ったSSH遠隔操作のことです.
PuTTY
Windowsでsshしたいときに使います.この記事では省略.
Tera Term
同じくWindowsでsshしたいときに使います.この記事では省略.
ということで,これ以降は「Linux で OpenSSH を使う方法」を重点的に説明したいと思います.以下ではOpenSSHを単にSSHと書きます.
実践
sshソフトウェア(OpenSSH)のインストール
Linux の各ディストリビューションごとに違うので,申し訳ないのですが,各自調べてインストールしましょう.サーバーとクライアント両方にインストールすることをお忘れなく.ちなみに,筆者のArch linux には
sudo pacman -S openssh
とすることでインストールできました.
SSH遠隔操作の準備
こちらのサイトで丁寧に説明までしてくれてて,学習の際に大変助かりました.
SSHなるものをよくわからずに使っている人のための手引書 – kenju – Qiita
基本的に遠隔操作はターミナルで操作することを想定しています.
遠隔操作する側(クライアント)で鍵を作る
クライアント側で公開鍵と秘密鍵を同時に作成します.まずは実際行っている様子を次の動画で確認しましょう.
では,自分のコンピューターで実践してみましょう.クライアント側のコマンドラインで「ssh-keygen」を実行してみましょう.
ssh-keygen
実行させると次が表示されます.
Generating public/private rsa key pair. Enter file in which to save the key (/home/(ユーザー名)/.ssh/id_rsa):
ここでは作った鍵をどこに置くかを聞いています.慣例に従って,デフォルトでインストールしましょう.つまり,このまま何も入力せずEnterを押すことで,/home/(ユーザー名)/.ssh という場所が作成され,その中にid_rsaとid_rsa.pubというファイルができます.このファイルが鍵の正体です.id_rsa.pub は公開鍵(信号を暗号化するのに使うカギ.「.pub」はpublicのこと)で,id_rsaというファイルは秘密鍵(暗号を元に戻す,複合のときに使うカギ)です.id_rsaは秘密鍵なので,絶対他人に渡らないようにしましょう.
Enterを押すと次のような行がが現れます.
Enter passphrase (empty for no passphrase):
これは何も入力せずEnterを押していただいて問題ないです.
終わったら次を実行しましょう.
cd ~/.ssh
「cd」で作業している場所(ディレクトリ)を移動する,「~/」で今ターミナルを開いているユーザーのホームディレクトリの意味です.どっと「.」で始まるファイルやディレクトリは隠しファイルという意味になります.これでホームに作成された「.ssh」という隠しフォルダに入ることができます.ここにSSHの設定があります.この中に「ユーザーごとの」SSHの設定ファイルなどがあることになっています.
作成された公開鍵を,遠隔操作される側(ホスト)に渡す
USBで直接渡してもよいですし,何かしらの方法を用いて,先ほど作成されたid_rsa.pubをホスト側のコンピューターに持っていきましょう.場所はホストコンピューターの~/.ssh/にauthorized_keysという名前で置きましょう.
この段階の作業をscpとかのコマンドを使ってやって言う方が見受けられますが,まだsshが使えないのにscpという「ssh(s)でファイルをコピー(cp)する機能」は使えないはずなので,この段階で一度マシンに直接接触する必要があります.方法は何であれ,ホストコンピューターにクライアント側で作られた公開鍵を置ければオッケーです.
ここまでで遠隔操作をする準備はできました.後は遠隔操作をするのみです!
遠隔操作してみる
では接続できるかチェック.まずはサーバーもクライアントもいったんユーザーをログアウトさせてもう一度ログインしましょう.もろもろの設定を反映させるためにはsshデーモンというものだけ再起動すればよいのですが,OSによってやり方違うので,とりあえずログアウトしてもう一回ログインすれば確実です.次にクライアント側のコマンドラインで次を実行してみましょう
ssh (つなげる先のコンピューターのユーザー名)@(つなげる先のコンピューターのアドレス) -i ~/.ssh/id_rsa
これでつながれば大成功です!!
-iの次には秘密鍵の場所を書くようになっています.
少しだけ先へ
もうちょっと簡単に接続できるように設定
クライアント側の~/.sshに”config”という名前のファイルを作って次のような中身を書いたとします.
Host aite Hostname 192.168.0.1 User iatlex IdentityFile ~/.ssh/id_rsa
このように書いておくと,次の二つのコマンドは同じ意味になってくれます.
ssh iatlex@192.168.0.1 -i ~/.ssh/id_rsa ssh aite
2行目がconfigというファイルを作ったときのsshの接続の仕方になります.とても簡単になりましたね.
sshでファイルをやりとりする:scp
sshで遠隔操作をするだけでなく,遠隔操作しているコンピューターとファイルをやり取りすることもできます.基本的な形は
scp (オプション) (送信するファイルの情報) (送られる場所)
となります.
遠隔のコンピューターにファイルを送る
例えば,次のような状況(環境)を考えましょう.
- 接続先のコンピューターのアドレスが “192.168.0.1”
- 接続先でログインするユーザーは”iatlex”
- 接続する際のポートは”22″番
- クライアントが持っている秘密鍵は”~/.ssh/id_rsa”
- 送りたいファイルは自分のコンピューターの”/home/hoge/”というディレクトリにある”test.txt”というテキストファイル
- 送り先の場所は,遠隔のコンピューターの”/home/iatlex/test_directory”
ポートについては初めのうちは無視していただいても構いません.一応デフォルトでは22番になっているので,本当はわざわざ書いてあげる必要はないのですが,今後ポートを習う機会がないとは言い切れないので念のため.ポートとは大雑把に言うと,「相手のパソコンまでの道に着けた番号」と説明できます.このような場合はクライアント側(つまり自分の手前のコンピューター)で次のようにすればよいです.
scp -P 22 -i ~/.ssh/id_rsa /home/hoge/test.txt iatlex@192.168.0.1:/home/iatlex/test_directory
アットマーク(@)とコロン(:)の位置に注意しましょうコロンで終わっているのに注意しましょう.また,送る先のコンピューターのアドレスとユーザーだけ指定して,ディレクトリを具体的に指定しない場合は,送信先のユーザーのホームディレクトリに送られることになります.上の例で言いますと,コロン(:)以降の”/home/iatlex/test_directory”を書かなかった場合,”test.txt”が送られる先は”/home/iatlex”になります.
この状況で,~/.ssh/config を次のように設定したとします.
Host aite Hostname 192.168.0.1 User iatlex IdentityFile ~/.ssh/id_rsa Port 22
このときは次のように書いても上と同じ働きをしてくれます.
scp /home/hoge/test.txt aite:/home/iatlex/test_directory
かなりすっきりしますね.
遠隔のコンピューターからファイルをとってくる
今度は遠隔のコンピューターからデータをとってきます.例えば,次のような状況(環境)を考えましょう.
- 接続先のコンピューターのアドレスが “192.168.0.1”
- 接続先でログインするユーザーは”iatlex”
- 接続する際のポートは”22″番
- クライアントが持っている秘密鍵は”~/.ssh/id_rsa”
- とってきたいファイルは遠隔のコンピューターにある”/home/iatlex/”というディレクトリにある”test.txt”というテキストファイル
- とってきたのを置く場所は,自分のコンピューターの”/opt/hogee”
このような場合もクライアント側(つまり自分の手前のコンピューター)で次のようにすればよいです.
scp -P 22 -i ~/.ssh/id_rsa iatlex@192.168.0.1:/home/iatlex/test.txt /opt/hogee
順番が変わっただけですね.
先ほど説明したようにconfigファイルを書いてあげれば,次のように書いても同じ働きをしてくれます.
scp aite:/home/iatlex/test.txt /opt/hogee