2019年6月12日水曜日

Windows Server 2019で標準サポートされた「OpenSSH」がすごく便利そうだった話

Windows Server 2019およびWindows 10 1809になってから、OpenSSHが標準でサポートされるようになった。

これによってWindows Serverに対してSSHでリモートから接続し、CLIによる操作や管理ができるようになる。サーバ構築作業が効率化できそうなので、非常に便利そうな機能追加であると感じた。

しかし、本当にSSH接続でWindows Serverをコマンド操作でできるか不安もあるので、実際にWindows Server 2019をインストールして、OpenSSHの機能を有効にしてみることにした。

SSHクライアントの設定

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]
なお、SSHクライアントのインストール状況は、「Windowsの設定」→「アプリと機能」→「オプション機能の管理」から「OpenSSHクライアント」の項目を見ることで確認できる。


SSHサーバの設定

SSHサーバはデフォルトでは有効になっていないので、「Windowsの設定」→「アプリと機能」→「オプション機能の管理」から「OpenSSHサーバー」をインストールする。


インストール完了すると、サービスの画面に「OpenSSH SSH Server」というサービスが登録される。


ただし、OpenSSH SSH Serverは自動で起動しないため、サービスを「開始」し、必要に応じて「スタートアップの種類」を自動起動する設定に変更しておこう。


サービス開始後にサーバの待ち受けポートを確認してみる。以下の通り、SSHで使用する22番ポートで待ち受けしていることが確認できる。
PS C:\> netstat -nao | findstr :22
  TCP         0.0.0.0:22             0.0.0.0:0              LISTENING       2316
  TCP         [::]:22                [::]:0                 LISTENING       2316
Windowsファイアウォールも、SSHサーバインストール時に受信のルールを追加してくれるため、特別に設定は不要となる。


Windows Server 2019にSSH接続してみる

まずは、Windows Server 2019にインストールされているSSHクライアントを使って自分自身に接続してみると、問題なく接続できた。
PS C:\> ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:dP/b/2J+X/u8z6LLN4iU7zRYgpP7RhKBxl8SfdplwD8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
intrat\tadmin@localhost's password:
Microsoft Windows [Version 10.0.17763.253]
(c) 2018 Microsoft Corporation. All rights reserved.

intrat\tadmin@T1082W219 C:\Users\tadmin>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 8A39-0094 です

 C:\Users\tadmin のディレクトリ

2019/06/05  14:49    <DIR>          .
2019/06/05  14:49    <DIR>          ..
2019/05/23  15:31    <DIR>          .cisco
2019/06/05  14:49    <DIR>          .ssh
2019/05/04  16:41    <DIR>          3D Objects
2019/05/04  16:41    <DIR>          Contacts
2019/06/05  14:47    <DIR>          Desktop
2019/05/12  06:30    <DIR>          Documents
2019/05/05  08:40    <DIR>          Downloads
2019/05/04  16:41    <DIR>          Favorites
2019/05/04  16:41    <DIR>          Links
2019/05/04  16:41    <DIR>          Music
2019/05/19  14:52    <DIR>          Pictures
2019/05/04  16:41    <DIR>          Saved Games
2019/05/04  16:41    <DIR>          Searches
2019/05/04  16:41    <DIR>          Videos
               0 個のファイル                   0 バイト
              16 個のディレクトリ  27,887,628,288 バイトの空き領域

intrat\tadmin@T1082W219 C:\Users\tadmin>exit
Connection to localhost closed.
Tera Termからでも同様にSSH接続できた。Tera Term上で出力するコマンドプロンプトの画面は新鮮に感じる。


SSH接続後にPowerShellを実行

コマンドプロンプトからpowershellコマンドを打つと、問題なくPowerShellを実行できることも確認できた。これは、Windows Serverのほぼすべての設定作業がTera TermなどのSSHクライアントソフトを使ってできるということと同義となる。Tera Termであればログ取得を行いながら作業ができたりするので、これは非常に便利ではなかろうか。。。
intrat\tadmin@T1082W219 C:\Users\tadmin>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\tadmin> Get-ComputerInfo

WindowsBuildLabEx                                       : 17763.1.amd64fre.rs5_release.180914-1434
WindowsCurrentVersion                                   : 6.3
WindowsEditionId                                        : ServerStandardEval
WindowsInstallationType                                 : Server
WindowsInstallDateFromRegistry                          : 2019/05/03 22:30:57
WindowsProductId                                        : 00431-10000-00000-AA047
WindowsProductName                                      : Windows Server 2019 Standard Evaluation

~(以下略)~

SSH接続時のログオン・ログオフのログを確認

最後に念のため、SSH接続時のログオン・ログオフの情報が出力されるかを確認してみる。

イベントビューアーからセキュリティイベントログを確認してみると、以下の通り、ログオン・ログオフのログが出力されていることが確認できた。ログオン時は、プロセス名:C:\Windows\System32\OpenSSH\sshd.exeと出力されるのでSSH接続されたことがわかるのだが、ログオフ時は特にSSHというログが出力されないため、ログオン タイプ:8から判断する必要がありそうだ。

ログオン時のセキュリティイベントログ

アカウントが正常にログオンしました。

サブジェクト:
 セキュリティ ID:  SYSTEM
 アカウント名:  T1082W219$
 アカウント ドメイン:  INTRAT
 ログオン ID:  0x3E7

ログオン情報:
 ログオン タイプ:  8
 制限付き管理モード: -
 仮想アカウント:  いいえ
 昇格されたトークン:  はい

偽装レベル:  偽装

新しいログオン:
 セキュリティ ID:  INTRAT\tadmin
 アカウント名:  tadmin
 アカウント ドメイン:  INTRAT
 ログオン ID:  0xC8547A8
 リンクされたログオン ID:  0x0
 ネットワーク アカウント名: -
 ネットワーク アカウント ドメイン: -
 ログオン GUID:  {f0653b97-46be-db5c-a76b-a6e54f340f33}

プロセス情報:
 プロセス ID:  0x6b0
 プロセス名:  C:\Windows\System32\OpenSSH\sshd.exe

~(以下略)~

ログオフ時のセキュリティイベントログ

アカウントがログオフしました。

サブジェクト:
 セキュリティ ID:  INTRAT\tadmin
 アカウント名:  tadmin
 アカウント ドメイン:  INTRAT
 ログオン ID:  0xE75A8D2

ログオン タイプ:   8

このイベントは、ログオン セッションが破棄された場合に生成されます。これは、ログオン ID の値を使用して、ログオン イベントに関連付けられる場合があります。ログオン ID は、同一コンピューターが次に再起動するまでの間のみ一意です。
2019年5月22日水曜日

Windows Server 2019のペイントでpngやjpgが保存できない問題

(2019/6/7 追記)
Windows Updateしても上記事象が再発してしまった。原因不明。

小ネタとなる。
Windows Server 2019のペイントを使って画像を保存しようとすると、以下エラーによって保存できない事象が発生した。
このファイルは保存できません
保存が中断されたので、ファイルは保存されませんでした。

いろいろ調べたが原因は不明だった。

しかし、ダメもとでWindows Updateして、再起動すると事象は解消した。リリースノートをざっと見たが書いていないのでどのパッチで解消したかは不明だが、もし同様の事象が発生して悩んでいる方がいる場合は、Windows UpdateでOSを最新化してみよう。

2019年5月8日水曜日

グループポリシーでビルトインAdministratorを無効化する

Windows OSではAdministratorの管理者アカウントがデフォルトで作成される仕様となっているが、セキュリティ観点から考えると、誰もが名前を知っているアカウントが管理者権限を持っているということは非常に脆弱であり、アカウントの乗っ取り等が発生した際の影響が大きくなる。
そこでよくあるセキュリティ対策の方法としては、大きく2つある。
  • 管理者アカウントの名前を変える
  • 無効にして別の管理者アカウントを作る
セキュリティ対策として有効かつシステム影響が少ないのは、後者の管理者アカウントを無効にする方法となる。なぜ後者が有効であるかは、Microsoft社の「管理者アカウント セキュリティ計画ガイド」の記載がわかりやすいので引用しておく。
既定の Administrator アカウントの名前を変更しても、ある種の攻撃しか防ぐことはできません。 攻撃者の側から、どのアカウントが既定の Administrator アカウントかを特定することは比較的簡単です。というのも、このアカウントのセキュリティ ID は常に同じものになるからです。 また、グループのメンバを列挙するツールが一般に出回っており、このツールを使用すると、元の Administrator アカウントが常に先頭に表示されます。 ビルトイン Administrator アカウントへの攻撃に対する最善の防御策は、新しい管理者アカウントを作成し、ビルトイン アカウントは無効にすることです。
ビルトインAdministratorはActive Directoryのメンバーサーバであっても引き続き利用できてしまう。そこで今回は、Active Directoryのメンバーサーバに対して、ビルトインAdministratorをグループポリシーで一括で無効化する方法を記載する。

グループポリシーでビルトインAdministratorを無効化する

「グループポリシー管理エディター」を使って以下の通り対応する。今回は「Default Domain Policy」に対して設定し、所属する全メンバーサーバのビルトインAdministratorを無効化する。

1. グループポリシー管理エディターで設定項目を選択

「コンピューターの構成」→「基本設定」→「コントロールパネルの設定」→「ローカルユーザーとグループ」を選択する。


2. ポリシーを新規作成

右クリックし、「新規作成」→「ユーザー」を選択する。



ダイアログボックスが表示されるので以下を選択する。
  • ユーザー名 : Administrator (ビルトイン)
  • アカウントを無効にする : チェック


3. グループポリシーを適用

グループポリシーを適用するため、任意のメンバーサーバにてコマンドプロンプトを開き、gpupdate.exeを実行する。



4. 適用後の確認

メンバーサーバにて、「コンピュータの管理」→「ローカルユーザーとグループ」→「ユーザー」を確認すると、ビルトインAdministratorが無効化されたことが確認できる(名前のアイコンに下矢印が表示されている)。

<グループポリシー適用前>


<グループポリシー適用後>

2019年4月10日水曜日

VyOSでDNSキャッシュサーバを構築する

DNSフォワーディングをするだけのDNSキャッシュサーバを作るのであれば、VyOSで簡単にできるよ、という話。

DNSフォワーディング設定方法

まず、現在の設定を確認してみる。設定前なので、「not configured」と表示される。
vyos:~$ show dns forwarding statistics
DNS forwarding not configured
DNSフォワーディングの設定を実施してみよう。1.1.1.18.8.8.8を上位のDNSサーバとしてフォワーディングする設定となる。
vyos# set service dns forwarding listen-on eth1
vyos# set service dns forwarding name-server 1.1.1.1
vyos# set service dns forwarding name-server 8.8.8.8
vyos@t3033vyos# compare
+dns {
+    forwarding {
+        cache-size 150
+        listen-on eth1
+        name-server 1.1.1.1
+        name-server 8.8.8.8
+    }
+}
vyos# commit
vyos# save
Saving configuration to '/config/config.boot'...
Done
listen-onで問い合わせを受け付けるインタフェースを指定し、name-serverでフォワーディングする上位のDNSサーバーを指定する。cache-sizeはデフォルトで150となっている(単位は「個」)。0に設定すれば、キャッシュがされないため、必ずDNS問い合わせはフォワーディングされる動作となる。

ちなみに、以下のように設定も可能な模様。VyOSサーバーのOS自体のDNSサーバー設定を行い、そちらをフォワーディング先とする設定となる。
vyos# set system name-server 1.1.1.1
vyos# set system name-server 8.8.8.8
vyos# set service dns forwarding listen-on eth1
vyos# set service dns forwarding system

DNSフォワーディング状況確認方法

設定後のDNS問い合わせ状況を確認するコマンドを以下に記載する。
vyos:~$ show dns forwarding statistics
----------------
Cache statistics
----------------
Cache size: 150
Queries forwarded: 15
Queries answered locally: 5
Total DNS entries inserted into cache: 22
DNS entries removed from cache before expiry: 0

---------------------
Nameserver statistics
---------------------
Server: 8.8.8.8
Queries sent: 12
Queries retried or failed: 0

Server: 1.1.1.1
Queries sent: 11
Queries retried or failed: 0
Queries forwardedが上位DNSに問い合わせをした回数となり、Queries answered locallyがキャッシュにて問い合わせを返すことができた回数となる。
2019年3月20日水曜日

ZabbixのDBの中身のデータを直接SQLで取得する方法

Zabbixは取得したデータをグラフで出力させる機能は充実しているが、CSV等で一覧出力する機能があまり充実しておらず、必然的にスクリプトなどで作りこみを行うことになる。
今回、ZabbixのDBからCPU使用率やメモリ使用率といったパフォーマンスデータをスクリプトなどで自動エクスポートできるよう、DBの内容調査を行い、データ抽出のためのSQL文を作ってみることにした。

Zabbix環境

  • OS : CentOS
  • Zabbix : Zabbix 4.0
  • DB : MariaDB

ZabbixのDB構造を確認する

まずは、ZabbixのDBの後続を把握するため、存在するテーブルを確認し、個々のテーブルの中身を確認してみることにする。

DB内のテーブル一覧を確認

MariaDBにログインして、Zabbixのテーブル一覧を確認してみる。どうやらZabbix 4.0では、144個のテーブルが存在するようだ。
MariaDB [zabbix]> show tables;
+----------------------------+
| Tables_in_zabbix           |
+----------------------------+
| acknowledges               |
| actions                    |
| alerts                     |

~(中略)~

| valuemaps                  |
| widget                     |
| widget_field               |
+----------------------------+
144 rows in set (0.00 sec)

登録されているホスト一覧を確認

Zabbixに登録されているホストは「hosts」テーブルに存在する。テンプレートもホストとして登録されており、後半に実際の監視対象としてのホストが表示される。
MariaDB [zabbix]> select hostid, host from hosts;
+--------+-------------------------------------------------------------------------------+
| hostid | host                                                                          |
+--------+-------------------------------------------------------------------------------+
|  10168 | Template App Apache Tomcat JMX                                                |
|  10093 | Template App FTP Service                                                      |
|  10169 | Template App Generic Java JMX                                                 |

~(中略)~

|  10262 | t1081w219                                                                     |
|  10260 | t1082w216                                                                     |
|  10176 | {#HV.UUID}                                                                    |
|  10177 | {#VM.UUID}                                                                    |
+--------+-------------------------------------------------------------------------------+
今回はホスト名「t1081w219」(hostid=10262)を対象に確認を進めることにする。

アイテム一覧を確認

アイテムは「items」テーブルに登録されている。アイテムは一覧取得すると大量に出力されるため、とりあえず存在するカラムを確認しておく。
MariaDB [zabbix]> show columns from items;
+-----------------------+---------------------+------+-----+---------+-------+
| Field                 | Type                | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------+-------+
| itemid                | bigint(20) unsigned | NO   | PRI | NULL    |       |
| type                  | int(11)             | NO   |     | 0       |       |
| snmp_community        | varchar(64)         | NO   |     |         |       |
| snmp_oid              | varchar(512)        | NO   |     |         |       |
| hostid                | bigint(20) unsigned | NO   | MUL | NULL    |       |

~(中略)~

| verify_peer           | int(11)             | NO   |     | 0       |       |
| verify_host           | int(11)             | NO   |     | 0       |       |
| allow_traps           | int(11)             | NO   |     | 0       |       |
+-----------------------+---------------------+------+-----+---------+-------+
63 rows in set (0.00 sec)
ホスト名「t1081w219」のアイテム一覧を確認する。
MariaDB [zabbix]> select itemid, hostid, name,key_ from items where hostid='10262';
+--------+--------+------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| itemid | hostid | name                               | key_                                                                                                                                      |
+--------+--------+------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
|  28658 |  10262 | Host name of zabbix_agentd running | agent.hostname                                                                                                                            |
|  28659 |  10262 | Agent ping                         | agent.ping                                                                                                                                |
|  28660 |  10262 | Version of zabbix_agent(d) running | agent.version                                                                                                                             |

~(中略)~

|  28671 |  10262 | Processor load (15 min average)    | system.cpu.load[percpu,avg15]                                                                                                             |
|  28672 |  10262 | Processor load (1 min average)     | system.cpu.load[percpu,avg1]                                                                                                              |
|  28673 |  10262 | Processor load (5 min average)     | system.cpu.load[percpu,avg5]                                                                                                              |
|  28674 |  10262 | Free swap space                    | system.swap.size[,free]                                                                                                                   |
|  28675 |  10262 | Total swap space                   | system.swap.size[,total]                                                                                                                  |
|  28676 |  10262 | System information                 | system.uname                                                                                                                              |
|  28677 |  10262 | System uptime                      | system.uptime                                                                                                                             |
|  28657 |  10262 | Mounted filesystem discovery       | vfs.fs.discovery                                                                                                                          |
|  28741 |  10262 | Free disk space on $1              | vfs.fs.size[C:,free]                                                                                                                      |
|  28742 |  10262 | Free disk space on $1 (percentage) | vfs.fs.size[C:,pfree]                                                                                                                     |
|  28743 |  10262 | Total disk space on $1             | vfs.fs.size[C:,total]                                                                                                                     |
|  28744 |  10262 | Used disk space on $1              | vfs.fs.size[C:,used]                                                                                                                      |
|  28683 |  10262 | Free disk space on $1              | vfs.fs.size[{#FSNAME},free]                                                                                                               |
|  28684 |  10262 | Free disk space on $1 (percentage) | vfs.fs.size[{#FSNAME},pfree]                                                                                                              |
|  28685 |  10262 | Total disk space on $1             | vfs.fs.size[{#FSNAME},total]                                                                                                              |
|  28686 |  10262 | Used disk space on $1              | vfs.fs.size[{#FSNAME},used]                                                                                                               |
|  28678 |  10262 | Free memory                        | vm.memory.size[free]                                                                                                                      |
|  28679 |  10262 | Total memory                       | vm.memory.size[total]                                                                                                                     |
|  28680 |  10262 | Free virtual memory, in %          | vm.vmemory.size[pavailable]                                                                                                               |
+--------+--------+------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
89 rows in set (0.00 sec)
今回は、「Processor load (5 min average)」(itemid=28673)を取得するSQL文を作成していくことにする。

ヒストリを確認

各ホストのパフォーマンスデータは「history」テーブルに保存されている。このテーブルのカラムはシンプルに4つとなっている。
MariaDB [zabbix]> show columns from history;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| itemid | bigint(20) unsigned | NO   | MUL | NULL    |       |
| clock  | int(11)             | NO   |     | 0       |       |
| value  | double(16,4)        | NO   |     | 0.0000  |       |
| ns     | int(11)             | NO   |     | 0       |       |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

特定の日付のパフォーマンスデータを出力する

ひねりのないSQL文

DBのテーブル構成の確認ができたので、historyテーブルから以下内容のパフォーマンスデータをひねりのない単純なSQL文で出力してみる。
  • 取得対象アイテム : Processor load (5 min average) (itemid=28673)
  • 取得開始日時 : 2018-10-08 00:00:00
  • 取得終了日時 : 2018-10-09 00:00:00
以下結果では、出力が21:49からになっているが、これは対象ホストのデータ取得開始が21:49からだっただけで、データが存在すれば00:00からのデータが取得される。
MariaDB [zabbix]> select from_unixtime(clock), value from history where itemid='28673' and from_unixtime(clock) between '2018-10-08 00:00:00' and '2018-10-09 00:00:00';
+----------------------+--------+
| from_unixtime(clock) | value  |
+----------------------+--------+
| 2018-10-08 21:49:53  | 0.0093 |
| 2018-10-08 21:50:53  | 0.0111 |
| 2018-10-08 21:51:53  | 0.0100 |
| 2018-10-08 21:52:53  | 0.0128 |
| 2018-10-08 21:53:53  | 0.0128 |
| 2018-10-08 21:54:53  | 0.0122 |
| 2018-10-08 21:55:53  | 0.0144 |
| 2018-10-08 21:56:53  | 0.0128 |
| 2018-10-08 21:57:53  | 0.0100 |

~(中略)~

| 2018-10-08 23:55:53  | 0.0000 |
| 2018-10-08 23:56:53  | 0.0000 |
| 2018-10-08 23:57:53  | 0.0000 |
| 2018-10-08 23:58:53  | 0.0000 |
| 2018-10-08 23:59:53  | 0.0000 |
+----------------------+--------+
111 rows in set (0.00 sec)

テーブルを結合して出力するSQL文

「ひねりのないSQL文」では、事前にhostidやitemidを調べておく必要があり、実用的ではない。そこで、INNER JOIN句を使いテーブルを内部結合することで、hostidやitemidを調べることなく「ホスト名」や「アイテム名」そのものを条件としてデータ出力できるようにしてみた。
MariaDB [zabbix]> select from_unixtime(history.clock), hosts.host, items.name, history.value from history
    ->  inner join items using( itemid )
    ->  inner join hosts using( hostid )
    ->  where hosts.host='t1081w219' and items.name='Processor load (5 min average)' and from_unixtime(clock) between '2019-01-02 00:00:00' and '2019-01-03 00:00:00';
+------------------------------+-----------+--------------------------------+--------+
| from_unixtime(history.clock) | host      | name                           | value  |
+------------------------------+-----------+--------------------------------+--------+
| 2018-10-08 21:49:53          | t1081w219 | Processor load (5 min average) | 0.0093 |
| 2018-10-08 21:50:53          | t1081w219 | Processor load (5 min average) | 0.0111 |
| 2018-10-08 21:51:53          | t1081w219 | Processor load (5 min average) | 0.0100 |

~(中略)~

| 2018-10-08 23:57:53          | t1081w219 | Processor load (5 min average) | 0.0000 |
| 2018-10-08 23:58:53          | t1081w219 | Processor load (5 min average) | 0.0000 |
| 2018-10-08 23:59:53          | t1081w219 | Processor load (5 min average) | 0.0000 |
+------------------------------+-----------+--------------------------------+--------+
111 rows in set (0.00 sec)
上記の通り、「ひねりのないSQL文」と同一結果が出力できた。

CSVで出力する

最後に出力したデータをCSVでファイル出力する。INTO OUTFILE句にて出力ファイル名を指定し、「,」区切り指定をすればよい。
MariaDB [zabbix]> select from_unixtime(history.clock), hosts.host, items.name, history.value from history
    ->  inner join items using( itemid )
    ->  inner join hosts using( hostid )
    ->  where hosts.host='Zabbix server' and items.name='CPU user time' and from_unixtime(clock) between '2019-01-02 00:00:00' and '2019-01-03 00:00:00'
    ->  into outfile 'zabbix_history_data.csv' fields terminated by ',';
ファイルの出力先は以下となる。
# ls -l /var/lib/mysql/zabbix/ | grep csv
-rw-rw-rw- 1 mysql mysql 79200  1月  6 15:04 zabbix_history_data.csv

人気の投稿