リモートで作業している場合、VPN接続を使用するのがネットワークにアクセスするための最も安全な方法ですが、この構成にはハードウェア、時間、知識が必要になる可能性があるため、代替手段を知りたいと思うでしょう。 。 SSHを使用することは、VPNサーバーを構成するよりも、追加のハードウェア、時間、労力をかけずにリモートネットワークにアクセスするための安全な方法でもあります。このブログでは、安全な方法でデータベースにアクセスするようにSSHトンネリングを構成する方法を説明します。
SSHとは何ですか?
SSH(Secure SHell)は、リモートホスト/ネットワークへのアクセス、コマンドの実行、または情報の共有を可能にするプログラム/プロトコルです。さまざまな暗号化認証方法を構成でき、デフォルトでは22 / TCPポートを使用しますが、セキュリティ上の理由から変更することをお勧めします。
SSHの使用方法
これを使用する最も安全な方法は、SSHキーペアを作成することです。これにより、リモートホストにアクセスするために、パスワードだけでなく秘密鍵も必要になります。
また、SSHサーバーの役割のみを持つホストを用意し、可能な限り隔離しておく必要があります。これにより、外部からの攻撃が発生しても、ローカルサーバーに影響を与えることはありません。このようなもの:
最初に、SSHサーバーの構成方法を見てみましょう。
ほとんどのLinuxインストールにはデフォルトでSSHサーバーがインストールされていますが、SSHサーバーが欠落している場合もあるため(最小ISO)、インストールするには、次のパッケージをインストールする必要があります。
RedHatベースのOS
$ yum install openssh-clients openssh-server
$ apt update; apt install openssh-client openssh-server
SSHサーバーがインストールされたので、キーを使用した接続のみを受け入れるように設定できます。
vi /etc/ssh/sshd_config
PasswordAuthentication no
公開鍵を配置した後で必ず変更してください。変更しないと、ログインできなくなります。
ポートを変更し、ルートアクセスを拒否して、より安全にすることもできます:
Port 20022
PermitRootLogin no
アクセスできるようにするには、選択したポートがファイアウォール構成で開いているかどうかを確認する必要があります。
次に、ローカルユーザー「リモート」がSSHサーバーにアクセスするためのキーペアを生成しましょう。キーにはさまざまな種類がありますが、この場合はRSAキーを生成します。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/remote/.ssh/id_rsa):
Created directory '/home/remote/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/remote/.ssh/id_rsa.
Your public key has been saved in /home/remote/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hT/36miDBbRa3Povz2FktC/zNb8ehAsjNZOiX7eSO4w [email protected]
The key's randomart image is:
+---[RSA 3072]----+
| |
| .. . |
| o.+.=. |
| *o+.o.. |
| +S+o+=o . |
| . o +==o+ |
| =oo=ooo.|
| .E=*o* .+|
| ..BB ooo|
+----[SHA256]-----+
これにより、ユーザーのホームディレクトリ内の「.ssh」というディレクトリに次のファイルが生成されます。
$ whoami
remote
$ pwd
/home/remote/.ssh
$ ls -la
total 20
drwx------ 2 remote remote 4096 Apr 16 15:40 .
drwx------ 3 remote remote 4096 Apr 16 15:27 ..
-rw------- 1 remote remote 2655 Apr 16 15:26 id_rsa
-rw-r--r-- 1 remote remote 569 Apr 16 15:26 id_rsa.pub
「id_rsa」ファイルは秘密鍵であり(可能な限り安全に保つ)、「id_rsa.pub」は公開鍵であり、アクセスするにはリモートホストにコピーする必要があります。このためには、対応するユーザーとして次のコマンドを実行します。
$ whoami
remote
$ ssh-copy-id -p 20022 [email protected]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/remote/.ssh/id_rsa.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
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh -p '20022' '[email protected]"
and check to make sure that only the key(s) you wanted were added.
この例では、SSHにポート20022を使用しており、リモートホストは35.166.37.12です。また、ローカルホストとリモートホストの両方で同じユーザー(リモート)を作成しています。リモートホストで別のユーザーを使用できるため、その場合は、ssh-copy-idコマンドでユーザーを正しいユーザーに変更する必要があります。
$ ssh-copy-id -p 20022 [email protected]
このコマンドは、公開鍵をリモートの.sshディレクトリのauthorized_keysファイルにコピーします。したがって、SSHサーバーではこれが必要です:
$ pwd
/home/remote/.ssh
$ ls -la
total 20
drwx------ 2 remote remote 4096 Apr 16 15:40 .
drwx------ 3 remote remote 4096 Apr 16 15:27 ..
-rw------- 1 remote remote 422 Apr 16 15:40 authorized_keys
-rw------- 1 remote remote 2655 Apr 16 15:26 id_rsa
-rw-r--r-- 1 remote remote 569 Apr 16 15:26 id_rsa.pub
これで、リモートホストにアクセスできるようになります:
$ ssh -p 20022 [email protected]
ただし、SSHサーバーを使用しているため、データベースノードにアクセスするにはこれだけでは不十分です。
SSHデータベースアクセス
データベースノードにアクセスするには、2つのオプションがあります。従来の方法では、SSHサーバーを使用している場合は、同じネットワーク内にいるのと同じようにそこからアクセスできますが、そのためには、2つまたは3つの接続を開く必要があります。
まず、SSHサーバーへのSSH接続が確立されました:
$ ssh -p 20022 [email protected]
次に、データベースノードへのSSH接続:
$ ssh [email protected]
そして最後に、MySQLの場合のデータベース接続は次のとおりです。
$ mysql -h localhost -P3306 -udbuser -p
$ psql -h localhost -p 5432 -Udbuser postgres
SSHサーバーにデータベースクライアントがインストールされている場合は、2番目のSSH接続を回避し、SSHサーバーから直接データベース接続を実行するだけです。
$ mysql -h 192.168.100.120 -P3306 -udbuser -p
または:
$ psql -h 192.168.100.120 -p 5432 -Udbuser postgres
ただし、オフィスに接続されているコンピューターから直接データベース接続を使用していたため、これは煩わしい場合があります。そのため、SSHトンネリングを使用する方法を見てみましょう。
SSHトンネリング
同じ例に従うと、次のようになります。
- SSHサーバーのパブリックIPアドレス:35.166.37.12
- SSHサーバーポート:20022
- データベースノードのプライベートIPアドレス:192.168.100.120
- データベースポート:3306/5432
- SSHユーザー(ローカルおよびリモート):リモート
- データベースユーザー:dbuser
したがって、ローカルマシンで次のコマンドを実行した場合:
$ ssh -L 8888:192.168.100.120:3306 [email protected] -p 20022 -N
これにより、ローカルマシンのポート8888が開き、「リモート」ユーザーを使用して、SSHサーバーのポート20022を介してリモートデータベースノードのポート3306にアクセスします。
わかりやすくするために、このコマンドを実行した後、リモートデータベースノードにアクセスして、ローカルマシンでこれを実行できます。
$ mysql -h localhost -P8888 -udbuser -p
グラフィックツールを使用してデータベースを管理している場合は、SSHトンネリングを使用してデータベースノードにアクセスするオプションがあります。
MySQL Workbenchを使用した例を見てみましょう:
PgAdminについても同じです:
ご覧のとおり、ここで尋ねられる情報は、使用されているものと非常によく似ています。コマンドラインSSHトンネリング接続用。
セキュリティはすべての企業にとって重要であるため、自宅で作業する場合は、オフィスで作業するときと同じようにデータを安全に保つ必要があります。前述したように、このための最善の解決策は、データベースにアクセスするためのVPN接続を使用することですが、何らかの理由でそれが不可能な場合は、インターネットを介したデータの安全でない方法での処理を回避するための代替手段が必要です。ご覧のとおり、データベースにアクセスするためにSSHトンネリングを構成することは、ロケット科学ではなく、この場合はおそらく最良の代替手段です。