VPSに安全なセキュリティ対策を施してSSHログイン方法です。
SSHの接続を
パスワード認証有
Root接続有
ポート番号22のまま
という状態では、
「どうぞ、乗っ取ってください。」
と言っているようなものですね。
私は、ブログとメール配信システムが、クラッキングされた経緯があるので
SSHの設定はかなり気を使っています。
今回は、SSHの接続を自分以外で接続させないようなセキュリティを高めるための設定方法を紹介しています。
本記事を参考に、セキュリティの高いサーバー環境を構築してください。
SSHとは?
SSHとは、
Secure Shell(セキュア・シェル)
の略称で
コンピュータ同士で通信するためのプロトコルです。
*プロトコル: コンピュータの通信用言語
認証からネットワークを介した
通信すべてが暗号化されていて
安全に通信ができます。
従来はtelnetをツールを使用して
通信していましたが、
平文のため通信内容が丸裸で
何を通信しているかがバレバレです。
SSHは通信内容を暗号化するため
盗聴のリスクを低くすることができます。
また、公開鍵認証などを利用して
ログインするため、
自分のみがログインできる環境にすることもできます。
では、早速VPSにSSH接続する方法について説明します。
本記事では、Kagoya(カゴヤ)のVPSを想定しています。
VPSにSSH接続する
インスタンスを作成する
スペックやOSをCentOS,Ubuntu,Debianから選択する
スペックを選択します。
まずは、SSDで、
- メモリ1GB
- ディスク容量は50GB
もあれば充分です。
後で変更できます。
今回の例では、
LAMP (CentOS6)
を選択しています。
使い慣れたOSを選択します。
特にこだわりがない場合は、
CentOSでいいでしょう。
その他、OS単体、LAMPや
WordPressなどを選択できます。
OS単体では、OS以外の
パッケージは、あらためて
インストールする必要があります。
LAMPでは、下記がパッケージ
としてインストールされます。
L: Linux (OS)
A: Apache (Webサーバー)
M: MySQL (データベース)
P: PHP (開発言語)
WordPressを使いたい場合は、
WordPressのインスタンスでいいでしょう。
ログイン認証キーを選択する。
VPSでは、まずはじめにコマンド
入力でログインして作業を始めます。
マウスクリックできるような画面はありません。
初めての場合は、ログイン認証キーを作成します。
ログイン時に作成した認証キーを使用してSSHでログインします。
Kagoya VPSに接続する
(Macではターミナルを使用する)
認証キーを作成した時に保存した秘密鍵が必要。
カゴヤVPSではまずログイン用認証キーを作成します。
ログイン用認証キー作成
https://support.kagoya.jp/cloud/manual/index.php?action=artikel&cat=20&id=1&artlang=ja
認証キーが必要です。
作成した時に保存保存する必要があります。
kagoyaVPSにrootでログインする
キーの保存場所とキー本体のパーミッションを設定します。
キー保存場所のパーミッション変更。
$ chmod 400 /Users/(ユーザ名)/(任意の保存場所)/
(認証キー名).keyのパーミッション変更
$ chmod 400 /Users/(ユーザ名)/(任意の保存場所)/(認証キー名).key
ログイン用認証キーを使用してVPSにログインします。
下記のコマンドにてログインします。
書式: ssh -i (キーの保存場所指定) root@(VPSのIPアドレス)
$ ssh -i /Users/(ユーザ名)/(任意の保存場所)/(認証キー名).key root@(ホスト名)
下記のメッセージが出ればログイン成功です。
=========================================================
Thank you for using Kagoya Cloud/VPS LAMP application.MySQL root user password is written in "/etc/my.cnf".
(password is uncomment)
=========================================================
[root@(ホスト名) ~]#
パッケージを更新する
#yum update
で最新の状態にする
注意事項!
構築する環境で制約がある場合は、
パッケージの更新はしないほうがいいです。
Complete!
となったらアップデート完了!
言語環境を日本語にする
SSHでログインした直後は
英語表示のため、
日本語で表示したい場合は
下記の手順で日本語表示に変更します。
viコマンドでファイルを開きます。
#vi /etc/sysconfig/i18n
LANG=の部分を検索して下記のように記載する。
LANG=”ja_JP.UTF-8″
:wq
で保存して終了する。
初期ですでに
LANG=”ja_JP.UTF-8″
となっている場合は
:qで終了する。
完了したら、編集内容を確認してみます。下記コマンドで確認します。
#less /etc/sysconfig/i18n
ユーザーを作成する
rootの他にユーザーを作成する
初期では、
ユーザーがrootのみですが、
セキュリティや自身のミスなどを
考えるとrootでの作業は必要最低限
にしたほうがいいです。
rootでサーバーを乗っ取られると、
好き放題にいろいろやられてしまいます。
そのため、他のユーザーを作成して
rootにスイッチしながら作業をする
ようにしましょう。
ここで作成するユーザーは、
rootの代わりにログインして
システムの設定をします。
このユーザーに対しては、
パスワードを設定したあとに
rootの権限で作業できるように
権限を付与します。
ユーザーを作成する
# useradd (ユーザ名)
パスワードを入力する
# passwd (ユーザ名)
下記のメッセージが出るので、
新規ユーザーのパスワードを入力します。
2回入力が必要です。
Changing password for user (ユーザ名).
# ここにパスワード
•ユーザー (ユーザ名) のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
ユーザーがroo権限で作業できる
ようにグループ(Wheel)に変更します。
追加したユーザーのパスワードが
設定できたら、
次にそのユーザがroot権限で
コマンドを実行できるようにします。
下記のコマンドを打ちます。
# usermod -G wheel (ユーザ名)
sudoをインストールする
sudoがインストールされているか確認する
# yum list installed sudo
sudoがインストールされていない場合は、下記のようにエラーが出る。
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.xxxxx.jp
* extras: ftp.xxxxx.jp
* updates: ftp.xxxxx.jp
エラー: 表示するパッケージはありません•sudoがない場合は、インストールします。
•# yum -y install sudo
コマンド入力後、FTPサイトや
依存関係のチェックが実施される。
対象ファイル一式をインストールします。
下記のようにComplete!と表示
されたらインストール完了です。
————-英語-------------
Installed:
sudo.x86_64 0:1.8.6p3-29.el6_9
Complete!————日本語-----------
インストール:
sudo.x86_64 0:1.8.6p3-29.el6_9
完了しました!
インストール後に確認をします。
下記のコマンドで確認しましょう。
# yum list installed sudo
下記のようにインストール済みパッケージが表示されます。
Loading mirror speeds from cached hostfile
* base: ftp-srv2.kddilabs.jp
* extras: ftp-srv2.kddilabs.jp
* updates: ftp-srv2.kddilabs.jp
インストール済みパッケージ
sudo.x86_64 1.8.6p3-29.el6_9 @base
Wheelグループがsudoでコマンド実行できるようにする
# visudo
コマンドがない場合は、sudoをインストールします。(上記参照)
下記の行を検索してコメントを解除(#を削除)します。
変更前
•# %wheel ALL=(ALL) ALL変更後
%wheel ALL=(ALL) ALL
修正後、wheelグループの内容を確認します
下記のコマンドで確認します。
#groups (ユーザー名)
(ユーザー名) : (ユーザー名) wheel
鍵認証を行う
そもそも鍵認証はなぜ必要なのか?
SSHのログイン認証は、大きく分けて以下の方法があります。
- パスワード認証
ユーザ名とパスワードでログインします。
ただし、ユーザ名とパスワードが
分かれば誰にでもログインできてしまうので、
あまり安全な方法とは言えません。
SSHの設定ファイル(sshd.conf)を
変更してパスワード認証を無効に
するのが、現在では主流の方法です。
- 公開鍵認証による認証
事前にローカル(パソコン)側で
鍵(秘密鍵・公開鍵)を作成し、
そのうち公開鍵をログイン先の
サーバ(VPSなどのレンタルサーバ)に登録します。
秘密鍵はパソコン側に保存します。
こうすることで登録された公開鍵の
ペアとなる秘密鍵を持っている
クライアント(パソコン)のみが接続
できるようになります。
「パスワード認証」と異なり、
機能の有効・無効や設定変更など、
予め準備が必要となります。
手間はかかりますが、パスワード
認証より安全な接続方法です。
詳細な手順については、後述します。
VPS側に公開鍵の保管場所を作成する
公開鍵認証をするために、まずは、
公開鍵の保管場所をサーバー側に作成します。
下記のコマンドで、サーバー上に
ディレクトリを作成し、
パーミッションを変更します。
# mkdir ~/.ssh
# chmod 700 ~/.ssh
scpで公開鍵をサーバー(~/.ssh)にscpでUPする。
公開鍵をサーバーにアップロードします。
このとき、パソコン側のファイルを
扱うため、
サーバーに接続していない状態で
アップロードします。
そのため下記のいずれかを準備します。
FTPサーバーがすでに稼働している
場合は、下記の準備は不要です。
FTPを使いましょう。
- まず、exitしてssh接続から抜けてローカルに戻ります。
- 一旦ターミナルやコンソールからログアウトするか、別のシェルを立ち上げて起きます。
ファイル送信用のコマンド
(ローカル環境から実施します。)
scp [オプション][転送したいファイル名][転送先のパス]
$ scp ~/Desktop/hoge.txt ユーザ名@[サーバのIPアドレス]:/home/ユーザ名/
例
$ scp ~/Desktop/abcdefg.key User@111.222.333.444:/home/(ユーザー名)/.ssh/authorized_keysパスワードを入力する。
User@111.222.333.444's password: パスワードを入力下記のようになれば、転送成功です。
abcdefg.key.key 100% 1683 1.6KB/s 00:00
SSHの設定
ここからは、SSH設定をします。主に次の三項目を実施します。
- ポート番号の変更
- rootログインの無効化
- パスワードログインの無効化
上記ローカル環境から
scpでファイル転送をしていた場合は、
再度レンタルサーバー側にsshでログインしてください。
なお、セキュリティを考慮して
ポートを変更したり、
rootログインを無効にするので
ssh設定前に下記を準備してください。
- ターミナルのウィンドウは2つ以上開いてレンタルサーバーと接続しておく。
- FTPサーバーをインストールしておく。
- VNCサーバーをインストールしておく。
特に
- rootログインと
- パスワードログイン無効
にしている場合、
設定が間違っていると
接続自体できなくなります。
ポート番号(初期22)を別の数字に変更 1024~65535
ポートはサービス(ソフトウェア)
が使用し、
そのポートを通る通信を
ファイヤーウォール(FireWall)
が監視(制御)しています。
サービスの登録
(ソフトのインストール)
をするとポートが使用され、
FireWallでそのポートを開放して
やると、
外部との通信が可能になります。
SSHのポート番号は22ですが、
誰もが知る番号なので別の番号に変更します。
これをするだけでもクラッキング
やサーバー乗っ取りのリスクが減ります。
ポートの選択肢は、番号で言うと
1024~65535までありますが、
今回は、10022に変更する例です。
開いているポートの確認方法。
まずは、SSH通信のため開いているポートを確認します。
コマンドとしては、
- netstat
- ss
- nmap
などありますが、netstatなどは
CentOS7から非推奨になっているので、
ssやnmapなどで調べます。
コマンドがない場合はインストールします。
# yum -y install ss
# yum -y install nmap
使用されているポートや空き状況を調べます。
# ss -atunp
-a:現在のすべての接続を表示する
-t:TCPポートを表示する
-u:UDPポートを表示する
-p: 接続して使用しているプロセスを表示する
-n:サービス名の名前解決を行わない
# ss -atup|grep sshd
tcp LISTEN 0 0 *:10022 *:* users:(("sshd",615,3))
tcp ESTAB 0 40 IPアドレス(サーバー):10022 IP (パソコン側).4:53555 users:(("sshd",2490,3),("sshd",2492,3))
tcp LISTEN 0 0 :::10022 :::* users:(("sshd",615,4))
sshd.configの設定を編集する
まずは、設定ファイルssh.configをバックアップします。
# sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# vi /etc/ssh/sshd_config
“/“で検索して下記をそれぞれ変更します。
ポート番号を初期22から10022に変更する。
Port 10022
パスワードログインを無効にする
PasswordAuthentication no
公開鍵認証を有効にする
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
ルートログインを無効化する
PermitRootLogin no
ファイルを保存する
:wq
保存したら、sshd再起動して確認。
# /etc/init.d/sshd restart
または、
# service sshd restart
Firewallの設定
Firewallでは通信しているポートを
監視しています。
対象ポートを開放して外部の通信が
可能になるよう設定します。
編集ファイルを開く
# vi /etc/sysconfig/iptables
SSH用にポートを開放する
SSHで使用する10022のポートを開放します。
下記を追記します。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
設定後に:wqで保存し、再起動します。
# /etc/init.d/iptables restart
あとがき
以上で、主なSSHの設定は完了です。
セキュリティを高めるため、
下記の設定をしました。
- ポートの変更
- パスワードログイン無効化
- rootログイン無効化
- ファイヤーウォールのポート開放
ただ、上記は最低限ですので
必ずやっておきましょう。
私の場合、パスワードログインを
有効にしていてサーバーを
乗っ取られた経緯があるので
常にパスワードとrootログインは
無効化にしています。
その他、セキュリティを高める
方法や各種動画講座等を
メルマガで経由で紹介しています。
普段お使いのメールアドレスで、
下記から登録してくださいね。
今回は以上です。
製作者情報
製作者:合摩吉和(ごうまよしかず)
メインブログ: https://yume-koubo.net/cs/r01/
お問い合わせ: https://yume-koubo.net/cs/inquiry01/
メールマガジン:メルマガアフィリエイトの勘どころ
メールマガジン登録URL:
https://yume-koubo.net/cs/mailmag01/
コメントフォーム