はじめに
はじめまして!
バックエンドエンジニアの本多です。
最近、環境構築でローカルからAWS上のRedshiftに接続する際に、SSHのポートフォワーディングが必要になりました。
その際に学習した内容をなるべく初心者でもわかりやすいようにまとめてみたので、参考になれば幸いです。
実行環境
この記事で説明する内容は、以下の環境を前提としています。
- クライアント環境
- OS:macOS
- SSHクライアント(OpenSSH)がインストール済み
- データベースクライアントツール(SQL Workbench/J)
- サーバー環境
- 踏み台サーバー:Amazon EC2(Amazon Linux2)
- データベース:Amazon Redshift
- ネットワーク:VPC環境下
目次
- SSHポートフォワーディングとは
- なぜSSHポートフォワーディングが必要なのか
- よくあるユースケース
- SSHポートフォワーディングの種類
- 基本的な使い方
- トラブルシューティング
1. SSHポートフォワーディングとは
SSHポートフォワーディングは、SSHの暗号化された接続を通じて、ネットワーク上の特定のポートやサービスへの安全な通信経路を確立する技術です。この仕組みにより、通常はアクセスできないリソースやサービスに、セキュアに接続することができます。
ポートフォワーディングでは、データがSSH接続を通じて転送されるため、通信内容はすべて暗号化されます。これにより、セキュリティが向上し、悪意のある攻撃やデータの盗聴から保護されます。また、インターネット経由でプライベートネットワーク内のリソースにアクセスする場合や、ファイヤーウォールやNATで保護されたシステムに接続する際にも役立ちます。
2. なぜSSHポートフォワーディングが必要なのか
ポートフォワーディングを使わない場合:
- 誰でも見たり、アクセスできる状態になってしまう
- 悪意のある人が侵入する可能性が高い
- 会社のセキュリティ設定(ファイヤーウォール)を変更する必要がある
ポートフォワーディングを使う場合:
- 許可された人だけが使える
- すべての通信が暗号化される(内容が見られない)
- 既存のSSH接続を利用できる
- 特別なソフトウェアのインストールが不要
3. よくあるユースケース
1. データベース接続
- 本番DBへの安全なアクセス
- 開発環境からのDB操作
2. 開発環境
- ローカル開発環境と本番環境の連携
- テスト環境へのアクセス
3. セキュアな通信
- 社内システムへの安全なアクセス
- クライアントのシステムへの接続
4. SSHポートフォワーディングの種類
1) ローカルポートフォワーディング(-L)
ssh -L [ローカルホストのポート]:[転送先ホスト]:[転送先ホストのポート] [ユーザー名]@[リモートホスト] |
- 用途:ローカルPCから社内サーバーにアクセスする場合
- 具体例:社内データベースに接続
2) リモートポートフォワーディング(-R)
ssh -R [リモートホストのポート]:[転送先ホスト]:[転送先ホストのポート] [ユーザー名]@[リモートホスト] |
- 用途:外部から社内サーバーにアクセスを許可する場合
- 具体例:社内で動かしているアプリケーションを外部公開
3) ダイナミックポートフォワーディング(-D)
ssh -D [ローカルホストのポート] [ユーザー名]@[リモートホスト] |
- 用途:SOCKSプロキシとして使用する場合
- 具体例:ブラウザ全体の通信を暗号化
5. 基本的な使い方
今回はSQL Workbench/Jでプライベート環境に構築されたRedshiftを操作するために、ローカルポートフォワードを使って踏み台サーバ経由で接続しました。
STEP1:ポートフォワーディングの実行
ssh -i example.pem -L 15439:redshift-cluster.xxx.region.redshift.amazonaws.com:5439 user@bastion.company.com |
example.pem(秘密鍵ファイル)は事前に用意する必要があります。(パスワード認証の場合、’-i example.pem’の部分は不要)
この例を分解して説明すると
- example.pem:bastion.company.comに接続するための秘密鍵
- 15439:ローカルPCで使用するポート番号(任意の空いているポート)
- redshift-cluster.xxx.region.redshift.amazonaws.com:Redshiftクラスターのエンドポイント(転送先ホスト)
- 5439:Redshiftの標準ポート
- user@bastion.company.com:踏み台サーバーのユーザー名@踏み台サーバーのホスト名
STEP2:SQL Workbench/Jで赤枠内を埋めて接続
- New Profile:【任意の名前】
- Driver:Redshiftを選択(事前にJDBCドライバーをダウンロードする必要がある)
- URL:jdbc:redshift://localhost:15439/【作成したDB名】
- Username:【設定したユーザー名】
- Password:【設定したパスワード】
- 「Test」を押して接続できるか確認する
6. トラブルシューティング
よくある問題と解決方法をいくつかあげます。
接続できない場合
- ポート番号が正しいか確認
- ファイヤーウォールの設定を確認
- SSH接続自体が可能か確認
接続が遅い場合
- ネットワーク状態の確認
- 圧縮オプション(-C)の使用を検討
セキュリティエラー
- SSH鍵の権限設定確認
- known_hostsファイルの確認
これらの中で、SSH鍵の権限設定確認についての解決例をあげます。
症状:SSH接続時にエラーメッセージが表示される。
Permissions 0644 for 'example.pem' are too open. |
原因:秘密鍵のファイルパーミッションが緩すぎるため、SSHが接続を拒否。
解決策:秘密鍵のパーミッションを修正
chmod 400 example.pem |
まとめ
SSHポートフォワーディングは、一見難しそうに見えますが、基本的な概念を理解すれば、とても便利なツールになります。
セキュリティを保ちながら、さまざまなネットワークリソースにアクセスできる強力な機能として、ぜひ活用してみてください。