カテゴリー: PC Page 22 of 53

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. 以下のようにコードの入力画面が出ます。

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

RabbitMQを検証環境にインストール。

ちょっと検証が必要だったので、RabbitMQのインストールを行いました。

前提

以下の環境で動いています。

  • Ubuntu 20.04
  • Apache 2.4系

また、本件ではリバースプロキシ化も実施するので、

  • それに合わせたドメイン
  • ドメインに沿った証明書

をインストール済みです。

さっくりとした手順

  1. レポジトリを追加します。
  2. RabbitMQをインストールします。
  3. 管理コンソールを有効化します。
  4. 管理コンソールのリバースプロキシ化させます。
  • 参考にしたWebサイト

https://www.vultr.com/docs/install-rabbitmq-server-ubuntu-20-04-lts/

レポジトリを追加します。

  • RabbitMQ追加
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
 echo "deb https://dl.bintray.com/rabbitmq-erlang/debian focal erlang-22.x" | sudo tee /etc/apt/sources.list.d/rabbitmq.list

インストールを実施します。

  • レポジトリを追加したのでパッケージのアップデート
sudo aptitude update
  • RabbitMQのインストール
sudo apt-get install rabbitmq-server -y --fix-missing
  • インストール確認
systemctl status rabbitmq-server.service 

Active(Running)を確認します。

  • サービス有効化
sudo systemctl enable rabbitmq-server

RabbitMQの管理コンソールを有効化します。

  • コンソール有効化
sudo rabbitmq-plugins enable rabbitmq_management
  • 管理者とパスワード設定
sudo rabbitmqctl add_user admin password

ユーザー名(admin)やパスワード(password)は環境に合わせて適切なものを設定してください。

  • 管理権限付与
sudo rabbitmqctl set_user_tags admin administrator

adminの部分はユーザー名を指定します。

  • 管理コンソールアクセス確認

ブラウザから

http://サーバのIP:15672

と入れることでログインできるようになります。

リバースプロキシの実施

  • ログ格納ディレクトリの追加
sudo mkdir /var/log/mq_console

適切なディレクトリを指定してください。

  • ディレクトリの所有者変更
sudo chown www-data:www-data mq_console
  • 設定ファイル作成
  • 作成するファイル(要管理者権限)
/etc/apache2/site-available/rabbitmq.conf
  • 作成内容
<VirtualHost _default_:80>
    # ドメイン名を指定します
    ServerName 【hoge.example.com】
    # HTTPアクセスを強制的にHTTPSにリダイレクトします
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost _default_:443>
    # ドメイン名を指定します
    ServerName 【hoge.example.com】
    # アクセスログを指定します
    CustomLog /var/log/mq_console/console_access.log combined 
    ErrorLog /var/log/mq_console/console_error.log

#SSL設定
  SSLEngine on
   # SSLを有効化します
    Protocols h2 http/1.1

# SSL証明書を指定します
SSLCertificateFile /etc/certs/hoge.example.com.crt
# 秘密鍵を指定します
SSLCertificateKeyFile /etc/private/hoge.example.com.key

    # Header に Host: example.com を追加するため
    ProxyPreserveHost On
    # HTTPS利用時: Header に x-forwarded-proto: https を追加するため
    RequestHeader set x-forwarded-proto 'https'

    ProxyPass / http://localhost:15672/
    ProxyPassReverse / http://localhost:15672/


</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off
  • 設定ファイル追加
sudo a2ensite rabbitmq.conf
  • 設定確認
sudo apache2ctl configtest

Syntax OKを確認します

  • Webサービス再起動
sudo systemctl restart apache2.service
  • アクセス確認

ブラウザから

設定したドメインにアクセスし、以下の画面を確認します。

  1. 設定した管理者アカウントでログインできること
  2. 以下の管理コンソールが出ること

Page 22 of 53

Powered by WordPress & Theme by Anders Norén