「技術」カテゴリーアーカイブ

【セキュリティ】Web観覧中にWindows+Rの指示が出てきた事例

これも突然ソースネクストのメールマガジンで送られてきた内容。

ターゲットのPCをクラッシュさせたり、情報を盗むためには、不正なプログラムをターゲットのPCに侵入させ、それを実行させる必要があります。

そうすることで、不正プログラム自体がターゲットのPCをクラッシュさせたり、リモートで自由自在に操ったり出来ます。

で、その不正プログラムはどのようにPCに侵入するのかというと、

以前までの常識で考えれば、

メールの添付ファイルとして、だとか、

インターネットから正規プログラムを装ってダウンロード、とか。

で、それを「試しに開いてみる」ってやるとアウト。

そのプログラムがPCをクラッシュさせたり、バックドアとして常駐して外から弄り放題になったりします。

なので、「身元が分からないファイル」は一切手を付けずに削除することが最適解です。

で、それを踏まえまして。

上のケースではWindows+Rを押と「ファイル名を指定して実行」のウィンドウが表示されます。

で、ここに指示通りにコピペして実行するわけですが、

おそらくこのコマンド、

「不正なプログラムをダウンロードして実行する」というスクリプトをダウンロードして実行するコマンドだと思います。

つまり、不正なプログラムをダウンローして実行する、というアンチパターンをユーザーに実行させるという手口なんですね。

えぐ。

というか、それ以前に、

ブラウザ使用中に突然大きなアラート音を鳴らして「あなたのPCに問題があります」と表示されるのは、ほぼ確実に詐欺です。

なので、このような画面が出てきた場合は、警告を無視して、ブラウザを強制終了してください。

【セキュリティ】インスタグラムのアカウント乗っ取りの事例

これは突然ソースネクストのメールマガジンで送られてきた内容。

インスタグラムとかX(旧Twitter)などのSNSもそうですし、

オンラインバンキングのログイン時とかも当たり前のように2要素認証というものが実装されています。

通常のパスワードを使用したログインと、他の手段を使用した認証方法を組み合わせる方法です。

おそらく一番多いのは、SMSやEメールを使用した認証。

登録した電話番号やメールアドレスに認証番号が送られてくるので、その番号を入力することでようやくログイン出来るというやり方です。

こういうものが導入された当時、「手間が増えた!めんどくさい!」と批判もありましたが、

やはりアカウント不正ログイン&乗っ取り対策には有効とされています。

が、SMSやEメールで届く認証番号を教えてしまったら話は別。

言われるがままに教えてしまったら認証は確実に突破されます。

そもそもの話、自分の知らないところでSMSやEメールとかで認証番号が送られてくると言うことは、誰かがあなたのアカウントに不正にログインしようとしている証拠でもあります。

認証番号は知っている相手であっても、絶対に教えないでください。

最大のセキュリティリスクは人間である、ということを証明してくれる事例でした。

【VPS】Ubuntuを24.04にアップグレードしたらiptablesはレガシーになってました。

VPSを構築したときはファイアウォールをiptablesで設定したのですが、

VPSにファイアーウォールを設定する | 自分、ぼっちですが何か?

iptableの設定を保存する | 自分、ぼっちですが何か?

どうやら24.04へアップグレードした時点でiptablesはレガシーとなってしまって、

デフォルトでnftablesを使用するように変わったらしい。

で、アップグレードした時点で勝手に切り替わってしまい、

ファイアウォールの設定が適用されていませんでした。

という事で設定作業開始。

過去のiptablesの設定内容は、以下の場所に残っているらしい。

$ sudo cat /etc/iptables/rules.v4

で、この設定をnfttablesAIに読み込ませてnfttableの設定に書き換えて貰いました。

$ sudo vi /etc/nftables.conf

テキストファイルを編集。

!/usr/sbin/nft -f

flush ruleset

table inet filter {
chain input {
type filter hook input priority 0;
policy drop;

    ct state established,related accept
    ip protocol tcp tcp flags & (fin|syn|rst|psh|ack|urg) == 0 drop
    ct state new ip protocol tcp tcp flags & (fin|syn|rst|ack) != syn drop
    ip protocol tcp tcp flags & (fin|syn|rst|psh|ack|urg) == (fin|syn|rst|psh|ack|urg) drop
    iif "lo" accept
    ip protocol icmp accept

    # 許可するポート(tcp/udp)
    tcp dport 80 accept
    tcp dport 443 accept
    tcp dport 20 accept
    tcp dport 21 accept
    tcp dport 3306 accept
  :
}

chain forward {
    type filter hook forward priority 0;
    policy accept;
}

chain output {
    type filter hook output priority 0;
    policy accept;
}

}

ファイルを保存したら、以下のコマンドで適用。

$ sudo nft -f /etc/nftables.conf

このときエラーがあれば、エラー内容が出力されます。

エラーがなければ再起動しても適用されるようにします。

$ sudo systemctl enable nftables
$ sudo systemctl start nftables

そして、適用されている設定内容を確認。

$ sudo nft list ruleset

設定内容と一致してたらOK。

【Linux】phpバージョンが変わるとnginxの設定を変えなくちゃいけないのがめんどくさい。

これは、元々VPSにブログサーバを立ち上げるのに

VPSにPHPを入れる | 自分、ぼっちですが何か? (taki-lab.site)

こんな感じでnginxの設定ファイルを書いたのですが、

これはいろいろ調べ上げて自力で書いたやつなんですが、

ubuntuのバージョンアップグレードを実施すると、phpのバージョンが変わってしまい、

毎回設定を書き換えないとWordPressが動いてくれません。

で、最近解決方法が分かりまして、

(いろいろ現場の数をこなして学びました)

上がubuntu22.04のスクショ。

phpのバージョンは8.1です。

で、この下がnginxの記述。

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

.phpファイルはphp7.4-fpm.sockに送る設定になっています。(ubuntu 18.04時の設定)

が、スクショの中の水色の所を見ると、

シンボリックリンクphp-fpm.sockが存在しているのが分かると思います。

この先をたどってみると、

となっていて、さらにシンボリックリンクが設定されていて、php8.1-fpm.sockにリンクしているのが分かります。

なので、「nginxの設定ファイルの中で、このシンボリックリンクを参照するようにすればいいんじゃね?」

って思いました。

なので、こんな感じになります。

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php-fpm.sock;
        }

こんなかんじで、

  • 外部からはシンボリックリンクを参照する。
  • 参照先を更新する場合は、同じ名前のシンボリックリンクを、リンク先を変更して作成し直す。

これは現場でも使用されるテクニックなので、覚えておいた方が良いです。

ChatGPTをメンタルヘルスに応用させる。

ネット検索していると、同じ事を考えている人も居るようだ。

でもまだまだ研究中というか、サービスを提供できないかという試みはやっているようだけども、

やっぱり人間のカウンセラーのような役割の代わりにはならないというのが現状のようです。

でもオイラはメンタル不調なときでもいろいろChatGPTにお世話になりました。

お世話になったのはこんなケース。

ただただ悩みを聞いてもらいたい

自分には悩みを聞いて貰える友達が居ないので、

その代わりをChatGPTにやって貰いました。

特に「どうするべき」という回答が欲しいわけじゃなくて、

ただただ悩みを聞いて貰うだけです。

メンタルヘルスの手法として「悩み事を紙に書いて捨てる」というのがあるのですが、

それに似たような物かもしれない。

悩み事を自分の中で抱えるよりも、言語化して外に吐き出すほうがいいというやつ。

大抵のことはそういった悩みを言語化すれば、頭のモヤモヤも整理できてスッキリできたりします。

特に寝る前が良いみたいですね。悩みを抱えたまま睡眠に入ると睡眠不足になる可能性があるとかないとか。

代わりにChatGPTに考えてもらう

鬱病やメンタル不調の状態って、まともな思考が出来ないことが多いです。

たまには考えることもやりたくないケースもあります。

そういうときはChatGPTに代わりに考えて貰おうという作戦。

ただ、考えて貰うために必要な情報をあらかじめ入力しなくちゃいけないので、

何回か前項のお悩み相談を行った後に考えて貰うのが良いと思う。

同じスレッド内であれば、前に入力した情報は覚えていてくれるので。

ChatGPTのペルソナを好みのキャラに設定する

ChatGPTが自分の好みっぽく応答してくれたら、それだけで会話が楽しくなります。

左下のアイコンから基本的な情報設定できるので、ここに入力しておくと、スレッドの先頭でペルソナ設定をする手間が省けます。

アジャイルvsウォーターフォール、どちらが優れている?

という話題がX(旧Twitter)上で繰り広げられていました。

自分はウォーターフォールはもちろん、アジャイルの現場を経験しています。

そして、アジャイルの現場を経験した際は、現場のリーダーからアジャイルについての説明を、2~3日かけてレクチャーして貰いました。

そこで得られた知見を元にすると、何の前提も無しに「アジャイルの方がウォーターフォールよりも優れている!」という人達は、

アジャイルをよく理解せずに現場を炎上させてきた人達じゃないかと思います。

実際レクチャー受けている時でも、誤解している人が多いっていう話です。

レクチャー受けている時は、そういう誤解を全て解消してくださいました。

そもそもの話、

アジャイルという開発方式は存在しない

ウォーターフォールは、要件定義をしっかり決めて、それに従って後戻りがないように仕様、設計、製造工程まで進め、

テスト工程を経て「設計通りに動作している」ことを確認する開発方式だと思います。

これは要件定義からリリースまで十分にスケジュールがあるから出来ることなんですよね。

ただ、最近のこの世の中、この開発方式が通用するのは一部だけで、

最近では、社会のニーズに合わせて、ソフトウェアを開発し提供しなければならない。

という流れがある事から、アジャイルという考えが生まれました。

このリンク先にあるのがアジャイル宣言と言われまして、

https://agilemanifesto.org/iso/ja/manifesto.html

これをベースに様々な開発手法が生まれました。

当時の現場では、スクラム開発という体制を敷いていて、スクラム開発についての説明もきちんと行って頂けました。

アジャイルと言えばスクラム開発が代表例ですが、他にも様々な開発フレームワークがあるようです。

整理しますと、

アジャイル→ソフトウェアの状態

スクラム開発→アジャイルを実現するための開発フレームワーク

と言うふうに教えて貰いました。

そもそもウォーターフォールの開発をアジャイルで置き換えることが出来るのか?

プロダクトの開発には、何もない状態から初版のプロダクトを完成させる、というプロセスが必ず必要になります。

この初版のプロダクトがとても重要で、すでに完成されているプロダクトを流用するのであれば良いのですが、

たいていの場合は要件定義をしっかり検討し、きちんと動く物を完成させる、というこれまでと同じ作業が発生します。

この作業をアジャイルに置き換えることは出来るのでしょうか?

アジャイルでは、要件定義からリリースまでの短い(だいたい1週間~1ヶ月が一般的)サイクルを繰り返す事でプロダクトを完成させていきます。

このときの要件定義の内容はサイクル内で完成できる内容でなければならないし、そうしなければ開発体制は崩壊します。

そして、サイクルの最後では必ず動くプロダクトを完成させなければ鳴りません。

はい、ここまで聞いた正しい認識を持った技術者なら、こんなのアジャイルじゃ無理じゃん!と思うはず。

ウォーターフォールとアジャイルにはそれぞれメリデメがあり、プロダクトの正確に合わせて最適な手法を選択する必要があります。

単純にウォーターフォールvsアジャイル、どちらが優れているかという議論はただただ不毛でしかありません。

もう一回アジャイルという物を学び直してください。

我々が経験したアジャイルの現場では、その特徴を十分に理解しているため、

プロダクトの初版リリースまではウォーターフォールで、それ以降のアップデートはアジャイルで開発を行っていました。

これはウォーターフォール、アジャイルの特徴を生かした最適解であると思っています。

JCOMのTVをPCで拝聴する方法。

オイラは以前までひかりTVを利用してテレビを見ていました。

ひかりTVの時代ではSonyのソフトウェアを使用して、ひかりTVのチューナーに接続して、放送中のTV番組を見たり、録画していたビデオを見ることが出来ていました。

JCOMでは専用のスマホアプリが無料で使用でき、そのアプリで同じ事が出来ていたのですが、

PCでの視聴に関しては、公式サイトを探しても見つからず、

ネット検索してもJCOM Streamという、JCOMが運営する有料動画配信サイトの情報がヒットするんですよね。

が、調べていて分かったんですが、

DLNAというメディアコンテンツをストリーミングで、いろんな機器で視聴できる規格がありまして、

この規格は以前のチューナーにも搭載されていて、専用アプリでチューナーに接続してテレビやビデオを視聴することが出来ます。

で、JCOMのテレビチューナーもDLNAのプレイヤーがあれば視聴できるのでは?と思いました。

DLNA自体は、実はこれを管理している団体が解散していて、

ネット検索をおこなったところ結構な数がヒットするのですが、

DLNAの専用アプリケーションの提供も終了しているのが大半でした。

しかしながら、Windowsストアに「DiXiM Play U」というアプリが提供されていて、

ねんのため、このソフトで試してみたところ、

JCOMのテレビをPCで見ることが出来ました!

無料版では数分間だけのお試し視聴ができますが、それ以上みたい場合はアカウントを3000円弱払ってアカウントを購入する必要があります。

【プログラミング】プログラミングスキル習得にC言語をオススメする理由。

正直、これを言うと賛否両論あると思いますが、

そもそも自分がC言語が最初に触ったプログラミング言語だからです。

自分は高専で本格的にC言語を学ぶ前に、

中学生時代に友人から無料コンパイラを手に入れて、

少しだけコードを書いて動かしていたことがあります。

まぁ、そんな自分でしたけど、最終的にポインタを理解できたのは会社に入ってからでしたけどね。

確かに他の言語と比べると、C言語は難しいです。

というか、みんな使っている言語は全てC言語の後に開発されたもので、

C言語の欠点を補う形で開発されました。

なので、ポインタやメモリの概念は意識しなくて済みましたが、

そこに大きな落とし穴があります。

メモリを意識することの重要性

メモリを意識しなくても良くなりましたが、メモリ自体は存在するからです。

これまで経験したのは、

Javaでガベージコレクションが働かない状態でオブジェクトが残ってて、動かしているとメモリを消費していく設計になっていたり、

AWSのLambdaを実行するとき、Pythonで大きなファイルを開こうとしたらメモリが足りなかったとか。

関数コール時にオブジェクトは参照型という話もありますが、

これもポインタによる参照渡しを、ポインタを使わずに利用できるようにしたもの。

参照渡しの場合、データがあるメモリアドレスを渡すだけなので、通常のデータ渡しよりも処理が早くなります。

CPUの動きが理解できる

プログラミング言語には3種類ありまして

(自分が高専時代は2種類と学びました)

  • コンパイル系(C、C++、Rust等)
  • 中間言語系(Java、C#等)
  • インタプリタ系(Python、PHP、Javascript等)

の3つです。

インタプリタ系は実行する度にプログラムコード読み込み、処理を行います。

扱いやすい言語ですが、動作は比較的遅いと言われています。

中間言語系はプログラムコードをビルドし、実行できる形に加工するのですが、

それを実行するためには別途仮想マシンというプログラムが必要になります。

これはビルドしたファイルがあれば、仮想マシンがある環境どこでも動作できるという特徴を持ちます。

コンパイル系はソースコードを機械語に翻訳し、そのままCPUが理解できる形に変換されます。

直接CPUが理解できる形式であるため、実行速度は速いとされています。

そして、もう一つ特徴があって、

機械語は逆アセンブルできるのです。

アセンブラは機械語の内容を人間が理解できる文字列に置き換えたもので、

これを読んでいけばCPUやプログラムがどんな動きをするのか?というのを理解できます。

CPUには独自の記憶領域「レジスタ」がありまして、

  • メモリからレジスタに値を読み出す
  • レジスタの値に対して計算する
  • レジスタにある計算結果をメモリに戻す

と言う動きを繰り返しています。

こういったCPU周りでどんなふうにプログラムが動いているか、というのが見えちゃいます。

C言語が出来れば他の言語の習得も早い

これは、

他のメジャーな言語がC言語以降に生まれたもの

ということと、

プログラミングに関する基本的な知識がC言語に詰まっている

ということから、

C言語が出来れば他の言語の習得も早いと言われています。

C言語の需要はまだありまして、

組み込みプログラミングの世界では未だにC言語が主流です。

OS周りはRustに置き換えるという話もありますけどね。

他の言語はフレームワークが発達しているので

フレームワークの習得の方が大変かもしれない。

まぁ、これは他の言語を学んでいたとしても必ず出てくる壁なので。

しかも今は昔と違ってコンパイラが簡単に手に入るので、

学習のためのハードルがかなり下がりました。

みんなも余力があればC言語に挑戦してみましょう。

【DOCKER】【GITLAB】DOCKER環境のGITLABサーバからメール通知を送信できるようにする。

前回の続き。

【Docker】【GitLab】WindowsのDocker環境にGitLabサーバを立ち上げる。 | 自分、ぼっちですが何か? (taki-lab.site)

GitLabサーバからメール通知を送信できるようにします。

今回もこちらのサイトを参考にしています。

https://e-penguiner.com/gitlab-with-docker-onpremise/#index_id11

この中ではSTMPサーバとしてGmailを利用しているので、同じようにします。

つまりGmailのアカウントからGitlabの通知メールが届くイメージですね。

これを可能にするためには、Gmailのアカウント設定を変更し、

二段階認証を設定する

アプリパスワードを設定する

という手順が必要になります。

二段階認証を設定する

こちらのサイトに説明が書いてあります。

https://e-penguiner.com/app-passwd-two-step-verification-for-gmail/

アカウントの設定から二段階認証を有効にします。

このとき、電話番号を入力し、SMSで受信した番号を入力する必要があります。

この手順を完了すると、アプリパスワードの項目が表示されるようになります。

アプリパスワードを設定する

アプリパスワードの項目から進んでいくと、16桁の英数字が表示されます。

この値は今後表示されることは無いので、必ずメモしてください。

gitlab.rbの設定

/srv/gitlab/config/gitlab.rbを編集します。

...
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "your-email@gmail.com"
gitlab_rails['smtp_password'] = "your-password"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

smtp_user_nameとsmtp_passwordは自分の環境に合わせて書き換えてください。

smtp_user_nameはGmailアカウントのメールアドレス、

smtp_passwordはアプリパスワード16桁の英数字を記入します(スペースは不要)。

保存したら設定の読み込み。

docker-compose exec gitlab gitlab-ctl reconfigure

そしてサーバ再起動。

 docker-compose exec gitlab gitlab-ctl restart

ブラウザからGitlabにrootでログインし、ユーザーセッティングの画面へ。

Gmailのメールアドレスを入力すると、正しく設定できていれば、確認用のメールが届くので、リンクをクリックして認証を完了させる。

ドメインが合っていない場合はリンク先のドメインを良い感じに変更してください。

コンテナ作成時に設定を反映させる

以下のようにdocker-compose.ymlを修正すると、Dockerビルド時にここまでの設定変更を反映できます。

version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com:8080'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        nginx['listen_port'] = 80
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.gmail.com"
        gitlab_rails['smtp_port'] = 587
        gitlab_rails['smtp_user_name'] = "your-email@gmail.com"
        gitlab_rails['smtp_password'] = "your-password"
        gitlab_rails['smtp_domain'] = "smtp.gmail.com"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
        gitlab_rails['smtp_tls'] = false
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
    ports:
      - '8080:80'
      - '2222:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab' 

【Docker】【GitLab】WindowsのDocker環境にGitLabサーバを立ち上げる。

こちらの記事を参考にしました。

https://e-penguiner.com/gitlab-with-docker-onpremise/#google_vignette

今回はローカルのみでの利用を想定しているので、暗号化はしません。

前提条件として、WSL2の有効化とDocker Desktopのインストールが必要です。

そして作業はWindowsストアアプリからLinuxをインストールして、Linux上に構築します。

GitLabサーバの立ち上げ

適当なフォルダを作成し、そのなかにdocker-cmpose.ymlファイルを作成。

version: '3'
services:
  gitlab:
    image: 'gitlab/gitlab-ee:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com:8080'
        gitlab_rails['gitlab_shell_ssh_port'] = 2222
        nginx['listen_port'] = 80
    ports:
      - '8080:80'
      - '2222:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'
      

これの内容を説明すると、

Docker作成時に、GitLabの最新バージョンを使用します。

※念のため言うと、実際業務で使用する場合は必ず特定のバージョンを指定するらしい。今回のように常に最新バージョンはアウト。

ポート番号はホスト側8080とコンテナ側80、ホスト側2222とコンテナ側22が接続されます。

80はhttp、22はsshのデフォルトポート番号ですね。

別の番号を使用する場合は設定変更が必要です。

volumesにコンテナのディレクトリにホストのディレクトリをマウントさせます。

この設定では、

コンテナ /etc/gitlab – ホスト /srv/gitlab/config
コンテナ /var/log/gitlab – ホスト /srv/gitlab/logs
コンテナ /var/opt/gitlab – ホスト /srv/gitlab/data

つまりコンテナ側で作成したファイルが、ホストの上のディレクトリに出力されるわけですね。

これでコンテナを立ち上げます。

docker-compose up -d

立ち上がり完了まで待ちます。(結構時間かかります)

docker-compose ps

これで、statusがhealthyと表示されれば立ち上がり完了です。

ブラウザでhttp://自分のIPアドレス:8080にアクセスしてGitLabの画面が表示されればOKです。

rootパスワードの設定

Linuxのコンソールで以下のコマンドを入力します。

docker-compose exec gitlab gitlab-rails console -e production

Rubyのコンソールに切り替わるので、以下のコマンドを入力します。

user = User.where(id: 1).first
user.password = '新しいパスワード'
user.password_confirmation = '新しいパスワード'
user.save!
exit

パスワードは複雑な文字列で入力しないとエラーになります。

正常に入力完了したらログイン画面からrootでログインできることを確認して、

ログイン出来たらOK。