2024年4月23日火曜日

WSL2 の Ubuntu に ssh する方法

WSL2 の Ubuntu に ssh する方法

概要

最近の WSL2 であれば特に何も考えずにデフォルトの設定のままできるようです

環境

  • Windows10 22H2
  • WSL2 (Ubuntu22.04)

openssh-server のインストール

  • sudo apt -y update
  • sudo apt -y install openssh-server

自動起動をONにする

  • sudo systemctl status ssh

動作確認

  • ssh devops@localhost

これが一番のポイントかもしれませんが localhost にアクセスします
WSL2 は localhost にバインドするので vEthernet (WSL) で払い出される IP ではなく localhost にアクセスします

パスワード WSL 初回起動時に設定したパスワードを使用します

最後に

デフォルトの WSL2 のターミナルは Windows コンソールのターミナルなのでキーバインドなどが微妙です
使い慣れたターミナルを使いたい場合には ssh を使いましょう

また ssh にするには当然 WSL を起動しておく必要があるので注意しましょう
Windows コンソールが不要な場合は「wsl」コマンドを実行するだけでも起動させることができます

2024年4月22日月曜日

Python Slack SDK でスレッドとして返信する方法

Python Slack SDK でスレッドとして返信する方法

概要

chat_postMessage で thread_ts を指定します

環境

  • macOS 11.7.10
  • Python 3.11.6
  • slack-sdk 3.27.1

サンプルコード

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

client = WebClient(token="xoxb-xxxxxx")
channel_id = "C0123456789"

try:
    # 会話情報の取得、最新100件
    result = client.conversations_history(channel=channel_id)
    conversation_history = result["messages"]
    # とりあえず最新のメッセージのスレッドに返信する
    ts = result["messages"][0]["ts"]
    # thread_tsを指定することでスレッド返信になる
    response = client.chat_postMessage(
        channel="#private",
        text="Hello world!",
        thread_ts=ts,
        # アイコンやユーザ名をカスタムする場合は以下を設定する
        username="hawksnowlog",
        icon_url="https://pbs.twimg.com/profile_images/712848447569661952/ayfI9-77_400x400.jpg",
    )
except SlackApiError as e:
    print(e)

最後に

as_user オプションは廃止されているので使えません
代わりに username と icon_url を使いますが APP というタグは必ず付与されてしまうようで完全にユーザになり変わって投稿することはできないようです

参考サイト

2024年4月19日金曜日

Ubuntu にインストールサれているパッケージの脆弱性チェックをしてみる (OpenScap編)

Ubuntu にインストールサれているパッケージの脆弱性チェックをしてみる (OpenScap編)

概要

Ubuntu 上にインストールされているパッケージの脆弱性をチェックするのに OpenScap というツールを使ってみました
インストールから実際に脆弱性をチェックする方法まで紹介します

環境

  • Ubuntu 22.04
  • oscap 1.2.17

インストール

  • sudo apt -y install libopenscap8

jammy では 1.3 はインストールされないようです

脆弱性定義のダウンロード

OVAL (Open Vulnerability and Assessment Language) 形式の脆弱性定義ファイルをダウンロードします

OpenScap は OVAL 形式のファイルをサポートしているのでこの定義ファイルを元にマシン上にあるパッケージのバージョンと比較して脆弱性があるかどうかチェックします

  • wget https://security-metadata.canonical.com/oval/com.ubuntu.$(lsb_release -cs).usn.oval.xml.bz2
  • bunzip2 com.ubuntu.$(lsb_release -cs).usn.oval.xml.bz2

スキャン実行

結果は html に保存されます

  • oscap oval eval --report report.html com.ubuntu.$(lsb_release -cs).usn.oval.xml
Definition oval:com.ubuntu.jammy:def:52051000000: false
Definition oval:com.ubuntu.jammy:def:51821000000: false
Definition oval:com.ubuntu.jammy:def:51811000000: false
Definition oval:com.ubuntu.jammy:def:1021000000: false
Definition oval:com.ubuntu.jammy:def:1011000000: false
Definition oval:com.ubuntu.jammy:def:1001000000: false
Definition oval:com.ubuntu.jammy:def:100: true
Evaluation done.

上記のようなログが流れ最後に done となれば完了です

html ファイルの確認

方法は何でも OK です

  • mv report.html /var/www/html
  • curl localhost/report.html

以下のような感じで表示されます
オレンジっぽくなっている部分が脆弱性未対応のパッケージを使っている部分になります

対象の使用しているパッケージは一番右の欄を見るか CVE のリンク先に詳細な情報があるのでそこを見るしかありません

最後に

OpenScap と公開されている脆弱性情報ファイルを使ってローカルマシン上のパッケージの脆弱性チェックをしてみました

基本は apt upgrade で対応することになりますが Ubuntu Pro でのみ公開されているパッチもあるのでその場合は手動でパッチを当てるか対象のパッケージを削除するかしかないかなと思います

参考サイト

2024年4月18日木曜日

Windows の WSL2 でてっとり早くインターネットに接続する方法

Windows の WSL2 でてっとり早くインターネットに接続する方法

概要

WSL2 はデフォルトだと NAT 接続になります
またネットワークアダプタは WSL2 専用のネットワークアダプタになるため例えば複数のネットワークアダプタがあり通常作業は別のネットワークアダプタから通信する場合には全くインターネットに接続できなくなります

ネット上の記事だと DNS の接続を変更したりプロキシの設定を変更したりすれば何とかなる記事が多くありますがそもそもネットワークが別で普段使っているネットワークに疎通できないのであれば普段使っている DNS やプロキシへもそもそもアクセスできないので意味がありません

今回はそんなときに簡単に WSL2 からインターネットにアクセスすることができる設定を紹介します

環境

  • WSL2 (Ubuntu 22.04)
  • Windows10 22H2

解決方法: ネットワークアダプタの共有設定を使う

Windows のネットワークアダプタには他のネットワークアダプタからの通信を共有する機能があります
これを使用することで普段使っているネットワークアダプタに対して WSL2 で作成されたネットワークアダプタからの通信を許可することでインターネットに接続できるようにします

まずはネットワークアダプタの設定から行います
普段使っているネットワークアダプタのプロパティを開き「共有」を選択します
するとネットワークを共有するアダプタを選択する画面になるので WSL2 が作成した「vEthernet (WSL)」を選択します

ちなみに自分の通常のネットワークは Wi-Fi アダプタになるので Wi-Fi アダプタに対して共有を設定を行っています

vEthernet (WSL) は以下のような表示です

WSL 側の設定

ネットワークを共有すると vEthernet (WSL) の IP アドレス帯が変わります
なのでこの IP を WSL (Ubuntu) に設定してあげます

  • sudo ip addr add 192.168.137.10/24 dev eth0
  • sudo ip route delete default
  • sudo ip route add default via 192.168.137.1

既存のネットワークに 192.168.137.10 という IP を付与しデフォルトゲートウェイを 192.168.137.1 にしているだけです
おそらくネットワーク共有すると同じ IP 帯になるはずなのでそのままコピペして Ubuntu で実行すれば OK です

DNS の設定

WSL2 の場合デフォルトだと vEthernet (WSL) の共有前のアドレスが DNS に設定されています
これはもう使わないので外部の DNS を使います

  • vim /etc/resolv.conf
nameserver 8.8.8.8

動作確認

これで apt update などもできるようになります

この構成の問題点

今回共有したネットワークは本当に普段使っているネットワークで自宅のマシンやスマホ、Chromecast などが存在しているネットワークになります
自宅のホームルータを抜けてインターネットに接続する経路になります

もしその経路ではなく VPN などを張っていて職場やプライベートな環境に WSL2 から通信したい場合にはこの方法ではできません
なぜなら共有しているネットワークアダプタが VPN 用のネットワークではなくただの自宅ネットワークだからです

もし WSL2 から VPN の経路も使いたい場合には VPN 用のネットワークアダプタにも vEthernet (WSL) からのアクセスを許可してあげれば OK です
ただその場合には外部に出るネットワークと VPN に行くネットワークの2つになるので適切に経路を設定してあげないとうまく動作しないので注意しましょう

Windows のネットワーク共有は1つのアダプタに対してのみから行えないようなのでどちらか一方のネットワークを使うしかないようです

最後に

WSL2 でプロキシなどの設定をせずにインターネットに接続する方法を紹介しました

インターネット以外のネットワークにも接続したい場合には更に工夫が必要なので注意しましょう
WSL2 にはブリッジ接続もあるようなのですそれを試すのもありかもしれません
また今回は無線だったのでネットワーク共有を使いましたが有線ネットワークだと今回の共有設定などはしなくても動くかもしれません

参考サイト

2024年4月17日水曜日

個人でUbuntu Proに申し込む方法

個人でUbuntu Proに申し込む方法

概要

Ubuntu Pro は Ubuntu の商用ライセンスです
ESM (Extended Security Maintenance) パッケージの提供などをしておりよりセキュアな Ubuntu を使うことができます
今回は個人で Ubuntu Pro を登録し Ubuntu に ESM パッケージをインストールしてみました

環境

  • Ubuntu 22.04

登録

まず https://ubuntu.com/pro/subscribe にアクセスします
個人であれば5台までは無料で使えるようです

Ubuntu One のアカウントが必要なのでなければ作成しましょう
すでにあればログインします

トークンの確認

Ubuntu Pro に登録するとサブスクリプションの画面で以下のようなトークン情報が表示されます
コマンドでも登録できるので確認しましょう

Ubuntu を登録する

先ほどのコマンドを Ubuntu 上で実行してみましょう

  • sudo pro attach xxxx
Enabling default service esm-apps
Updating Ubuntu Pro: ESM Apps package lists
Ubuntu Pro: ESM Apps enabled
Enabling default service esm-infra
Updating Ubuntu Pro: ESM Infra package lists
Ubuntu Pro: ESM Infra enabled
Enabling default service livepatch
Installing canonical-livepatch snap
Canonical Livepatch enabled
This machine is now attached to 'Ubuntu Pro - free personal subscription'

SERVICE          ENTITLED  STATUS       DESCRIPTION
anbox-cloud      yes       disabled     Scalable Android in the cloud
esm-apps         yes       enabled      Expanded Security Maintenance for Applications
esm-infra        yes       enabled      Expanded Security Maintenance for Infrastructure
fips-preview     yes       disabled     Preview of FIPS crypto packages undergoing certification with NIST
fips-updates     yes       disabled     FIPS compliant crypto packages with stable security updates
livepatch        yes       enabled      Canonical Livepatch service
realtime-kernel* yes       disabled     Ubuntu kernel with PREEMPT_RT patches integrated
usg              yes       disabled     Security compliance and audit tools

 * Service has variants

NOTICES
Operation in progress: pro attach

For a list of all Ubuntu Pro services and variants, run 'pro status --all'
Enable services with: pro enable <service>

     Account: xxxxx@mail.com
Subscription: Ubuntu Pro - free personal subscription

登録が成功するとサブスクリプション画面の「Active machines」が増えていることが確認できると思います

動作確認

ESM バージョンのパッケージがインストールできるか確認してみます
今回は graphviz に ESM パッケージがあるのでこれがインストールされるか確認します (参考)

インストール前は以下のような状態です

dpkg -l | grep 'graphviz'
ii  libgraphviz-dev:amd64                  2.42.2-6                                amd64        graphviz libs and headers against which to build applications

まずは apt update します
update すると esm のリポジトリが追加されていることが確認できます

  • sudo apt -y update
Hit:1 https://aquasecurity.github.io/trivy-repo/deb jammy InRelease
Hit:2 https://download.docker.com/linux/ubuntu jammy InRelease
Hit:3 https://esm.ubuntu.com/apps/ubuntu jammy-apps-security InRelease
Hit:4 https://esm.ubuntu.com/apps/ubuntu jammy-apps-updates InRelease
Hit:5 https://esm.ubuntu.com/infra/ubuntu jammy-infra-security InRelease
Hit:6 https://esm.ubuntu.com/infra/ubuntu jammy-infra-updates InRelease
Hit:7 https://ppa.launchpadcontent.net/ansible/ansible/ubuntu jammy InRelease
Hit:8 https://ppa.launchpadcontent.net/git-core/ppa/ubuntu jammy InRelease
Hit:9 http://jp.archive.ubuntu.com/ubuntu jammy InRelease
Get:10 http://jp.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Hit:11 http://jp.archive.ubuntu.com/ubuntu jammy-backports InRelease
Get:12 http://jp.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:13 http://jp.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1,558 kB]
Get:14 http://jp.archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [1,699 kB]
Get:15 http://jp.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,060 kB]
Fetched 4,547 kB in 7s (635 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
12 packages can be upgraded. Run 'apt list --upgradable' to see them.

ではパッケージを更新してみます
更新が始まるので終了するまで待ちます

  • sudo apt -y upgrade

そして再度 graphviz のパッケージを確認すると ESM バージョンのパッケージに更新されていることが確認できます
これにより CVE 対応されたパッケージが使えるようになります

dpkg -l | grep 'graphviz'
ii  libgraphviz-dev:amd64                  2.42.2-6ubuntu0.1~esm1                  amd64        graphviz libs and headers against which to build applications

最後に

個人で Ubuntu Pro に申し込み ESM バージョンのパッケージをインストールしてみました
CVE 対応などの脆弱性緊急対応版のパッケージは結構 ESM として公開されることが多い印象です
5台までなら無料で使えるので登録しておいて損はないかなと思います

参考サイト

2024年4月16日火曜日

Ubuntu のカーネルアップグレード時に No space left on device 対応

Ubuntu のカーネルアップグレード時に No space left on device 対応

概要

apt -y upgrade
でカーネルアップグレードした際に No space left on device でエラーになった場合の対応方法を紹介します

環境

  • Ubuntu 22.04
  • linux kernel generic 5.15.0.92

エラー詳細

Processing triggers for initramfs-tools (0.140ubuntu13.4) ...
update-initramfs: Generating /boot/initrd.img-5.15.0-102-generic
I: The initramfs will attempt to resume from /dev/sda3
I: (UUID=b5504e77-f9b7-468f-9dec-d1b8131f15ca)
I: Set the RESUME variable to override this.
zstd: error 25 : Write error : No space left on device (cannot write compressed block)
E: mkinitramfs failure zstd -q -1 -T0 25
update-initramfs: failed for /boot/initrd.img-5.15.0-102-generic with 1.
dpkg: error processing package initramfs-tools (--configure):
 installed initramfs-tools package post-installation script subprocess returned error exit status 1
Errors were encountered while processing:
 initramfs-tools
needrestart is being skipped since dpkg has failed
E: Sub-process /usr/bin/dpkg returned an error code (1)

対応方法

  • sudo apt autoremove -y

基本はこれで古いカーネルファイルが削除されて新しいファイルが /boot 配下に配置されて成功するはずです

それでもダメな場合は /boot 配下にある古いカーネルファイルを手動で削除して対応しましょう

最後に

カーネルアップグレード時のディスク逼迫エラーについて対処方法を紹介しました
/boot 領域が小さいので古いカーネルファイルを削除してあげましょう

2024年4月15日月曜日

VPN + WSL2 で名前解決できなかったりインターネットに接続できない場合の対処方法

VPN + WSL2 で名前解決できなかったりインターネットに接続できない場合の対処方法

概要

VPN (今回は GrobalProtect 環境) に接続した Windows マシン上で WSL2 を使おうとするとネットワークのルーティングがおかしくなり DNS が参照できずにインターネットに接続できない現象が発生します

環境

  • Windows10 22H2
  • GrobalProtect
  • WSL2 (Ubuntu22.04)

準備

  • Windows マシンで VPN に接続する
  • WSL2 (Ubuntu) を起動する
  • 以下のパワーシェルを実行する

ネットワークのルーティングメトリックを更新する Powershell

このスクリプトは参考サイトにあるにサイトかあそのまま拝借しました
自分も GrobalConnect だったのでネットワークのアダプタ名などはそのまま使えました

Powershell を管理者権限で実行して以下のスクリプトをコピペして実行しましょう

  • vim C:\Users\username\app\connect_vpn_on_wsl2.ps1
$targetIfName = 'PANGP Virtual Ethernet Adapter';
# define function
function Get-NetworkAddress {
    param([Parameter(Mandatory, ValueFromPipelineByPropertyName)][string]$IPAddress, [Parameter(Mandatory, ValueFromPipelineByPropertyName)][int]$PrefixLength);
    process {
        $bitNwAddr = [ipaddress]::Parse($IPAddress).Address -band [uint64][BitConverter]::ToUInt32([System.Linq.Enumerable]::Reverse([BitConverter]::GetBytes([uint32](0xFFFFFFFFL -shl (32 - $PrefixLength) -band 0xFFFFFFFFL))), 0);
        [pscustomobject]@{
            Addr = $IPAddress;
            Prfx = $PrefixLength;
            NwAddr = [ipaddress]::new($bitNwAddr).IPAddressToString + '/' + $PrefixLength;
        };
    }
}
# extend route metric
$targetAddresses = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match 'Hyper-V Virtual Ethernet Adapter' | Get-NetIPAddress -AddressFamily IPv4 | Get-NetworkAddress;
$targetIfs = Get-NetAdapter -IncludeHidden | Where-Object InterfaceDescription -Match $targetIfName;
$targetIfs | Set-NetIPInterface -InterfaceMetric 2;
$targetIfs | Get-NetRoute -AddressFamily IPv4 | Select-Object -PipelineVariable rt | Where-Object { $targetAddresses | Where-Object { $_.NwAddr -eq (Get-NetworkAddress $rt.DestinationPrefix.Split('/')[0] $_.Prfx).NwAddr } } | Set-NetRoute -RouteMetric 6000;

やっていることは VPN のルーティングに対してメトリックを 6000 に設定しています (Set-NetRoute -RouteMetric 6000)

デフォルト 5256 が最大優先度なのでそれ以上になっていれば OK です

ダブルクリックで実行する方法

上記をコピペして

C:\Users\username\app\connect_vpn_on_wsl2.ps
に保存します
ショートカットを作成しプロパティからリンク先を以下のように設定すればダブルクリックで実行できます

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\Users\username\app\connect_vpn_on_wsl2.ps1

今回の場合は管理者権限が必要なので右クリックから管理者権限で実行が必要になります

DNS の変更

必要に応じて WSL2 側の resolve.conf を変更しましょう
スクリプトを実行すると VPN 側への通信ができるようになっているので VPN 側で使用している DNS サーバの IP を設定すると良いかなと思います

再起動した際に変わらないようにするには以下のようにします

  • sudo vim /etc/wsl.conf
[boot]
systemd=true

[network]
generateResolvConf=false
  • sudo vim /etc/resolv.conf
nameserver 8.8.8.8
  • sudo chattr +i /etc/resolv.conf

最後に

VPN + WSL2 で WSL2 側から VPN 側への通信をしたい場合は魔法のスクリプトを実行しましょう

参考サイト