カテゴリー: ガジェット Page 21 of 85

Nextcloud、ブルートフォースの誤検知対応(occ実行)

エラー内容

Nextcloudで以下のエラーが出たので対応を行います。

あなたのIPアドレスは、 "xxx.xxx.xxx.xxx" として認識されており、現在ブルートフォース対策機能により様々なリクエストのパフォーマンスが低下しています。IPアドレスがあなたのアドレスでない場合、プロキシが正しく設定されていない可能性があります。詳細はドキュメントをご覧ください

エラーとなった原因

ファイル共有機能の検証を行っており、その際に共有/非共有の設定を繰り返していたなどの不審な動きがあったからだと思います。(現に、通常に使用している限りではエラーは発生しませんでした)

エラー解消

エラーが出たNextcloudサーバにSSH接続して対応します。

ディレクトリ移動

cd /home/www-data/nextcloud && pwd

occ実行

sudo -u www-data php occ security:bruteforce:reset [IPアドレス]

上記エラーで出てきたIPアドレスを指定します。

エラー解消確認

  1. Nextcloudに管理者権限でログインします。
  2. 管理画面を開きます。
  3. 以下のように、エラーが解消されていることを確認します。

スリーブ新調、リストの移行。(MtG統率者戦)

少し離れていたMtG統率者戦のデッキをいじる機会がありました。

スリーブ入れ替え

そのきっかけとなったのはこちら。アニメ版『ライザのアトリエ』のキャラクタースリーブを手に入れたことです。

発売されていると聞いていたものの、店には売られておらず入手を諦めていたところに、公式サイト(Aniplex Plus)にて販売を確認。

即座に注文して届いたという次第です。

スリーブも入れ替えて、デッキもより愛着がわいてきました。

デッキリストの移行

スリーブ入れの合間、デッキリストをRedmineでの公開からBookStackへと移行。

https://barrel.reisalin.com/shelves/ac1dd

それっぽいイメージをBing Image Creatorにて抽出。

https://barrel.reisalin.com/books/7380a

この、BookStackならば、一つの統率者をテーマに

  • デッキリストの変遷
  • 対戦メモ

等を記すことができますし、「いつ記録したか」の履歴を追うこともできます。

Redmineより視認性が高いのもまたナイスです。

コマンドラインでの視覚化。(lstopoとhtop)

概要

Linuxの運用で、ちょっと役立ったコマンド2つを最近知りました。

確認した環境

Ubuntu 20.04で試しています。

lstop

サーバ内のCPU情報や構造を知るためのコマンドです。

導入

sudo apt-get install hwloc

実行結果

lstopo --of ascii

こちらはAWS Lightsail上で示した結果。コア数やディスクなども確認できます。

デスクトップの据え置き。メモリもディスクも潤沢です。

htop

topコマンドを可視化できるという存在。(というよりもtopの上位種です)

導入

sudo apt-get install htop

実行結果

htop

上部のゲージで

  • CPU使用
  • メモリ使用
  • スワップ

が変動しているのがわかります。また、タスク数なども目の当たりにできます。

F5でツリー表示できるのもポイント。

これは後々の運用に役立つので、ちょっと使い込んでみます。

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アドレスを指定しているなら、そこからのアクセスができないことを確認。

今後の対応

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

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

Page 21 of 85

Powered by WordPress & Theme by Anders Norén