Windows基礎

【Win2022】Servercoreの使い方と初期Setup ~OpenSSH+PowerShell~

サーバーコアとデスクトップエクスペリエンス

Windows Server はデスクトップ操作メインのデスクトップエクスペリエンスの他に、『サーバーコア』というインストール方法があります。

デスクトップエクスペリエンスはサーバにログインし、管理ツールを起動し、そこで操作するのがメインでしたが、GUI 向けの様々なコンポーネントを実装する必要がありました。

サーバーコアというインストール方法では、PowerShell での CLI 操作のみを提供しており、軽量化されています。

ですが GUI 管理ツールについては全く利用できなくなるわけではなく、PC に管理ツール (RSAT) をインストールし、そこで GUI 操作ができます。

本記事では Windows Server 2022 評価版にて Datacenter の Servercore インストールの手順および初期セットアップ手順を紹介します。

Servercore では操作のメインは PowerShell が想定されていますが、コピペができないとつらたんですので OpenSSH を使います。

Windows Server 2022 の Servercore インストール

デスクトップエクスペリエンスではないものを選択します (3スライド目)。余計なものがインストールされない分、インストール時間はきもち短くなります。

servercore-install-01
servercore-install-02
servercore-install-03
servercore-install-04
servercore-install-05
servercore-install-06
servercore-install-07
servercore-install-08
servercore-install-09
servercore-install-10
previous arrow
next arrow
servercore-install-01
servercore-install-02
servercore-install-03
servercore-install-04
servercore-install-05
servercore-install-06
servercore-install-07
servercore-install-08
servercore-install-09
servercore-install-10
previous arrow
next arrow

最後のページは 15 を指定していったん抜けますが、SConfig コマンドを打てば再び戻ってこれるので未練なく 15 で PowerShell へ移動しましょう。

OpenSSH のインストール

何はともあれ、コピペができないと PowerShell も捗りません。

サーバが DHCP で IP を取得できているなら、まずこの手順からやってしまいましょう。もし固定 IP 設定が必要なら先に次の「 固定 IP 設定」を実施してからこちらへ戻ってきてください。

OpenSSH のインストール状況確認
PS C:> Get-WindowsCapability -Online | Where-Object Name -like "OapenSSH*"
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

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

SSH クライアントはインストールされていますが SSH サーバは無いようです。

OpenSSH のインストール
PS C:> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
OpenSSH サービスの起動

Start-Service sshd コマンドにより SSH サーバが起動します。

PS C:> Start-Service sshd
OpenSSH サービスの自動起動

Set-Service コマンドにより、OS 再起動時にも SSH サービスが自動で起動されるように設定します。

PS C:> Set-Service -Name sshd -StartupType Automatic
起動状態や自動起動設定の確認
PS C:> Get-Service | where-object name -like "sshd*" | select-object *

Status が Running に、StartType が Automatic になっていれば OK です。

これで SSH 接続できるようになりました。TeraTerm 等のターミナルソフトからサーバの IP アドレスを指定して SSH 接続してみましょう。administrator/初期パスワードでログインできます。

なお、接続時は PowerShell ではなく cmd (コマンドプロンプト) が起動するようですので、> powershell コマンドにより cmd から PowerShell に移行しましょう。

固定 IP 設定

NIC の設定は以下のコマンドで出力できます。例えば私の VirtualBOX の環境では以下のように表示されます。

PS C:> Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress        LinkSpeed
----                      --------------------                    ------- ------       ----------        ---------
イーサネット              Intel(R) PRO/1000 MT Desktop Adapter          4 Up           08-00-27-9A-5C-00    1 Gbps

ifIndex が 4 となっていますので、これを利用して設定対象 NIC を指定し、パイプラインで New-NetIPAddress という設定コマンドに渡します。以下の例では IP アドレスを 192.168.0.201/24 に設定し、DGW を 192.168.0.1 に設定します。

PS C:> Get-NetAdapter -ifIndex 4 | New-NetIPAddress -AddressFamily IPv4 -IPAddress 192.168.0.201 -PrefixLength 24 -DefaultGateway 192.168.0.1

SSH 接続をしている場合はこの直後に繋がらなくなりますので、新しい IP を指定して繋ぎなおしましょう。

New- で始まるコマンドは設定を上書きしない傾向にあります。New-NetIPAddress も同一インタフェースに複数の IP アドレスを付与してしまうことがあります。その場合は Remove-NetIPAddress を使い、不要な設定を削除しましょう。

PS C:> Get-NetAdapter -ifIndex 4 | Remove-NetIPAddress -IPAddress 192.168.0.201 -PrefixLength 24 -DefaultGateway 192.168.0.1

 

IPv6 無効化

Servercore のせいなのか不明ですが、私の環境では IPv6 を使わないのに IPv6 を有効化にしていると DNS が情緒不安定になりました。ので無効化します。

まずは状態確認。ComponentId [ms_tcpip6] の列で、Enabled が True であれば IPv6 が有効になっています。

PS C:> Get-NetAdapterBinding

もし Enabled の項目が見切れていたら、以下のようにしましょう。

PS C:> Get-NetAdapterBinding | select-object ComponentId,Enabled

無効化するためには Enabled を False に設定します。IP 設定と同じように Get-NetAdapter により設定対象インタフェースをパイプラインにて Disable-NetAdapterBinding コマンドへ渡します。

PS C:> Get-NetAdapter -ifIndex 4 | Disable-NetAdapterBinding -ComponentID ms_tcpip6

これで再び Get-NetAdapterBinding を実行すると、IPv6 が無効化 (False) になっていることが分かります。

DNS 設定

DNS 設定は Set-DnsClientServerAddress コマンドを使います。

PS C:> Get-NetAdapter -ifIndex 4 | Set-DnsClientServerAddress -ServerAddress "1.1.1.1","8.8.8.8"

ここまでできたら ipconfig /all で状態を確認してみましょう。

Windows Update

まずは Windows Update をやりたいですよね。やりましょう。PowerShell には Microsoft が用意したコマンド以外にも、サードパーティのコマンドも「モジュール」という形で提供され、利用できます。(インストールする際の文字列には十分気を付けましょう。紛らわしい名前で悪意あるモジュールがインストールされないとも限りません。)

今回は NuGet という有名な Project のモジュールを使います。まずは NuGet プロバイダーレポジトリのインストールをします。

PS C:> Install-PackageProvider -Name NuGet -Force

-Force では同意を求めるフェーズをスキップします。

次に、この NuGet の中の PSGallery というリポジトリを「信頼するリポジトリ」として設定します。これにより以降のモジュールインストール時に「信頼していないけど本当に大丈夫かい?」という同意を求めるフェーズをスキップします。

PS C:> Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

次に Windows Update 関連のモジュール [PSWindowsUpdate] をインストールします。

PS C:> Install-Module PSWindowsUpdate

これでこのモジュールが使えるようになりました。どのようなコマンド群があるのかを一覧で見るには、Get-Command を使います。

PS C:> Get-Command -Module PSWindowsUpdate

それではインストールしてみましょう。なお、なぜか SSH 接続から以下コマンドを実行するとダウンロードのところでアクセス拒否のエラーとなってしまいますので、このコマンドだけはコンソールから実施しましょう。(情報求む。)

PS C:> Install-WindowsUpdate -AcceptAll -AutoReboot

上図の通り、23 GB のサイズのアップデートがあり、こりゃあディスク足りないかな、と不安になりましたが、どうやら 23GB の累積のうち、必要な分だけをダウンロードしてくれているようです。なので VirtualBOX のデフォルト 50GB で問題なくアップデート完了しました。

ディスク容量確認

ディスクというよりはファイルシステムですね。ファイルシステム関連は fsutil を使います。どんなボリュームがあるか見てみましょう。

PS C:> fsutil volume list
\\?\Volume{170ed434-b60e-40bb-8f61-8ad66a3e4e3f}\
C:\

\\?\Volume{166b58fa-f736-4de9-bdde-8a19c454503b}\

\\?\Volume{4e0dead2-ab2f-4d42-8e55-3f4dd19e484d}\

\\?\Volume{43d8cee4-4b3d-11ec-b4ee-806e6f6e6963}\
D:\

2 番目と 3 番目はおそらく回復領域でしょう。D ドライブが見えますが何でしょうか。

PS C:\> cd d:
PS D:\> dir

    ディレクトリ: D:\

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-r---        2021/08/07     10:17                boot
d-r---        2021/08/07     10:17                efi
d-r---        2021/08/07     10:17                sources
d-r---        2021/08/07     10:17                support
--r---        2021/08/07     10:15            128 autorun.inf
--r---        2021/08/07     10:15         435660 bootmgr
--r---        2021/08/07     10:15        1978704 bootmgr.efi
--r---        2021/08/07     10:15          94664 setup.exe

UEFI のブート領域でした。

では次に C ドライブのディスク容量を見てみましょう。diskfree オプションを使って、使用済みや総サイズなども確認できます。

PS C:> fsutil volume diskfree c:
合計空きバイト数                : 45,115,277,312 (42.0 GB)
合計バイト数                     : 52,936,306,688 (49.3 GB)
クオータの合計空きバイト数          : 45,115,277,312 (42.0 GB)
利用できないプール バイト数          :              0 ( 0.0 KB)
クオータの利用できないプール バイト数    :              0 ( 0.0 KB)
使用済みバイト数                      :  7,725,715,456 ( 7.2 GB)
合計予約済みバイト数            :     95,313,920 (90.9 MB)
ボリューム ストレージの予約済みバイト数   :              0 ( 0.0 KB)
利用可能なコミット済みバイト数       :              0 ( 0.0 KB)
プールの利用可能なバイト数            :              0 ( 0.0 KB)

Windows FW のプロファイル

Windows Defender FW は 3 つのプロファイル { Public , Private , Domain } があり、プロファイル毎にアクセス制御ルールを変更できます。一般に Public は (誰がアクセスするか分からない環境という位置付けのため) 厳しめ、Private は (社内ネットワーク等利用者が限定される想定のため) 緩め、Domain は ActiveDirectory 環境に適した設定となっています。

NIC にはプロファイルを適用することで、そのプロファイルに設定されたルールによりアクセス制御されるようになります。

NIC にどのプロファイルが適用されているかを見るには、Get-NetConnectionProfile コマンドを使います。プロファイルは [NetworkCategory] として表示されます。

PS C:> Get-NetConnectionProfile
Name             : ネットワーク
InterfaceAlias   : イーサネット
InterfaceIndex   : 4
NetworkCategory  : Public
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

NetworkCategory が Public になっていることが分かりました。これを Private に変えてみましょう。

PS C:> Get-NetConnectionProfile -interfaceindex 4 | Set-NetConnectionProfile -networkcategory private

これで Private に変更となりました。

Windows FW ルールの確認

Get-NetFirewallRule コマンドを使います。

PS C:> Get-NetFirewallRule

めっちゃ出てきたと思います。エントリ数も多ければ 1 エントリ当たりの属性数も多いですので。なお、属性はデフォルトでは全てが表示されるわけではありません。全ての属性を表示するにはパイプラインで | select-object * と渡します。

where-object を使ってエントリを絞り、select-object * で全ての属性を表示してみましょう。Public だけに設定されたルールを抽出します。

PS C:> Get-NetFIrewallRule | where-object Profile -like Public | select-object *

ここで 3 つのエントリに絞られました。が、全ての属性を表示しているにも関わらず送信元アドレスやら送信元ポートの情報がありません。これは Object が階層構造になっているようです。出力結果 (出力オブジェクト) を Get-NetFirewallPortFilter へ渡すことでエントリにどのようなアドレス/ポートで制限が掛かっているかを見ることができます。

PS C:> Get-Netfirewallrule | where-object Profile -like public | Get-Netfirewallportfilter

Protocol      : UDP
LocalPort     : Any
RemotePort    : 5353
IcmpType      : Any
DynamicTarget : Any

Protocol      : UDP
LocalPort     : 5353
RemotePort    : Any
IcmpType      : Any
DynamicTarget : Any

Protocol      : TCP
LocalPort     : 5985
RemotePort    : Any
IcmpType      : Any
DynamicTarget : Any

Windows FW ルールの設定変更

ところで、OpenSSH をインストール時に、22 番ポートを許可するルールが自動追加されているようです。どのルールか探してみましょう。22 番ポートを開けているので LocalPort -like 22 で検索します。

PS C:>  Get-Netfirewallrule | Get-Netfirewallportfilter | where-object LocalPort -like 22
Protocol      : TCP
LocalPort     : 22
RemotePort    : Any
IcmpType      : Any
DynamicTarget : Any

これだけだとどのルールか分かりません。InstanceID を見てみましょう。

PS C:>  Get-Netfirewallrule | Get-Netfirewallportfilter | where-object LocalPort -like 22 | select-object instanceID

instanceID
----------
OpenSSH-Server-In-TCP

では送信元アドレス帯 (RemoteAddress) は制限は掛かっているでしょうか?Get-NetFirewallAddressFilter コマンドで調べてみましょう。

PS C:> Get-Netfirewallrule | Get-NetFirewallAddressFilter | where-object instanceid -like OpenSSH-Server-In-TCP

LocalAddress  : Any
RemoteAddress : Any

掛かってません。Any です。これは大問題です。接続元を適切なアドレス帯に制限しましょう。

PS C:> Get-Netfirewallrule | where-object instanceid -like OpenSSH-Server-In-TCP | Set-NetFirewallRule -RemoteAddress 192.168.0.0/24

これで改めて確認すると RemoteAddress が 192.168.0.0/255.255.255.0 となっていることが確認できるでしょう。

コメント

タイトルとURLをコピーしました