Grow up

生活とプログラミング

OpenSSH 9.8p1 にアップグレードする方法 (CVE-2024-6387)


概要

NVD - CVE-2024-6387 対策のためOpenSSHを9.8p1にアップグレードします。

OSは Ubuntu24.04 です。

t.co

バージョンの確認
$ssh -V
OpenSSH_8.9p1 Ubuntu-3ubuntu0.10, OpenSSL 3.0.2 15 Mar 2022
パッケージリストの更新
$apt-get install aptitude
aputitudeのインストール
$apt-get install aptitude
必要なパッケージのインストール
$aptitude install build-essential zlib1g-dev libssl-dev libpam0g-dev libselinux1-dev libkrb5-dev
ディレクトリ作成と設定
$mkdir /var/lib/sshd && sudo chmod -R 700 /var/lib/sshd/ && sudo chown -R root:sys /var/lib/sshd/
ソースのダウンロードと展開
$cd /usr/local/src/
$wget https://repo.jing.rocks/pub/OpenBSD/OpenSSH/portable/openssh-9.8p1.tar.gz

HTTPディレクトリはOpenSSH公式ページにて確認できます。
www.openssh.com

ソース展開
$tar -zxvf openssh-9.8p1.tar.gz
ディレクトリ移動
$cd openssh-9.8p1/
||

*** OpenSSL の位置を確認
>|sh|
$which openssl
/usr/bin/openssl
結果確認
$/usr/bin/openssl
configure
# --with-ssl-dir=/usrは、opensslがあるディレクトリのヘッダを指定 (参考 Qiita より原文のまま引用)
$./configure --with-kerberos5 --with-md5-passwords --with-pam --with-selinux --with-privsep-path=/var/lib/sshd/ --sysconfdir=/etc/ssh --with-ssl-dir=/usr
make
$make install
再起動
$shutdown -r now
バージョンアップされていることを確認
$ssh -V
OpenSSH_9.8p1, OpenSSL 3.0.2 15 Mar 2022

オンプレミスのログをAWS CloudWatchから監視する方法


概要

サーバーのログを監視しなければいけない時に AWS CloudWatch のダッシュボードを思い浮かべるのですが、これがAWSのサービスではなくても利用できるとのことなので実際に設定してみました。

前提条件

今回、以下の条件を達成した状態で開始しています。

1. AWS アカウントを取得している
2. 監視対象のサーバーがインターネットに接続している

監視対象となるサーバーは Ubuntu24.04 です。

1. IAM ユーザーの作成

CloudWatch にアクセス可能なIAMユーザーを作成します。

ユーザーの作成からIAMユーザーを作成します。

ユーザー名を入力して次へ。

ポリシーを直接アタッチする、から許可するポリシーで CloudWatchAgentServerPolicy をチェックします。

ユーザーの作成でIAMユーザーが作成されます。

IAMユーザーの一覧から作成したユーザーを選択します。
アクセスキーを作成、からIAMユーザーの認証情報を作成します。

AWSの外部で実行されるアプリケーションを選択して次へ。

説明タグを入力して、アクセスキーを作成します。

アクセスキーの認証情報は作成時の一度しか入手できないため注意して下さい。
.csv ファイルをダウンロード、にて認証情報をローカルフォルダに保存します。

2. CloudWatch エージェントのインストール

サーバーのログを監視してCloudWatchにログをアップロードできるようにします。

wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb

dpkg -i ./amazon-cloudwatch-agent.deb

wgetに指定するダウンロードリンクはOSによって異なるため、詳細はAWS公式ユーザーガイドを参考にしてください。
docs.aws.amazon.com

3. IAM ユーザー認証情報の設定

作成したIAMユーザーのアクセスキーとシークレットアクセスキーをサーバーに設定します。

vi ~/.aws/credentials

はIAMユーザーの認証情報に置き換えてください。
今回、監視対象のサーバーが国内にあるためリージョンは ap-northeast-1 としています。

[AmazonCloudWatchAgent]
aws_access_key_id = <my_access_key>
aws_secret_access_key = <my_secret_key>
region = ap-northeast-1
4. CloudWatch エージェントへ IAM ユーザー認証情報の設定

サーバーに設定した認証情報をCloudWatchエージェントから使用できるように設定します。

vi /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml

絶対パスに置き換えてください。
ここでは先程IAMユーザー認証情報を入力していた credentials を指定しています。

# [credentials]
    shared_credential_profile = "AmazonCloudWatchAgent"
    shared_credential_file = "<home>/.aws/credentials"
5. CloudWatch エージェントの設定

今回はCPU使用率などサーバーの syslog を CloudWatch から監視できるように設定します。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

設定内容の詳細はAWS公式ユーザーガイドを参照してください。
docs.aws.amazon.com

以下は抜粋した今回の設定内容です。

設定内容

===============================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
=                                                              =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send thbaem to CloudWatch. Additional CloudWatch =
= charges may apply.                                           =
================================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1

Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesAre you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
2

Which user are you planning to run the agent?
1. cwagent
2. root
3. others
default choice: [1]:
2

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
1

Which port do you want StatsD daemon to listen to?
default choice: [8125]

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:

What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:

Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:

Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:

Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:

Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [2]:

Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:

Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:

Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:

Log file path:
/var/log/syslog
Log group name:
default choice: [syslog]

Log group class:
1. STANDARD
2. INFREQUENT_ACCESS
default choice: [1]:

Log stream name:
default choice: [{instance_id}]
i-090793e6b5cefd72c
Log Group Retention in days
1. -1
2. 1
3. 3
4. 5
5. 7
6. 14
7. 30
8. 60
9. 90
10. 120
11. 150
12. 180
13. 365
14. 400
15. 545
16. 731
17. 1096
18. 1827
19. 2192
20. 2557
21. 2922
22. 3288
23. 3653
default choice: [16]:

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2

Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
default choice: [1]:
2

Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:

What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]

Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesWhich region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]

Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXXXXXX(From SDK)
2. Other
default choice: [1]:

Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.


6. collectd のインストール
apt-get install collectd
7. CloudWatch エージェントの実行

config.json のパスを指定して CloudWatch エージェントを実行します。

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

エラーが発生する場合はログを参照してください。

cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

Visual Studio 2022 Installer Projects と AutoUpdater.NET を使ってネットワーク経由でアップデートする方法


概要

前回は Installer Projects でアップデートを行うインストーラーを作成しました。
knkomko.hatenablog.com

今回は AutoUpdater.NET を使ったアップデート方法を確認します。
またインストーラーの保存場所として共有フォルダを使用します。

github.com
www.nuget.org

1. NuGet パッケージの追加

AutoUpdater.NET.Official をインストールします。

2. アップデート開始のコードを追加

AutoUpdater を使用したコードを追加します。
Start メソッドを呼び出すとアップデート用の画面が表示されます。

using System;
using System.Windows.Forms;

using AutoUpdaterDotNET;

namespace AutoUpdaterTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AutoUpdater.Mandatory = true;
            AutoUpdater.UpdateMode = Mode.Forced;

            AutoUpdater.Start("\\\\172.24.110.60\\Public\\autoupdate.xml");
        }
    }
}
3. アップデートを行うインストーラーの作成

詳細は概要にも記載している前回の記事を参考にしてください。
knkomko.hatenablog.com

4. WebView2Loader.dll の追加

リビルドするとCPUアーキテクチャごとに WebView2Loader.dll が作成されます。
すべての WebView2Loader.dll を Setup プロジェクトに追加します。


5. インストーラーの配置

共有フォルダに Setup プロジェクトで作成した msi ファイルを保存します。
また autoupdate.xml, rerease_notes.htm のファイルを新規作成して保存します。

autoupdate.xml の version, url, changelog は実行環境に合わせて変更を行います。

・autoupdate.xml

<?xml version="1.0" encoding="UTF-8"?>
<item>
<title>サンプルプログラム 自動更新プログラム</title>
<version>1.0.0.1</version>
<url>//172.24.110.60/Public/Setup2.msi</url>
<changelog>//172.24.110.60/Public/rerease_notes.htm</changelog>
</item>

・rerease_note.htm

Sample 1.0.0.0 -> 1.0.0.1<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
<br>
6. 確認

① Setup1 インストール後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所


② ソフトウェアの起動後
 起動後 AutoUpdater.Start を実行するとアップデート用の画面が表示されます。

 アップデート用の画面の Update ボタンを押下すると Setup2 が起動しました。

③ ソフトウェアの Update 後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所

  1.0.0.0 で使用していた WebView2Loader.dll が削除されずに残っていました。

7. その他

SetupプロジェクトにWebView2Loader.dllが含まれていないとAutoUpdater.Start実行時に例外が発生します。

Visual Studio 2022 Installer Projects でソフトウェアをアップデートする方法


概要

ソフトウェアのバージョンをアップデートするインストーラーを作成します。

インストーラーの作成手順は以下の記事を参考にしてください。
knkomko.hatenablog.com

1. インストーラーの作成

今回は設定内容を確認するため Setup プロジェクトを2つ作成しました。

それぞれの Setup には異なるバージョンのソフトウェアを保存しています。
Setup1 ▶ 1.0.0.0
Setup2 ▶ 1.0.0.1

異なる Setup プロジェクトでアップデートの確認を行うため Setup1 と Setup2 の UpgradeCode は同じ値に書き換えています。

2. Version の変更

Setup2 の Version を変更します。

Version を変更する際に ProductCode の変更を確認されるので変更します。

3. RemovePreviousVersions の変更

今回は 1.0.0.1 をインストールした後 1.0.0.0 はアンインストールされた状態にしたいため RemovePreviousVersions を True に変更します。

3. 確認

① Setup1 インストール後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所


② Setup2 インストール後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所

4. その他

RemovePreviousVersions が False の場合の動作になります。
デスクトップショートカットをダブルクリックすると 1.0.0.1 が起動しますが、コントロールパネルや保存場所を確認すると 1.0.0.0 は存在したままとなります。

 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所

Windows Server のパフォーマンスログを定期的に保存する

概要

Microsoft SQL Server Support Blog のパフォーマンスログ採取手順を参考に、タスクスケジューラーを使ってデータベースを利用する時間帯だけログを保存するよう設定します。

techcommunity.microsoft.com

今回、ログの採取は以下の時間帯で行います。
・8:00 - 12:00

同じ設定で365日ログを採取する場合は約100GBの保存容量が必要です。

1. パフォーマンスモニターに採集対象のカウンタを追加

Microsoft SQL Server Support Blog よりダウンロードした PerfCollector_v1.0 の create.bat を実行します。

実行前

実行後

create.bat を実行すると、ユーザー定義に mytest という採集対象のカウンタが追加されました。

2. パフォーマンスログの採集を任意のタイミングで行う

手動で確認ができるように採集の開始と停止を行うbatファイルを作成します。

開始

# StartPerfCollect.bat
logman start mytest

停止

# StopPerfCollect.bat
logman stop mytest

確認のため StartPerfCollect.bat を実行すると、パフォーマンスモニターの mytest が実行中となります。

また実行中の状態になると、ログファイルが .blg の形式で保存されることを確認できます。
実行中はログのファイルサイズが 0 KB のままとなっています。

実行中の状態で StopPerfCollect.bat を実行すると、パフォーマンスモニターの mytest が停止します。

停止するとログの書き込みが行われたことでファイルサイズの増加が確認できました。

.blg のファイルをダブルクリックするとパフォーマンスモニターが起動してログを確認できました。

3. パフォーマンスログの採集を定期的に行う

タスクスケジューラを使用して特定の時間帯にログを採集します。
タスクの作成より、StartPerfCollect.bat と StopPerfCollect.bat を実行するタスクをぞれぞれ作成します。

開始
最上位の特権で実行するにチェックを入れます。

今回は毎日8:00に採集を開始します。

開始のため StartPerfCollect.bat を実行します。

停止
最上位の特権で実行するにチェックを入れます。

今回は毎日12:00に採集を停止します。

停止のため StopPerfCollect.bat を実行します。

タスクスケジューラに採集の開始と停止のタスクを作成したことでパフォーマンスログを定期的に保存できるようになりました。

EC2に配置したWebサイトをELBと無料のSSL証明書を使ってHTTPSで公開する


はじめに

EC2でHTTPS通信を行う手順をいつも調べてしまうため簡単にまとめます。
今回の前提条件として無料のSSL証明書ドメインは取得済みとなります。

1. VPC

VPCを作成します。

2. サブネット

後のALBを利用してHTTPS通信を行う設定でサブネットが2つ必要となるため事前に作成します。

2. インターネットゲートウェイ

インターネットゲートウェイを作成します。
作成したインターネットゲートウェイを先ほど作成したVPCにアタッチします。

3. ルートテーブル

ルートのターゲットは先ほど作成したインターネットゲートウェイを指定します。

4. サブネットの関連付け

サブネットの関連付けを行います。
先ほど作成した2つのサブネットを登録します。

5. EC2

EC2のインスタンスを作成します。

注意:インターネットゲートウェイやルートテーブルが設定できていないとSSHやRDPを使ったEC2への接続ができず、EC2にElastic IPの関連付けもできません。

6. ロードバランサ―

ACMから取得したSSL証明書とALBを利用してEC2へHTTPS通信ができるように設定します。
ターゲットの種類はインスタンスを指定します。

サブネットは先ほど作成した2つの候補が出てくるので両方とも選択します。

セキュリティグループのインバンドルールはHTTPSとHTTPを指定します。

ターゲットグループには先ほど作成したEC2インスタンスを登録します。

リスナーとルーティングにはHTTPSとHTTPを指定します。

7. EC2のセキュリティグループ

EC2のセキュリティグループのインバウンドルールを編集します。
HTTPにロードバランサ―のセキュリティグループを指定するように変更します。

8. Route 53

ホストゾーンのAレコードにロードバランサ―を指定します。
エイリアスを有効にして先ほど作成したロードバランサ―を選択します。

9. 確認

EC2に配置したWebサイトがHTTPSで公開されていることを確認します。

その他

ロードバランサ―のリスナーからHTTPのルールを変更することでHTTPSにリダイレクトすることが出来ます。

WSL2 から Hyper-V にアクセスする


はじめに

WSL2で起動しているDockerコンテナからHyper-VUbuntuSSH接続をしたのですが、タイムアウトしてしまいました。

以下の記事を参考にしてWSL2からHyper-VSSH接続することができました。
zenn.dev

変更前の確認
PS C:\Users\User> Get-NetIPInterface | `
>>     Select-Object ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | `
>>     Sort-Object -Property IfIndex | `
>>     Format-Table

ifIndex InterfaceAlias               AddressFamily ConnectionState Forwarding
------- --------------               ------------- --------------- ----------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     17 vEthernet (Default Switch)            IPv6       Connected   Disabled
     17 vEthernet (Default Switch)            IPv4       Connected   Disabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    108 vEthernet (WSL)                       IPv6       Connected   Disabled
    108 vEthernet (WSL)                       IPv4       Connected   Disabled
設定の変更

PowerShell を管理者権限で起動して設定の変更を行う必要がありました。

PS C:\Users\User> Get-NetIPInterface | `
>> Where-Object {$_.InterfaceAlias -eq 'vEthernet (WSL)' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | `
>> Set-NetIPInterface -Forwarding Enabled
変更後の確認
PS C:\Users\User> Get-NetIPInterface | `
>>     Select-Object ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | `
>>     Sort-Object -Property IfIndex | `
>>     Format-Table

ifIndex InterfaceAlias               AddressFamily ConnectionState Forwarding
------- --------------               ------------- --------------- ----------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     17 vEthernet (Default Switch)            IPv6       Connected    Enabled
     17 vEthernet (Default Switch)            IPv4       Connected    Enabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    108 vEthernet (WSL)                       IPv6       Connected    Enabled
    108 vEthernet (WSL)                       IPv4       Connected    Enabled