カテゴリー: PC Page 1 of 32

ChatGPTによるシェルスクリプト。(Linuxユーザアカウント削除)

概要

先だってはオプションを忘れがちなものを自動化するを元にスクリプト&コマンド化。

今度は、「慎重な操作を要する作業」を一気通貫で行うようにします。

要件

こんな要件のスクリプトを出力です。

  1. 削除するユーザ名を対話式で聞く
     → ない場合はExit
  2. /etc/passwd /etc/shadow /etc/group のバックアップを、 /etc/old/ファイル名.$(date +%Y%m%d)でバックアップ
     → それぞれファイル:○○をバックアップしましたの表示を出す
  3. ユーザのディレクトリも消すかを聞く y/n
  4. 削除前に以下の確認
     ユーザ名:○○を削除
     ユーザのホームディレクトを消す:y or no
    これでよろしいですか?
    → n : Exit
  5. y: ユーザデータを削除する
    ディレクトリを消すでy → userdel -r を実行してメッセージ出力、Exit
    ディレクトリを消すでn → userdel を実行してメッセージ出力、Exit

ここから更に

  • ホームディレクトリのバックアップを取るかどうかを聞く
  • 差分を表示するようにする

などを加えてできたスクリプトがこちらです。

免責

意図通りに動くかは一応、確認しましたが、
本番運用の前に、検証環境で、テストアカウントで実施してください。

準備

以下のディレクトリを作ります。

  • 設定ファイルのバックアップ先
sudo mkdir /etc/old
  • ホームディレクトリのバックアップ先
sudo mkdir /home/deleted_users

スクリプト内容

  • account_delete.sh
#!/bin/bash

# 1. ユーザ名を対話的に聞く
read -p "削除するユーザ名を入力してください: " username

# ユーザが存在しない場合は終了
if ! id "$username" &>/dev/null; then
    echo "ユーザ '$username' は存在しません。終了します。"
    exit 1
fi

# 2. バックアップを作成
backup_dir="/etc/old"
backup_date=$(date +%Y%m%d)
backup_passwd="$backup_dir/passwd.$backup_date"
backup_shadow="$backup_dir/shadow.$backup_date"
backup_group="$backup_dir/group.$backup_date"

cp /etc/passwd "$backup_passwd"
cp /etc/shadow "$backup_shadow"
cp /etc/group "$backup_group"

echo "ファイル:$backup_passwd をバックアップしました。"
echo "ファイル:$backup_shadow をバックアップしました。"
echo "ファイル:$backup_group をバックアップしました。"

# 3. ユーザのディレクトリを消すかどうかを確認
read -p "ユーザのディレクトリも削除しますか? (y/n): " delete_home

# 4. ユーザディレクトリのバックアップを取るかどうかを確認
backup_home=""
if [ "$delete_home" == "y" ]; then
    read -p "ユーザのホームディレクトリのバックアップを取りますか? (y/n): " backup_home_choice
    if [ "$backup_home_choice" == "y" ]; then
        backup_home="/home/deleted_users/$username.$backup_date"
        cp -r /home/$username "$backup_home"
        echo "ユーザ '$username' のホームディレクトリをバックアップしました。"
    fi
fi

# 5. 削除前に確認
echo -e "\nユーザ名: $username を削除"
echo -e "ユーザのホームディレクトリを消す: $delete_home"
echo -e "ユーザのホームディレクトリのバックアップを取る: $backup_home\n"

read -p "これでよろしいですか? (y/n): " confirm

if [ "$confirm" == "n" ]; then
    echo "終了します。"
    exit 0
fi

# 6. ユーザデータを削除
if [ "$delete_home" == "y" ]; then
    userdel -r "$username"
    echo "ユーザ '$username' のデータとディレクトリを削除しました。"
else
    userdel "$username"
    echo "ユーザ '$username' のデータを削除しました。"
fi

# 7. バックアップと現在の差分を表示するかどうかを尋ねる
read -p "アカウント削除後、バックアップと現在の差分を表示しますか? (y/n): " show_diff

if [ "$show_diff" == "y" ]; then
    diff_passwd=$(diff /etc/passwd "$backup_passwd")
    diff_shadow=$(diff /etc/shadow "$backup_shadow")
    diff_group=$(diff /etc/group "$backup_group")

    echo -e "\n--- ファイル:$backup_passwd との差分 ---\n$diff_passwd"
    echo -e "\n--- ファイル:$backup_shadow との差分 ---\n$diff_shadow"
    echo -e "\n--- ファイル:$backup_group との差分 ---\n$diff_group"
fi

echo "終了します。"

実行権付与

  • 所有者変更
sudo chown root:root account_delete.sh

root権限でしか触れないコマンドなので、所有者もrootにします。

  • 権限変更
sudo chmod 700 account_delete.sh

通常アカウントは閲覧もできないようにします。

これで、操作時に確認をしつついざというときの切り戻しもできるようになります。

ChatGPTによるシェルスクリプトとコマンド化。(Zipアーカイブ)

概要

使うときはあるけど、オプションや順番を考えるのが面倒。

そんな悩みをChatGPTの力を借りて解決です。

やったこと

  1. 対話式で圧縮するファイルやディレクトリを指定
  2. 圧縮先のディレクトリを対話で指定(何も指定しない場合はカレントディレクトリ)
  3. アーカイブファイルを対話で指定(何も指定しない場合はファイル/ディレクトリ名.$(date +%Y%m%d).zip)
  4. zipコマンドで圧縮。ディレクトリかを判別し、ディレクトリなら-rオプションをつける

という処理を行います。

スクリプト

  • autozip
#!/bin/bash

# ユーザにファイル/ディレクトリの指定を求める関数
get_input() {
    read -p "$1: " input
    echo "$input"
}

# 対話式でファイル/ディレクトリの指定を取得
source_path=$(get_input "圧縮するファイルやディレクトリのパス")

# 対話式で圧縮先ディレクトリの指定を取得
destination_dir=$(get_input "圧縮先のディレクトリ(何も指定しない場合はカレントディレクトリ)")
destination_dir=${destination_dir:-"."}

# 対話式でアーカイブファイルの指定を取得
archive_name=$(get_input "アーカイブファイルの名前(何も指定しない場合はファイル/ディレクトリ名.\$(date +%Y%m%d).zip)")
archive_name=${archive_name:-"$(basename $source_path).$(date +%Y%m%d).zip"}

# ソースディレクトリに移動
cd "$(dirname "$source_path")" || exit

# zipコマンドで圧縮
if [ -d "$(basename "$source_path")" ]; then
    # ディレクトリの場合は-rオプションを付けて圧縮
    zip -r "$destination_dir/$archive_name" "$(basename "$source_path")"
else
    # ファイルの場合は-rオプションなしで圧縮
    zip "$destination_dir/$archive_name" "$(basename "$source_path")"
fi

echo "圧縮が完了しました。"

# カレントディレクトリに戻る
cd - || exit

作成後の処理

  • 実行権付与
chmod +x autozip
  • コマンド化
sudo chown root:root autozip && sudo mv autozip /usr/local/bin/autozip

実行結果

  • パスが通っていることを確認
which autozip

→ /usr/local/bin/autozip

に表示されます。

  • 実行確認

任意のディレクトリに移動し、

autozip

を実行。

これで、

  1. 対話式で圧縮するファイルやディレクトリを指定
  2. 圧縮先のディレクトリを対話で指定(何も指定しない場合はカレントディレクトリ)
  3. アーカイブファイルを対話で指定(何も指定しない場合はファイル/ディレクトリ名.$(date +%Y%m%d).zip)
  4. zipコマンドで圧縮。ディレクトリかを判別し、ディレクトリなら-rオプションをつける

が実行できました。

ChromebookでNextcloudのファイルを参照。

使う機会があったので調べてみました。

背景

出先(宿泊先)にChromebookしか持っていない状態でNextcloudのファイルを参照したい状況が発生しました。

Chrome拡張Nextcloud (unofficial)

https://chrome.google.com/webstore/detail/nextcloud-unofficial/kkbmcejbjlhkmljcafiaofajcbgkobcd/related

こちらをChromebookに入れてみます。

導入後、Chromebookのファイルの縦メニューを開くと

Nextcloud(unofficial)というリンクが出てきます。

接続

※予めNextcloudにログインします。

  • Name:任意の名前
  • Server domain:Nextcloudのドメイン名

を入れて「Login」をクリックします。そうすると、Nextcloudにログインしているブラウザが表示され、アクセス権の確認が出ます。

その後、接続。

接続後の挙動

エクスプローラーのように、ファイルが表示されます。プレビューはでないものの、ファイルをダウンロードすることなく閲覧が可能になりました。

ブラウザからファイルを保存する際、このNextcloudのディレクトリを指定することはできませんが、

  1. 一度ダウンロードディレクトリに保存
  2. その後、ファイルアプリからNextcloudの任意のディレクトリに保存

の手順でOKとなりました。

レシピとインポート。(Nextcloudアプリ『CookBook』)

面白いアプリを見つけました。

CookBook

https://apps.nextcloud.com/apps/cookbook

A library for all your recipes. It uses JSON files following the schema.org recipe format. To add a recipe to the collection, you can paste in the URL of the recipe, and the provided web page will be parsed and downloaded to whichever folder you specify in the app settings.

と、料理のレシピを書いてくれるもの。

導入

Nextcloud 27.1.4で確認しました。

管理メニュー>アプリ

から、「CookBook」で検索後、「ダウンロードして有効」をクリックするだけ。その後、画面をリフレッシュしてダッシュボードに戻ると、メニューに「料理本」が現れます。

入力・編集

「レシピを作成」をクリックすると、このような入力画面が出てきます。

料理に必要な材料のみならず、使う器具も追記できて、手順は並べ替えも自由です。

レシピのインポート

このアプリ最大の特徴は、レシピサイトからそのままインポートできること。

https://help.nextcloud.com/t/working-urls-for-cookbook/61612

海外のサイトが主ですが、そのURLを引っ張ることができます。

https://www.jamieoliver.com/recipes/drink-recipes/english-garden-mocktail/

このレシピをインポートしてみます。

上記、Nextcloudにインストールした「料理本」から、

URLからレシピをダウンロードのところに、上記URLを貼り付けてEnter

すると、このようにレシピが現れます。

サイト内のキーワードも用意してくれる周到さ。

かなり使えるメモ帳として機能します。

Redmineにチェックリストを追加。

海外のメンテナが作成した「Kanban Board Plugin」
そこに、ChecklistPluginがありました。その無料版インストールのメモです。

https://redmine-kanban.com/plugins/checklists

環境

  • Ubuntu 20.04
  • Redmine 4.2系
  • Apache 2.4系
  • MySQL 8.3系

さっくりとした手順

  1. DBのバックアップを取ります。
  2. プラグインを入手します。
  3. プラグインを配置します。
  4. プラグインのインストールを行います。
  5. 動作を確認します。

DBバックアップ

mysqldump -h localhost -u redmine -p --no-tablespaces --single-transaction redmine > redmine_backup.$(date +%Y%m%d).sql

いざというときに切り戻しをできるようにします。

プラグイン入手

  • 作業ディレクトリ移動
cd /hoge && pwd

任意の作業用のディレクトリに移動します。

  • ファイルのダウンロード
wget https://redmine-kanban.com/files/redmine_advanced_checklists.zip
  • ファイル展開
unzip redmine_advanced_checklists.zip
  • 所有者変更
sudo chown -R www-data:www-data redmine_advanced_checklists

プラグイン配置

  • プラグインディレクトリを配置
sudo mv redmine_advanced_checklists /var/lib/redmine/plugins/

自分の環境に合わせます。

  • 配置確認
ls -ld /var/lib/redmine/plugins/redmine_advanced_checklists

ファイルがあることを確認します。

プラグインのインストール

  • Redmine配置ディレクトリに移動
cd /var/lib/redmine
  • Gemインストール
sudo -u www-data bundle install
  • DBのマイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production

インストール後の確認

  • Webサービス再起動
sudo systemctl restart apache2

その後、Redmineにアクセスして以下を確認します。

  1. Redmineにログインできること。
  2. 管理>AdvancedChecklistをクリック。

以下のようになチェックが出るので、必要に応じてチェックを入れます。(用いるチェックリストも入れます)

任意のチケットを開きます。

チェックリストという項目があります。右にある「+」をクリックします。

名前をつけて保存します。

項目を追加することができます。

これらは容易に追加できるので、作業漏れを減らすことができます。

また、並べ替えも容易です。

特徴と現段階の問題点

Pros:

  • ちょっとしたチェックリストを作ることができる。
  • 動作は比較的軽快。
  • 各チェックリストに担当者をアサインすることができる。

Cons:

無料版のため、以下は利用することはできません。

  • Kanbanと同じようにアイコンが表示されません。
  • このチェックリストは検索対象ではありません。

こちらに関しては、「参照したかどうか」の確認や、事前作業のチェックなどに使えるという印象です。

Redmineのかんばんプラグインを差し替え。

Redmineのかんばんプラグイン、
海外のメンテナが作成した「Kanban Board Plugin」
こちらの無料版を使ってみます。

https://redmine-kanban.com/plugins/kanban

環境

  • Ubuntu 20.04
  • Redmine 4.2系
  • Apache 2.4系
  • MySQL 8.3系

さっくりとした手順

  1. DBのバックアップを取ります。
  2. プラグインを入手します。
  3. プラグインを配置します。
  4. プラグインのインストールを行います。
  5. 動作を確認します。

※オプション※DBユーザーの権限変更

DBをバックアップできるようにします。

mysql -u root -p
GRANT RELOAD ON *.* TO 'redmine'@'localhost';
FLUSH PRIVILEGES;
EXIT

ユーザーはRedmineのDBユーザーを選んでください。

DBバックアップ

mysqldump -h localhost -u redmine -p --no-tablespaces --single-transaction redmine > redmine_backup.$(date +%Y%m%d).sql

いざというときに切り戻しをできるようにします。

※オプション※既存プラグインの退避

HappySE LifeのKanbanプラグインを退避します。(その他のかんばんプラグインは勝手が異なります。注意してください)

cd /vaw/lib/redmine/plugin && pwd

自分の環境に合わせます。

sudo mv kanban /path/to/backup/directory/kanban_org

プラグイン退避確認

  • Webサービス再起動
sudo systemctl restart apache2.service

再起動後、以下を確認します。

  1. Redmineにアクセスできること
  2. かんばんプラグインがないこと

プラグイン入手

  • 作業ディレクトリ移動
cd /hoge && pwd

任意の作業用のディレクトリに移動します。

  • ファイルのダウンロード
wget https://redmine-kanban.com/files/redmine_kanban.zip
  • ファイル展開
unzip redmine_kanban.zip
  • 所有者変更
sudo chown -R www-data:www-data redmine_kanban

プラグイン配置

  • プラグインディレクトリを配置
sudo mv redmine_kanban /var/lib/redmine/plugins/

自分の環境に合わせます。

  • 配置確認
ls -ld /var/lib/redmine/plugins/redmine_kanban

ファイルがあることを確認します。

プラグインのインストール

  • Redmine配置ディレクトリに移動
cd /var/lib/redmine
  • Gemインストール
sudo -u www-data bundle install
  • DBのマイグレーション
sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production

インストール後の確認

  • Webサービス再起動
sudo systemctl restart apache2

その後、Redmineにアクセスして以下を確認します。

  1. Redmineにログインできること。
  2. 上部ツールバーに「Boards」というメニューができていること。
  3. このメニューをクリックして、以下のようにチケット一覧がかんばんとして配置されていること。

特徴と現段階の問題点

Pros:

  • 基本的なかんばんシステムは持っています。ドラッグ&ドロップでチケットの進行を可視化できます。
  • かんばん上のチケットをクリックすることで、概要の閲覧が可能です。

Cons:

  • 上記でわかるように、割り当てられていないステータスは文字が上下逆になっています。
  • また、アバターアイコンが見えません。

欠点があるものの、

  • チケットがモーダルで表示される
  • チケットのリンクもコピーできる
  • 詳細は別タブで開ける
  • Ajaxにより軽快な動作が行える

など、利点は大きいです。

ApacheコンフィグファイルによるIP拒否。(アドレスべた書き)

概要

WordPressなどの特定のディレクトリに対して攻撃を仕掛けてくるIPアドレスやNWをブロックする方法についてメモします。

環境

以下で動作を確認しました。

  • Ubuntu 20.04
  • Apache 2.4
  • /etc/apache2/site-available/example.confなど、バーチャルサイトを利用

さっくりとした手順

  1. バーチャルサイトのコンフィグのバックアップを取ります。
  2. コンフィグを追記します。
  3. 設定を反映します。
  4. 動作を確認します。

コンフィグファイルのバックアップ

  • ディレクトリ移動
/etc/apache2/sites-available && pwd
  • バックアップ
sudo cp -pi example.conf /path/to/backup/directory/example.conf.$(date +%Y%m%d)

バックアップするファイルやディレクトリは自分の環境に合わせます。

  • バックアップ確認
diff -u example.conf /path/to/backup/directory/example.conf.$(date +%Y%m%d)

バックアップがなければ(エラーがなければ)バックアップはできています。

コンフィグの追記

  • /etc/apache2/site-available/example.conf

以下のように追記します。

<Directory "/var/www/html/example">
    <RequireAll>
        Require all granted
        Require not ip 192.168.1.1
    </RequireAll>
</Directory>

拒否対象のディレクトリや、IPアドレスは対象に合わせて修正してください。

動作確認に万全を期すなら、自分が用意できるアクセス元のIPアドレスを指定します。(その後、設定を削除します)

  • 追記後の差分確認
diff -u /path/to/backup/directory/example.conf.$(date +%Y%m%d) /etc/apache2/site-available/example.conf

上記の追記内容が出ていることを確認します。

設定反映

  • 設定ファイル確認
sudo apache2ctrl configtest

SyntaxOKを確認します。

  • サービス再起動
sudo systemctl restart apache2.service

反映確認

  • 対象ディレクトリがあるサイトにアクセスして、通常にアクセスできることを確認。
  • 自分が用意できるアクセス元のIPアドレスを指定しているなら、そこからのアクセスができないことを確認。

今後の対応

  • ネガティブリストではなくポジティブリストでの運用
  • 別ファイルの参照

など、改良していきます。

Mod_Securityが検知したIDの抜き出し。(awkワンライナー)

Mod_Securityが検知したセキュリティポリシーの判定に役立つ小技です。

環境

  • Mod_Security
  • Apache2.4

を連携させ、SecRules On / DetectOnlyにしています。

ログ表示例

[Wed Nov 01 14:12:12.213885 2023] [:error](中略) ModSecurity: Warning. Pattern match (中略) at ARGS:html. [file "/usr/share/modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "308"] [id "941190"] [msg "IE XSS Filters - Attack Detected."] (略)

ここから、941190の部分のみを取り出します。

コマンド

awk '{match($0, /\[id "([0-9]+)"\]/, arr); if(arr[1]) print arr[1]}' ログファイル

コマンド実行例

awk '{match($0, /\[id "([0-9]+)"\]/, arr); if(arr[1]) print arr[1]}' /var/log/bookstack/bs_error.log | sort -u
# 更に重複を排除

実行結果

941180
941190
942170
942350

これらを除外するなり例外に加えるなどの処理を行う下地ができました。

Redis-ServerでPIDが作られない問題に対処。

Nextcloudを導入する際、Redis-Serverを組み込むところを行いました。

その中に気になるメッセージがあったので対処します。

Starting Advanced key-value store...
redis-server.service: Can't open PID file /run/redis/redis-server.pid (yet?) after s>
 Started Advanced key-value store.

手順1. IPv6無効化

参考にしたURL:
https://ubuntu.perlzemi.com/blog/20200225174004.html

1-1.設定ファイルのバックアップを取ります。

  • ディレクトリ移動
cd /etc/redis && pwd
  • 設定ファイルバックアップ
sudo cp -pi redis.conf /path/go/backup/directory/redis.conf.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • バックアップ確認
diff -u redis.conf /path/go/backup/directory/redis.conf.$(date +%Y%m%d)

差分がなければ(エラーがなければ)バックアップ完了です。

1-2. 設定ファイルを編集します。

  • ファイル編集

次のファイルを、以下の差分になるように編集します。

/etc/redis/redis.conf
  • 差分
-bind 127.0.0.1 ::1
+bind 127.0.0.1

手順2. 起動スクリプトの編集

参考URL:
https://github.com/redis/redis/issues/7361

2-1.設定ファイルのバックアップを取ります。

  • ディレクトリ移動
cd /etc/systemd/system && pwd
  • 設定ファイルバックアップ
sudo cp -pi /etc/systemd/system/redis.service /path/to/backup/directory/redis.service.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • バックアップ確認
diff -u /etc/systemd/system/redis.service /path/to/backup/directory/redis.service.$(date +%Y%m%d)

差分がなければ(エラーがなければ)バックアップ完了です。

2-2.設定ファイルを編集します。

次のファイルを、以下の差分になるように編集します。

/etc/systemd/system/redis.service
-PIDFile=/run/redis/redis-server.pid
+#PIDFile=/run/redis/redis-server.pid
+ExecStop=/bin/kill -s TERM $MAINPID
+ExecStartPost=/bin/sh -c "echo $MAINPID > /var/run/redis/redis.pid" 

2-3. 設定ファイルを反映させます。

sudo systemctl daemon-reload

3. 修正を確認します。

  • redis-serverサービス再起動
sudo systemctl restart redis-server.service
  • 設定反映確認
systemctl status redis-server.service

次のように、PIDが作られていれば設定完了です。

    Process: 531 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
    Process: 653 ExecStartPost=/bin/sh -c echo $MAINPID > /var/run/redis/redis.pid (code=exited, status=0/SUCCESS)
   Main PID: 652 (redis-server)
      Tasks: 4 (limit: 4671)
     Memory: 4.4M
     CGroup: /system.slice/redis-server.service
             └─652 /usr/bin/redis-server 127.0.0.1:6379

Nextcloudの認証強化。(二段階認証アプリの設定)

Nextcloudをインターネット上で公開する場合、ほぼ必須の措置です。

環境

Nextcloud 27.1.3で挙動を確認しました。

二段階認証アプリの有効化

管理>アプリ>「あなたのアプリ」に移動します。

Two-Factor TOTP Providerを「有効にする」をクリックします。

二段階認証の設定

個人>セキュリティに移動します。

  1. 二要素認証の、TOTPを有効化します。
  2. QRコードが表示されるので、外部認証アプリ(Google Authenitcator等)でコードを読み取ります。
  3. 新しく表示されたコードを読み取って「検証」します。

アプリをなくした場合に備え、バックアップコードも作っておきます。

挙動

  1. 別のPC/ブラウザなどでNextcloudサイトにアクセスします。
  2. ユーザ名とパスワードを利用してログインします。
  3. 以下のようにコードの入力画面が出ます。

これで、ある程度の安全性が担保されました。

Page 1 of 32

Powered by WordPress & Theme by Anders Norén