ノウハウ
[エンジニア向け]

管理者の足回り:SSH ノンパスログイン

ノウハウ
テクニカルサポート
SSH といえば 秘密鍵 & 公開鍵
SSH といえば 秘密鍵 & 公開鍵

自宅の Linuxサーバからエクスクラウドの特定アカウントにパスワード無し(ノンパス)でログインする方法についてまとめてみます。手順だけ見てさらっと流すのも面白くないのでログインに関するメモもついでに添えようと思います。

1.自宅サーバからVPSプランにパスワード無しでSSHログインする手順

用意するもの
○ 自宅サーバ(インターネットにつながったLinuxのサーバ)とSSHログインアカウント
○ エクスクラウドのVPSサーバ(Plesk搭載、非搭載問いません)とSSHログインアカウント

ステップ1【エクスクラウドサーバ側の事前確認】

▼エクスクラウドサーバにログイン 現在のディレクトリ確認

契約サーバ名:◆◆.ex-cloud.org
エクスクラウドサーバ内アカウント:excldtest
ホームディレクトリ:/home/excldtest
※上記”excldtest”はサーバ名はサーバ出荷時発行の初期発行アカウントと置き換えてください。

 [excldtest@◆◆]$ pwd 
/home/excldtest 


▼エクスクラウドのホームディレクトリ以下に、.ssh ディレクトリがあるか確認
[excldtest@◆◆]$ ls -a 

 
▼なかったら作っておく
[excldtest@◆◆]$ mkdir .ssh
[excldtest@◆◆]$ chmod 700 .ssh
[excldtest@◆◆]$ ls -a 


▼もし .sshディレクトリ があったら「authorized_keys」があるかチェックしておく
[excldtest@◆◆]$ ls -a .ssh

ステップ2【自宅サーバにて秘密鍵の作成(初めて秘密鍵、公開鍵を作成する場合を想定します)】

自宅サーバ名:jitaku.example.org
自宅サーバ内アカウント:taro (ホームディレクトリ /home/taro )

▼自宅サーバにログイン  現在のディレクトリ確認
jitaku$ pwd 
/home/taro

▼ホームディレクトリ以下に、.ssh ディレクトリがあるか確認
jitaku$ ls -a 
.  ..  .bash_logout  .bash_profile  .bashrc  .history  .ssh  .viminfo

▼もし.ssh ディレクトリがあったら、id_rsa(秘密鍵)や id_rsa.pub(公開鍵) が
あるか確認
$ ls .ssh/
known_hosts 

▼鍵ファイルがなさそうだったら、鍵を作る
jitaku$  ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/taro/.ssh/id_rsa):
Created directory '/home/taro/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/taro/.ssh/id_rsa.
Your public key has been saved in /home/taro/.ssh/id_rsa.pub.
The key fingerprint is:
09:c8:d1:e5:9a:72:6c:22:0a:fb:b2:7d:dd:44:6b:92 taro@jitaku.example.org
The key's randomart image is:
+--[ RSA 2048]----+
|    .. ..        |
|   . o..         |
|    o . .        |
|     . +..       |
|. . o *oS.       |
|.o . =E +        |
|o    . =         |
|.o  . . .        |
|.oo.             |
+-----------------+

▼ 公開鍵ファイルをエクスクラウドサーバに転送する
※上書き防止のためにユニークな名前のファイルにしておく
jitaku$  scp .ssh/id_rsa.pub excldtest@◆◆.ex-cloud.org:/home/excldtest/.ssh/id_rsa.pub.taro

ステップ3【エクスクラウドサーバ側で authorized_keys の登録】

今度は再びエクスクラウド側のサーバでの作業です。

[excldtest@◆◆]$ cd .ssh

[excldtest@◆◆]$ pwd 
/home/excldtest/.ssh

▼.ssh  以下のファイルを確認 

【パターン1】authorized_keys が存在しない場合
[excldtest@◆◆]$ ls 
id_rsa.pub.taro
→自宅サーバから転送した公開鍵をコピーし、authorized_keysを新規に作成
[excldtest@◆◆]$ cp id_rsa.pub.taro authorized_keys
→パーミッションを600あたりで調整
[excldtest@◆◆]$ chmod 600 authorized_keys
[excldtest@◆◆]$ ls -l 
-rw------- 1 excldtest excldtest  381 Feb  4 15:16 authorized_keys


【パターン2】authorized_keys がすでにある場合
[excldtest@◆◆]$ ls 
authorized_keys  id_rsa.pub.taro
→自宅サーバから転送した公開鍵の内容を既存のauthorized_keysの末尾に挿入
[excldtest@◆◆]$ cat  id_rsa.pub.taro >> authorized_keys
→念のためパーミッションを確認
[excldtest@◆◆]$ ls -l 
-rw------- 1 excldtest excldtest  789 Feb  4 15:16 authorized_keys
「600」問題ない
ちなみに、
-rw-r--r-- 1 excldtest excldtest  789 Feb  4 15:16 authorized_keys
「644」これでも大丈夫だったり。 
★ダメなパーミッションパターン:write権限がグループやその他にもついている
「664」「666」とかはNGです。
-rw-rw-r-- 1 excldtest excldtest 789 Feb  4 15:16 authorized_keys

ステップ4【自宅サーバからエクスクラウドサーバにログインテスト】

▼再度「jitaku」にログインしてチェックします。
$ ssh -l excldtest ◆◆.ex-cloud.org

で「◆◆.ex-cloud.org」にするっとログインできるか確認してください。

jitaku$ ssh -l excldtest ◆◆.ex-cloud.org
Last login: Fri Jan 31 12:50:40 2014 from jitaku.example.org
[excldtest@◆◆]$
するっと入ってればOK。

jitaku$ ssh -l excldtest ◆◆.ex-cloud.org
excldtest@◆◆.ex-cloud.org's password: 

と聞いてきた場合は 何も前と状況がかわっていません。

エクスクラウド側の「/var/log/secure」を確認してみて
Authentication refused: 
bad ownership or modes for file /home/excldtest/.ssh/authorized_keys

みたいなのが出てたら 「authorized_keys」のパーミッション
(不要なwrite権限などがないか)を確認してください。

2.ログインにまつわる雑談1:ユーザアカウントと/etc/passwdの話

エクスクラウドのサーバでPlesk無しのクラウドプラン、VPSプランの場合、ユーザアカウントを作るとなるとSSHでログインしてコマンドラインでユーザ作成します。
Pleskあり、無しにかかわらず、/etc/passwdファイルの “:”で区切られた部分を見てみるとユーザ作成にはどんな要素が必要かがわかります。

以下のような情報が必要です。

ユーザ名 ログイン用のID。例)excldtest 。/etc/passwd内に同じユーザ名が重複することはできない。
パスワード 上記のユーザ名に対するパスワード。これは実際には何のおパスワード情報も書かれてません。「x」が代入されています
ユーザID ユーザに対する通し番号(数字)で、ユーザ自身はあまり意識することはない。
プライマリグループID ユーザの所属グループの通し番号で、数字で記載されている。
グループID(数字)とグループ名の対照表は「/etc/group」に保管される。
ホームディレクトリ ユーザがログインした時、どのパスにログインするかの指定項目。
例:/home/excldtest
ログインシェル ログインした後で採用するシェル
例:SSH可能なユーザの場合は、/bin/sh、/bin/bash
FTPのみのユーザの場合:/bin/false等
限定的なSSHユーザの場合:/usr/local/psa/bin/chrootsh

ユーザ作成時にはオプションで、
”その他に属するユーザグループの有無”などを指定することもあります。
それに関連するグループIDと所属ユーザを記載する、「/etc/group」に記載されます。

新規ユーザ作成には一般にはroot権限コマンドを使って作成 削除 パスワード変更などできます。ただ、Pleskを搭載している場合は コマンドを駆使しての更新作業をはじめるとPlesk内のデータベースとの食い違いが生じてしまいますので極力控えたほうがよいでしょう。

一方で、Plesk搭載しているものであっても、FTPアカウントを作った際や、Pleskで発行したFTPアカウントをSSHログインできるように変更した場合も/etc/passwdは更新されます。
コマンドラインだけでわかりうるユーザ情報がほしいという場合には/etc/passwd を確認することは有効です。

【状況を確認】というのでは設定ファイルやコマンドでの確認が手っ取り早い時もあります。
root権限のユーザが ”excldtest”というユーザがどういうユーザかな、というのを確認するときは/etc/passwd で確認することもありますし、finger [ユーザ名]でホームディレクトリとシェルなどを見ることもできます。

# finger excldtest
Login: excldtext                          Name: (null)
Directory: /home/excldtest                Shell: /bin/bash
Last login Tue Feb  4 16:12 (JST) on pts/1 from xxx.xxx.xxx.xxx
No mail.
No Plan.

groups [ユーザ名] (あるいは id [ユーザ名] )で所属グループを見たり
することもできます。

# groups excldtest
excldtest : excldtest 
↑所属グループが表示
# id excldtest
uid=NNN(excldtest) gid=NNN(excldtest) groups=NNN(excldtest)
↑所属グループとUID、GIDが表示

3.ログインにまつわる雑談2:ホーム・スイートホーム

上記では、ホームディレクトリ=「そのIDでログインした時のディレクトリ」と記載しましたが、ホームディレクトリは文字通り、我が家、起点となるディレクトリです。
「~」という言葉でも「自分自身のホームディレクトリ」という意味になりますし「cd」のコマンドをなんの引数もなく実行すればそのユーザのホームディレクトリに戻ります。

[excldtest@◆◆]$ cd /home
[excldtest@◆◆]$ pwd
/home
※「試しに /homeというディレクトリに移動してみます」

どこへ移動しても「~(チルダ)」を指定すればはいつも ふるさと を指し示します

[excldtest@◆◆]$ ls -a ~.ssh (←/home/excldtest/.ssh) 
authorized_keys


何も言わずにディレクトリを移動するよう指示すれば(= cd) ふるさと に戻ります
[excldtest@◆◆]$ cd
[excldtest@◆◆]$ pwd(現在の作業ディレクトリを確認)
/home/excldtest

また、よくあるログイン設定として「$HOME」といえば「~」と同様に、自身のホームディレクトリを示すことになっていることがあります。(エクスクラウドの初期SSHアカウントも同様です。)

4.ログインにまつわる雑談3:パスワード無しログインの肝「$HOME/.ssh」

「$HOME/.ssh」ディレクトリはいつ作られるのかについて書きます。

あるアカウントのホームディレクトリを便宜上、「$HOME」として表します(「~(チルダ)」だとみにくいので・・・)

一般的に 作成したばかりのUNIXシステムユーザのホームディレクトリ $HOME 以下には
.ssh のディレクトリは作成されていません。

この”.ssh”ディレクトリは以下のA,B,Cのタイミングなどで
出来上がります。

A.そのサーバにログイン後、 ssh サーバ名(もしくはIP) でSSH接続をしたとき

→外部サーバへSSH接続を行った時 $HOME/.ssh ディレクトリがなければ作成され
→$HOME/.ssh/known_hostsが更新される

B. ssh-keygen などで秘密鍵を作った時

ssh-keygen -t rsaなどで秘密鍵を作ると
→$HOME/.ssh ディレクトリがなければ作成され
→$HOME/.ssh/id_rsa,id_rsa.pub(もしくはid_dsa,id_dsa.pub)がなどが更新される

そのため、他のサーバへのSSHログインの
足場に使っているサーバなどは何も意識していないうちに
$HOME/.sshのディレクトリがでできあがっていることも多いのです。

また、開通したばかりのサーバに対し、

C. 意図的に$HOME/.sshdディレクトリを作る

という形で作るということも作業をすることもあります。

「1」の凡例でも最初に .sshのディレクトリがなかったら作成、という作業をしました。

「1」をお読みの方はすでにお気づきと思いますが、.sshdディレクトリ(とそれ以下の関連ファイル)を
作成する場合、オーナーやパーミッションについては注意が必要です。

参考:SSHパーミッションの例

$HOME/.ssh SSHのデータ保管ディレクトリ。
オーナーはログインユーザ。
700 (dr——–)
$HOME/.ssh/id_rsa 秘密鍵ファイル 600 (-rw——-)
$HOME/.ssh/id_rsa.pub 公開鍵ファイル 644 (-rw-r–r–)
$HOME/.ssh/authorized_keys 認証済鍵束ファイル 600 (-rw——-)

5.ノンパスでのログイン先を「エクスクラウドのPleskで発行したドメイン用のFTPアカウント」とした場合の注意点

上記の「1」の作業例では、エクスクラウドの初期SSHアカウント”excldtest”を例に説明していましたが、もし、ログイン先を「エクスクラウドのPleskで発行したドメイン用のFTPアカウント」とした場合はどういう操作になるのでしょうか。

方法は大きく2パターンあり、
A:「root権限で $HOME/.ssh ( 例:/var/www/vhosts/example.org/.ssh ) を作成しパーミッションを
調整する」
もしくは

B:「サーバ全体のSSH設定を変更して authorized_keysの格納場所を $HOME/private/.ssh
(例:/var/www/vhosts/example.org/private/.ssh)にする」

のどちらかで、Bについては、パラレルスから以下のガイドもでています。

SSH public key authentication does not work

Bは /etc/ssh/sshd_config を編集して sshdの再起動を行うので、その他のアカウントのauthorized_keysの格納場所も変わる形になりますが、Pleskの仕様に準じ「private」フォルダを活用した設定なので、Plesk環境に引っ越しやPlesk上のドメインバックアップなどの時も、データの引っ越し漏れなどがなさそうで安心ですね。

A,B どちらにしてもまず以下の作業は必須です。

PleskのFTPアカウントをSSHも可能なユーザに変更

まず、FTPアカウントではSSHログインできないので、Pleskのドメインごとのユーザアカウント(FTPユーザ)をSSH可能なアカウントに変更します

※/etc/shadowのファイル で見ればオリジナルのログインシェルは「/bin/false」となっているはずですが、以下のFAQを参照し、Plesk画面で設定変更を行うと「/bin/bash」等に更新されます。
参考ガイド:SSHアカウントを発行したいのですが

B( $HOME/private/.ssh を使う) の手順については パラレルスの手順を参照いただければOKなので、
A( $HOME/.ssh を使う)の手順をご参考までにご案内しますが、
/var/www/vhosts/ドメイン名/ 以下に root権限で ディレクトリを作る、という
Plesk範囲外の操作をすることになるので、それに付随するエラーなどの
保証はないので、その点ご了承ください。

rootで/var/www/vhosts/ドメイン名/.ssh ディレクトリを作成後、パーミッションを調整

PleskのドメインFTPアカウントは、ホームディレクトリはrootの持ち物になっており、 一般ユーザがログイン後、ホームディレクトリ直下にファイルやディレクトリを作成することはできない仕様になっています。

なので、”他のサーバへのSSHログイン”や、”ssh-keygenコマンド発行”を行おうにも.sshディレクトリは作成されませんので、「root権限で 対象ドメインディレクトリ以下に.ssh ディレクトリを作る」
という作業が必要になるのです。ディレクトリ作成後、オーナーとグループの調整も行ってください。

例)
ホームディレクトリ:/var/www/vhosts/example.org
FTP(SSH)ユーザ名:example_ftp

「root」に昇格後以下のコマンド発行を行います。

# mkdir /var/www/vhosts/exmaple.org/.ssh
# chmod 700 /var/www/vhosts/exmaple.org/.ssh
# chown example_ftp:psacln /var/www/vhosts/exmaple.org/.ssh

※ちなみにroot権限でのディレクトリ作成作業は(Pleskではなく)コントロールパネル側の「ファイルマネージャ」でも行うことができます。ただし、ファイルマネージャでのパーミッションの変更については、クラウドプランにおいては搭載プログラムとコントロールパネルとの相性の関係でうまく機能しないことが確認されています。VPSプランのコントロールパネルのファイルマネージャではディレクトリ作成や、パーミッション変更、オーナーシップ変更なども可能です。

その後、1で案内したような、接続元で作成した公開鍵を.ssh 以下に転送し、authorized_keysを作成する、というような操作を行います。

この記事を書いた人

テクニカルサポート

テクニカルサポートを得意とするエクスクラウドのサポートスタッフ。

この記事のタグ

オススメの記事

ページトップへ