メインコンテンツまでスキップ

「SSH」タグの記事が8件件あります

全てのタグを見る

WSL2 で SSH のトンネルを使用して、WSL2 上のサーバーを LAN に公開する方法

· 約2分
ひかり
Main bloger

Step1. WSL 側に OpenSSH Server をインストール

WSL2 に OpenSSH Server をインストールします。 それと、sshd サービスを立ち上げます。

# WSL2 側
sudo apt install openssh-server
sudo service sshd start

Step2. Windows 側で公開鍵を登録

Windows に公開鍵を登録していない場合は、以下のコマンドを実行します。

# Windows 側
ssh-keygent -t ed25519

次に WSL2 に公開鍵を登録します。

# Windows 側
$pubkey = $(cat $HOME\.ssh\id_ed25519.pub)
wsl -- echo $pubkey `| tee -a `$HOME/.ssh/authorized_keys

Step3. SSH でトンネルを通す

Windows から WSL2 に対し、SSH 接続を行います。

# Windows 側
ssh (wsl -- hostname -I).trim() -g -L8081:localhost:8080

コマンドを区切って説明します。

  • (wsl -- hostname -I).trim() は WSL2 の IP アドレスを取得します
  • -g はポートを LAN にフォワーディングします (外部の端末から 192.168.x.x のようなアドレスで参照可能になります)
  • -L はローカルフォワードのオプションです。サーバーのポートをローカルに転送します
  • 8081localhost:8080 は ローカルの 8081 にアクセスすると、localhost:8080 に転送されるという意味です。 ここでいう localhost はサーバー側から見た localhost です

Step4. サーバーを立ち上げる

公開対象となるサーバーを WSL2 上で立ち上げます。

# WSL2 側
ruby -run -e httpd . # ディレクトリ一覧が公開される

Step5. サーバーにアクセスする

http://localhost:8081 または、http://<ipconfig で表示される IP アドレス>:8081 でサービスにアクセスできます。

トンネル接続によるデメリットとしては毎回トンネルを通すのが面倒なことです。 不安定ですが、netsh interface portproxy ~ による設定を行っても同じようにできます。

Windows Terminal と plink を使ってシリアルコンソールを使う

· 約1分
ひかり
Main bloger

Arduino シリアル通信のプログラムを書く

Windows Terminal と plink を用いたシリアル通信を試すために、 Arduino にシリアル通信のプログラムを書き込みます。

void setup() {
Serial.begin(9600);
}

void loop() {
if(Serial.available() <= 0) return;
char data = Serial.read();
if(data == '\r'){
Serial.print("\n");
}else{
Serial.print(data);
}
}

以下のコマンドで Windows Terminal から plink コマンドを実行してシリアル通信を行います。

plink -serial COM1 -sercfg 9600,8,1,N,N

公開鍵認証と SSH

· 約3分
ひかり
Main bloger

公開鍵認証とは、暗号化やデジタル署名に使われる技術の一つで、公開鍵と秘密鍵という二つの鍵を使って通信相手の本人確認や暗号化を行う方法です。 SSH とは、Secure Shell の略で、ネットワーク上で安全にコマンドやファイルをやり取りするためのプロトコルです。SSH では公開鍵認証を使って、サーバーにログインすることができます。 具体的にどのように動作するかを説明します。

この記事では、数学についての言及はありません。

公開鍵と秘密鍵について

公開鍵認証では、公開鍵と秘密鍵という二つの鍵を使います。 公開鍵は名前の通り、誰でも知っていても構わない鍵で、通信相手に送ったり、インターネット上に公開したりします。 秘密鍵は自分だけが持っている鍵で、絶対に他人に知られてはいけない鍵です。 秘密鍵は公開鍵から導くことは数学的に非常に困難なものとなっています。 この性質を利用することで、暗号化やデジタル署名を実現できています。

デジタル署名

デジタル署名とは、データの送信者が本人であることを証明するための技術です。 以下の手順でデジタル署名を行います。

送信者

  1. 文章をハッシュ化 (ハッシュ)
  2. ハッシュを秘密鍵で暗号化 (電子署名)
  3. 文章と電子署名を送信

受信者

  1. 文章と電子署名を受信
  2. 公開鍵で署名を復号しハッシュを取得
  3. 文章をハッシュ化し、電子署名により得られたハッシュと比較 (ハッシュが同じであれば相手の送信した文章)

デジタル署名は署名を秘密鍵、検証を公開鍵で行っています。

SSH について

SSH とは、Secure Shell の略で、ネットワーク上で安全にコマンドやファイルをやり取りするためのプロトコルです。 SSH では公開鍵認証を使って、サーバーにログインすることができます。SSH の利点は以下の通りです。

  • パスワードなしでログインできるため、パスワード漏洩や総当たり攻撃などのリスクが低減 (ただし、パスワードを使用することも可能)
  • データが暗号化されるため、通信内容が盗聴されたり、改ざんを防止
  • ポートフォワーディングやトンネリングなどの機能を使って、ネットワークのセキュリティやアクセス制御を強化

SSH では、以下のように公開鍵認証を行います。

  1. クライアントは、公開鍵と秘密鍵を生成 (ssh-keygen -t ed25519)
  2. クライアントは、クライアントの公開鍵 (~/.ssh/id_ed25519.pub) を事前にサーバーに登録 (~/.ssh/authorized_keys)
  3. クライアントはサーバーに接続する際に、自分の秘密鍵 (~/.ssh/id_ed25519) でデジタル署名
  4. サーバーはクライアントの公開鍵 (~/.ssh/authorized_keys)でデジタル署名を検証し、正しい場合はログインを許可

以上が、公開鍵認証と SSH についてのまとめです。 公開鍵認証と SSH を使うことで、ネットワーク上で安全にコマンドやファイルをやり取りすることができます。

OpenLDAP の slappasswd で生成される SSHA とは

· 約1分
ひかり
Main bloger

slappasswd コマンドとは

slappasswd コマンドは OpenLDAP 用のパスワードを生成するコマンドで、 デフォルトでは SSHA を用いて、パスワードをハッシュ化する。

認証の仕組み

SSHA では生成されたハッシュの末尾 4 バイトがソルトとなっており、 入力されたパスワードと保存されているソルトからハッシュを生成し、 保存されているハッシュと一致するかどうかで認証を行う。

以下のプログラムでは、 適切なパスワード (例: admin) を与えると、元のハッシュと生成されたハッシュが一致する。

require 'base64'
require 'digest'

pass = 'admin'
ssha = '{SSHA}23AUBfRZytVFNpe7onuFhyCSJOHRzCWh'
ssha =~ /{.+}(.+)/
salt256s = Base64.decode64(Regexp.last_match(1)).unpack('C*')[-4..-1]

salt = salt256s.pack('C*')
b_ssha = Digest::SHA1.digest(pass + salt)
Base64.strict_encode64(
(b_ssha.unpack('C*') + salt256s).pack('C*')
)

Windows の OpenSSH で Permission denied が出る原因

· 約1分
ひかり
Main bloger
  • パスワードでのログインは可能 (ただし、設定で無効化している)
  • 公開鍵認証で Permission denied が出る

実際に localhost:22 に接続すると、

hikari@localhost: Permission denied (publickey,keyboard-interactive).

とエラーが出る。

image

原因

Administrators グループ、つまり「管理者ユーザー」はデフォルトで、C:\ProgramData\ssh\administrators_authorized_keys の公開鍵を 参照して認証しているようだ。

これを、$env:userprofile\.ssh\authorized_keys に変更する。

解決法

管理者権限で C:\ProgramData\ssh\sshd_config を開き、以下のように下の二行をコメントする。

image

- Match Group administrators
- AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
+ #Match Group administrators
+ # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

保存が終わったら、サービスを再起動する。

Restart-Service sshd

termux に ssh する

· 約1分
ひかり
Main bloger
pkg install openssh

エラーが出る場合

Android 版の termux で実行するとエラーが起こるので、 既存の termux を削除し Github から termux をインストールすることをおすすめします。

サーバーの起動

sshd

公開鍵の設定

クライアントの公開鍵 (~/.ssh/id_*.pub) を termux の ~/.ssh/authorized_keys に追加する。

公開鍵はメールで自分宛てに送ったり、twitter の DM で自分宛てに送ったりして、コピペすると楽。

# 例:
echo ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKYztjZfIVMl5o0J2DrigTsl1XgbSKMUgYCpfOfhMtmw hikari@B450M-K >> ~/.ssh/authorized_keys

ログイン

# スマホの ip アドレスを確認
ip a

ssh 192.168.x.x -p 8022

Windows の OpenSSH でパスワード認証を無効にする

· 約1分
ひかり
Main bloger

管理者権限でターミナルを開く

設定ファイルを編集するために管理者権限が必要なため、管理者権限でターミナルを開く。

ターミナルのアイコンを右クリックして、ターミナルを右クリックして、「管理者として実行」

image

image

ターミナルで設定ファイルを開く

notepad C:\ProgramData\ssh\sshd_config

を実行。

image

設定ファイルを編集

- # PasswordAuthentication yes
+ PasswordAuthentication no

image

image

に変更し上書き保存する。

SSH サーバーの再起動

ターミナルに戻り、以下のようにコマンドを実行し、SSH サーバーを再起動する。

Restart-Service sshd

接続テスト

設定が有効になっているかテストする。

ssh localhost

を実行し、

user@localhost: Permission denied (publickey,keyboard-interactive).

のようになっていれば OK

SSH トンネル

· 約2分
ひかり
Main bloger

ローカルポート転送

ssh -L [クライアントのポート]:[転送したいホスト]:[転送したいホストのポート]

クライアント A、SSH サーバー B、転送ホスト C があり C:8080 を A のポート 80 に転送したい場合。

ssh -L80:C:8080 B

この転送で、A から http://localhost へアクセスすると、 B の http://C:8080 と同じ内容が表示される。

まとめると、 A から C は見えなくても、A から B へ SSH が接続でき、 B から C が見える場合、B を経由して C のポートを A へ転送可能。

-g をつけると、A のホスト名で A のネットワークにあるパソコンから C:8080 へアクセスができる。

家のネットワーク上にあるポートを外部に転送したいとき、 とりあえず 22 番だけ外部に開放している状態であれば、 ssh 経由で家のネットワークにアクセス可能。

リモートポート転送

ssh -R [クライアントのポート]:[転送したいホスト]:[転送したいホストのポート]

ローカル転送と異なり、 接続先から見えるポートを転送するのではなくクライアント側から見える ポートを転送する。

クライアント B、SSH サーバー A、転送ホスト C があり C:8080 を A のポート 80 に転送したい場合。

ssh -R80:C:8080 A

この転送で、A から http://localhost へアクセスすると、 B の http://C:8080 と同じ内容が表示される。

B が外からアクセスできない場合でも、 B と A の接続を確立させれば、 C の内容を A に転送可能。 B を直接操作できない場合に使うことが多く、 B と A の接続が切れるトラブルが発生した場合、A から C へのアクセスが不可能になるので、B と A の接続が切断された場合に自動的に再接続するツール autossh が使われることが多い。