Oracle Cloud: Windows Server に OpenSSH を設定して ssh接続してみてみた

OpenSSH は、SSH プロトコルを使用するリモート ログイン用の接続ツールです。 クライアントとサーバーの間のすべてのトラフィックを暗号化して、盗聴、接続ハイジャック、その他の攻撃を排除します。
OpenSSH を使用して、OpenSSH Client がインストールされている Windows 10 (ビルド 1809 以降) または Windows Server 2019 デバイスから、OpenSSH Server がインストールされているデバイスに接続できます。
ということで、Oracle Cloud Infrastructure (OCI)の Windows Server に OpenSSH を設定して、MacBook から ssh接続してみてみます。
また、SSH接続時の既定の Windows コマンド シェル (cmd.exe) を PowerShell へ変更してみてみます。

# ■ 構成イメージ
事前に OCI へ Windows Server 2019 の Compute Server を設定し Remote Desktop アクセスできるようにしておきます 
![構成(VPN)2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/122d2c4b-13da-c2bc-c7d9-d50e96201905.jpeg)





# ■ Remote Desktop アクセス
直接 Windows OS へアクセスできない場合、Remote Desktop等でアクセスします。

**1) Microsoft Remote Desktop 起動**
MacBook へ Microsoft Remote Desktopをインストールして、起動
<img width="50%" alt="03_RDP接続01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/22a70f4f-152e-0370-1225-287a8b814420.jpeg">

**2) Widows Server ログイン**
Microsoft Remote Desktopから、Widows Server へログイン
Oracle Cloud Infrastructure (OCI)の場合 opcユーザーでログイン
![03_RDP接続07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/5eea709e-428b-189d-dbe7-a37ef36d4a78.jpeg)




# ■ PowerShell を使用して OpenSSH をインストール

## ● 管理者として PowerShell を実行
PowerShell を使用して OpenSSH をインストールするには、管理者として PowerShell を実行します。
PowerShellアイコンを右クリックし、[Run as administrator] をクリックして起動
![04_Open-ssh設定01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/9e82f75c-5091-432d-a5c7-9e03381d328c.jpeg)

**・PowerShell起動完了**
<img width="60%" alt="04_Open-ssh設定02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/db8df669-dd8b-4736-b6d9-6973b0242d56.jpeg">

## ● OpenSSH が使用可能になっていることを確認
OpenSSH が使用可能になっていることを確認するには、次のコマンドを実行します。
インストールされていない場合は、次の出力が返されます。

	PS C:\> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

		Name  : OpenSSH.Client~~~~0.0.1.0
		State : NotPresent

		Name  : OpenSSH.Server~~~~0.0.1.0
		State : NotPresent


## ● サーバーまたはクライアント コンポーネントをインストール

**1) Install the OpenSSH Client**
次のコマンドで OpenSSH Client をインストール

	PS C:\> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

		Path          :
		Online        : True
		RestartNeeded : False

**2) Install the OpenSSH Server**
次のコマンドで OpenSSH Server をインストール

	PS C:\> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

		Path          :
		Online        : True
		RestartNeeded : False


**3) OpenSSH Install 確認**

	PS C:\> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

		Name  : OpenSSH.Client~~~~0.0.1.0
		State : Installed

		Name  : OpenSSH.Server~~~~0.0.1.0
		State : Installed


## ● OpenSSH Server の起動と構成
初めて使用するために OpenSSH Server を起動して構成するには、管理者として PowerShell を開き、次のコマンドを実行して sshd service を開始します。


**1) Start the sshd service**
エラーで起動できない場合は後述のGUIで起動します。

	PS C:\> Start-Service sshd

		Start-Service : Service 'OpenSSH SSH Server (sshd)' cannot be started due to the following error: Cannot start
		service sshd on computer '.'.
		At line:1 char:1
		+ Start-Service sshd
		+ ~~~~~~~~~~~~~~~~~~
			+ CategoryInfo          : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Start-Service],
			ServiceCommandException
			+ FullyQualifiedErrorId : CouldNotStartService,Microsoft.PowerShell.Commands.StartServiceCommand


**2) OPTIONAL but recommended**

	PS C:\> Set-Service -Name sshd -StartupType 'Automatic'


**3) Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify**

	PS C:\> if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
		>>     Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
		>>     New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
		>> } else {
		>>     Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
		>> }
		Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists.

## ● GUIによる OpenSSH Server 起動設定
コマンドでOpenSSHサービスを起動できない場合、GUIで起動設定します。

**1) Services起動**
"Service"を検索して起動
![05_Open-ssh設定-Service確認01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/6c745f8c-c8b7-b75d-5ce3-09e426f614cb.jpeg)


**2) Start設定**
Services画面から [OpenSSH]を右クリックし、[Properties]をクリック
![05_Open-ssh設定-Service確認03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/7950ab6b-d9e8-2a57-956c-854800354f9d.jpeg)

**3) 自動起動設定と起動**
[Start Type]を Automatic にして、[Start] をクリックして起動
![05_Open-ssh設定-Service確認04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/7999989a-28c1-11b3-4285-63a7711c8bca.jpeg)

## ● GUIによる Firewall 設定
sshを外部接続できるように Firewallを設定

**1) WIndows Defender Firewall 起動**
![06_Open-ssh設定-Firewall確認01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/599d035a-8041-7006-7315-01f531c60920.jpeg)

**2) WIndows Defender Firewall画面**
[Allow an App 〜]をクリック
![06_Open-ssh設定-Firewall確認02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/c00641ea-3fe1-c7e0-c0cc-ef5e3d2282dd.jpeg)


**3) Allow apps to communicate through Windows Defender Firewall画面**
OpenSSH Serverへチェックし、[OK]をクリック
![06_Open-ssh設定-Firewall確認03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/b149f05d-72a9-fbbd-c1bd-55c63f016aa9.jpeg)


# ■ OpenSSH Server への接続
**1) ssh インストール確認**
sshコマンドが使えることを確認

	PS C:\> ssh
		usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
				[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
				[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
				[-i identity_file] [-J [user@]host[:port]] [-L address]
				[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
				[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
				[-w local_tun[:remote_tun]] destination [command]

**2) ssh接続 (Permission denied)**
	初期設定ではパスワード認証無効化されており、公開鍵認証のみ可能になっているためアクセスできません。

	PS C:\> ssh opc@localhost
		The authenticity of host 'localhost (::1)' can't be established.
		ECDSA key fingerprint is SHA256:VuSnFnSDoFfKK1qngqhZTQu8rk0UUee8qmz61EAASR0.
		Are you sure you want to continue connecting (yes/no)? yes
		Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
		opc@localhost: Permission denied (publickey,keyboard-interactive).



## ● OpenSSH Server 公開鍵認証設定
sshd_config ファイルから、パスワード認証無効化されており、公開鍵認証のみ可能であることを確認

	・公開鍵認証有効: PubkeyAuthentication yes を設定
	・パスワード認証無効: PasswordAuthentication no を設定


**・設定確認**

	PS C:\Users\opc\.ssh> type C:\ProgramData\ssh\sshd_config
		# This is the sshd server system-wide configuration file.  See
		# sshd_config(5) for more information.

		# The strategy used for options in the default sshd_config shipped with
		# OpenSSH is to specify options with their default value where
		# possible, but leave them commented.  Uncommented options override the
		# default value.

		#Port 22
		#AddressFamily any
		#ListenAddress 0.0.0.0
		#ListenAddress ::

		#HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
		#HostKey __PROGRAMDATA__/ssh/ssh_host_dsa_key
		#HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
		#HostKey __PROGRAMDATA__/ssh/ssh_host_ed25519_key

		# Ciphers and keying
		#RekeyLimit default none

		# Logging
		#SyslogFacility AUTH
		#LogLevel INFO

		# Authentication:

		#LoginGraceTime 2m
		#PermitRootLogin prohibit-password
		#StrictModes yes
		#MaxAuthTries 6
		#MaxSessions 10

		PubkeyAuthentication yes

		# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
		# but this is overridden so installations will only check .ssh/authorized_keys
		AuthorizedKeysFile      .ssh/authorized_keys

		#AuthorizedPrincipalsFile none

		# For this to work you will also need host keys in %programData%/ssh/ssh_known_hosts
		#HostbasedAuthentication no
		# Change to yes if you don't trust ~/.ssh/known_hosts for
		# HostbasedAuthentication
		#IgnoreUserKnownHosts no
		# Don't read the user's ~/.rhosts and ~/.shosts files
		#IgnoreRhosts yes

		# To disable tunneled clear text passwords, change to no here!
		PasswordAuthentication no
		#PermitEmptyPasswords no

		#AllowAgentForwarding yes
		#AllowTcpForwarding yes
		#GatewayPorts no
		#PermitTTY yes
		#PrintMotd yes
		#PrintLastLog yes
		#TCPKeepAlive yes
		#UseLogin no
		#PermitUserEnvironment no
		#ClientAliveInterval 0
		#ClientAliveCountMax 3
		#UseDNS no
		#PidFile /var/run/sshd.pid
		#MaxStartups 10:30:100
		#PermitTunnel no
		#ChrootDirectory none
		#VersionAddendum none

		# no default banner path
		#Banner none

		# override default of no subsystems
		Subsystem       sftp    sftp-server.exe

		# Example of overriding settings on a per-user basis
		#Match User anoncvs
		#       AllowTcpForwarding no
		#       PermitTTY no
		#       ForceCommand cvs server

		#Match Group administrators
			#AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys





## ● authorized_keys 設定
ユーザー配下に $HOME\.ssh\authorized_keys ファイルを作成

**1) authorized_keysファイル作成**

	PS C:\Users\opc> mkdir $HOME\.ssh
	PS C:\Users\opc> cd $HOME\.ssh
	PS C:\Users\opc\.ssh> pwd

		Path
		----
		C:\Users\opc\.ssh


	PS C:\Users\opc\.ssh> New-Item -type file authorized_keys

			Directory: C:\Users\opc\.ssh

		Mode                LastWriteTime         Length Name
		----                -------------         ------ ----
		-a----       10/15/2021   5:24 AM              0 authorized_keys


	PS C:\Users\opc\.ssh> ls

			Directory: C:\Users\opc\.ssh

		Mode                LastWriteTime         Length Name
		----                -------------         ------ ----
		-a----       10/15/2021   5:24 AM              0 authorized_keys
		-a----       10/15/2021   5:15 AM            172 known_hosts


**2) authorized_keys ファイル公開鍵設定**
authorized_keys ファイルへ SSH接続するための公開鍵を登録
公開鍵はOCI Computeインスタンスを作成したときに出力もしくは使用したものを使用



    PS C:\Users\opc\.ssh> Set-Content -Path $HOME/.ssh/authorized_keys -Value "ssh-rsa.pubの公開鍵の接続文字列"

**3) authorized_keys ファイル公開鍵設定確認**

	PS C:\Users\opc\.ssh> type .\authorized_keys
		ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLYXNhFZYyzBFlYCXUMBGKLGuh+Km+2cufP/aWF4bN+raQ+bYpHXI65iH8WqAbPUBliE8BLUF8tjqMamaBGFZuOMY ssh-key-opc




# ■ ssh接続
自宅の MacBookから Windows Server へ SSH秘密鍵を使用して接続
秘密鍵はOCI Computeインスタンスを作成したときに出力もしくは使用したものを使用

**1) ssh接続**

	mac-book:~ user$ ssh  -i id_rsa opc@10.10.0.2

		Microsoft Windows [Version 10.0.17763.2183]
		(c) 2018 Microsoft Corporation. All rights reserved.


	opc@BASTION C:\Users\opc>


**2) 接続ホスト名確認**
hostnameコマンドで、ホスト名を確認

	opc@BASTION C:\Users\opc>hostname
		bastion




# ■ SSH接続時の既定のシェルを PowerShell へ設定
SSH接続時の既定の Windows コマンド シェル (cmd.exe) を PowerShellへ変更してみます

## ● 設定コマンド
既定の ssh シェルの構成は、シェルの実行可能ファイルへの完全なパス Computer\HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH を、Windows レジストリの文字列値 DefaultShell に追加することで行われます。
例として、次の Powershell コマンドによって、既定のシェルが PowerShell.exe に設定されます。

	PS C:\> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force


		DefaultShell : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
		PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
		PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
		PSChildName  : OpenSSH
		PSDrive      : HKLM
		PSProvider   : Microsoft.PowerShell.Core\Registry

## ● CLI設定確認
Get-ItemPropertyコマンドで設定確認

	PS C:\> Get-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH"


		DefaultShell : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
		PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
		PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
		PSChildName  : OpenSSH
		PSDrive      : HKLM
		PSProvider   : Microsoft.PowerShell.Core\Registry

## ● GUI設定確認
Registry Editorで設定確認
1) regedit (Registry Editor)起動
![regedit01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/ef8c7162-32e7-72b9-de03-714cc1737b96.jpeg)


2) Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH 確認
次のように DefaultShell が設定されていればOK
![regedit02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109087/4f0b7d2f-3e2c-9691-0039-cfb9f1620a44.jpeg)



## ● ssh接続確認
sshでWindowsへアクセスして、PowerShellになっていることを確認

1) ssh接続

	mac-book:~ user$ ssh -i id_rsa opc@10.10.0.2
		Windows PowerShell
		Copyright (C) Microsoft Corporation. All rights reserved.

	PS C:\Users\opc> hostname
		bastion

2) PowerShell Version確認

	PS C:\Users\opc> Get-Host


		Name             : ConsoleHost
		Version          : 5.1.17763.2183
		InstanceId       : cc4eebe4-0bc3-4d2c-82eb-ec38f4
		UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
		CurrentCulture   : en-US
		CurrentUICulture : en-US
		PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
		DebuggerEnabled  : True
		IsRunspacePushed : False
		Runspace         : System.Management.Automation.Runspaces.LocalRunspace


# ■ 参考
**● Microsoft 技術ドキュメント(docs.microsoft.com)**
・[Windows での OpenSSH](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_overview)
・[Windows での OpenSSH: OpenSSH をインストールする](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse)
・[Windows 10 1809 および Server 2019 用 OpenSSH Server 構成](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration)
・[Windows での OpenSSH 用の既定のシェルの構成](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_server_configuration)
・[PowerShell を知る](https://docs.microsoft.com/ja-jp/powershell/scripting/learn/tutorials/01-discover-powershell?view=powershell-7.2)


**● Oracle Cloud Infrastructureドキュメント**
・[Windowsインスタンスへの接続](https://docs.oracle.com/ja-jp/iaas/Content/GSG/Tasks/testingconnectionWindows.htm)