内部統制の基本的要素

  • 統制環境
  • リスクの評価と対応
  • 統制活動
  • 情報と伝達
  • モニタリング
  • ITへの対応

www.search-firm.co.jp

MySQLに対して特定の条件下でインポートを行うと文字化けが発生する

【事象】
特定の条件下でインポートを行うと文字化けが発生していた。
(同じサーバーに対して別の人がインポートした処理は文字化けが発生していなかった)

【原因】
WindowsCLI(DOSプロンプト)でmysqlSQLをインポートすると文字化けが発生していた。

【詳解】
利用しているサーバーにMySQL Workbenchで接続し文字コードを確認した。

f:id:yoneyore:20210717160209p:plain
MySQL Workbenchで接続した結果

その後、WindowscliMySQL Workbench内にあるmysql.exeを用いて、同じサーバーで同様の確認を行った。

f:id:yoneyore:20210717160423p:plain
DOSプロンプトでCLI接続した結果

結果、同じSQLを実行しているのに、別の結果が返ってきた。
WindowsDOSプロンプトの文字コードはCP932である。
そのため、どうもmysqlCLIモードで実行すると、character_set_clientをCP932で送っているからと思われる。
(なお、パケットの観察までは行っていない)

【対応方法】
1.skip-character-set-client-handshakeをサーバーに設定する。
2.mysql.exeで接続する際にdefault-character-setなど文字コードのパラメータを付与する。
3.DOSプロンプトの文字コードをchcp 65001で変更してから接続する。

f:id:yoneyore:20210717161130p:plain
chcp 65001実行後のコンソールで実行した結果(それ以外何も変更点無)

my.cnf/my.iniの優先順位とオプショングループ

my.cnf/my.iniの優先順位

マニュアルにきちんと記載してくれている。
dev.mysql.com

表 4.1 Windows システムで読み取られるオプションファイル
もしくは
表 4.2 Unix および Unix-Like システムで読み取られるオプションファイル
に記載されている順番を参照すれば良い。

なお、my.cnfに全ての設定が定義できる訳ではない。
どのパラメータが設定できる/できないは以下を参考にすれば良い。
dev.mysql.com
また、MySQL8.0ではSET PERSIST句という機能が新しく用意されており、
my.cnfよりも更に優先順位高く設定が行われる上に、
当機能を利用すればmy.cnfで定義できないパラメータも指定可能である。
但し、mysqld-auto.cnfという別の場所に定義されるため管理が猥雑になる欠点もある。
blog.s-style.co.jp

オプショングループ

my.cnfの[mysqld]や[client]という記述はオプショングループという定義である。

4.2.2.2 オプションファイルの使用
(中略)
オプションファイル構文
(中略)
[group]
group はオプションを設定するプログラムまたはグループの名前です。 グループ行のあと、すべてのオプション設定行は、オプションファイルが終了するか、または別のグループ行が指定されるまで、名前を指定したグループに適用されます。 オプショングループ名では、大文字と小文字は区別されません。

そのため、ここの記述無視して書いてると痛い目をみる。
(AmazonRDSのパラメータグループとか普段利用していて、dockerとかで利用する時に忘れてるとやらかす)
よって、同じ定義をしているのは、意味がある。

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock

なお、オプショングループは以下の特性がある。
・オプショングループ名は同じプログラム名に適応される。
・clientオプショングループは、mysqlだけでなくMySQLクライアント全体に適応される
・client、mysqlみたいな包括関係がある場合は、オプショングループで同じ値を指定すると後勝ちになる
【関連リンク】
yoneyore.hatenablog.com

Linuxのスワップをクリアするコマンド

[前提条件]
スワップで利用しているメモリが物理側に移動しても問題ないことを確認しておくこと
・キャッシュも勘案して問題ないか確認しておくこと
 (結局それを勘案すると足りなさそうなのであれば、一時しのぎにしかならない)


[コマンド]

swapoff -a && swapon -a


[注意事項]
・実行すると処理が終わるのにしばらく時間がかかる
 swapoffコマンドが徐々にスワップで利用していた分を実メモリに移してくから
 一方、swaponコマンドは数回程度で一気にスワップ領域を生成する
・CPUもそれなりに当コマンドで持っていかれる
・そのため、実行する際には出来るだけサーバーが落ち着いた状態で実施すること
 (メモリ足りなくてトラブってるから投入するみたいなコマンドのたぐいではないと思う)


[その他]
・キャッシュをクリアするコマンド

sync;sync;sync;sleep 3;echo 3 > /proc/sys/vm/drop_caches


・メモリ、キャッシュ、スワップの使用率確認方法
バージョンによって動きが違う
nopipi.hatenablog.com

Amazon CorrettoにおけるJMC・JFRの利用方法

前提

AWS Correttoで調べた内容にて記載
但し、他のOpenJDKにおいても殆ど同じ(はず)

概要

JVMのヒープの状況やスレッドの情報などを確認するためのツール
JMCとJFRの主な違いは以下の通り

JMC[JDK Mission Control]
  • GUIで確認するためのツール
  • リアルタイムで観測可能
  • JFRで取得した結果を可視化
JFR[JDK Flight Recorder]
  • 指定した期間イベントを記録するためのツール
  • 低負荷で観測することが可能

JMC、JFR共にJava7で提供されていたが、当時は本番利用はサブスクリプションが必要だった。
しかし、Oracle社がOpenJDKに寄贈してくれたので、Java11で本番でも無償利用可能になった。
また、Java8でも利用できる様にバックポート対応してくれた。
Amazon Corretto 8u262 と Corretto 11.0.8 が利用可能に
そのため、古いブログの記事とかでは本番ではライセンスが必要とか、
起動する際にUnlockCommercialFeaturesみたいなオプションが必要だったのは上記背景がある。

入手方法

JMC

Correttoには2021年6月時点では同梱されていない。
別途配布が行われているので、こちらから取得可能である。
(以下のページのDownloadに記載しているrelease pageから取得可能)
GitHub - corretto/corretto-jmc: A build of JDK Mission Control (JMC) by the Corretto team.

JFR

Correttoに同梱されている。

起動方法

JMC

JMC自身はjmc.exeを起動すれば良い。
JMC8.0.0.1 Windows版においては、ようこそ画面は文字化けして起動する。
(jmc.iniでfile.encodingをUTF8を指定したが変わらずであった)

f:id:yoneyore:20210606011959p:plain
閉じるとそれ以降は文字化けしていない

接続対象に関しては、ローカルとそれ以外で接続方法が異なる。

[ローカル]
勝手にJMCが検出してくれる。
(JDP[Java Discovery Protocol ]という機構で検出してくれている)

[ローカル以外]
JMXを有効化しておく必要がある。

(Javaプロセス起動時)

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=ポート番号
-Dcom.sun.management.jmxremote.rmi.port=ポート番号(上と同じで可)
-Dcom.sun.management.jmxremote.authenticat=false
-Dcom.sun.management.jmxremote.ssl=false

(Javaプロセス起動後)

jcmd Javaプロセス番号 ManagementAgent.start jmxremote.port=ポート番号 jmxremote.rmi.port=ポート番号 jmxremote.authenticate=false jmxremote.ssl=false

jcmdの上記オプションを忘れてしまった場合、以下の手順で確認できる。
1.jmc上で任意のプロセス(jmc自身でもOK)を選択
2.右クリックし、リモートJMXエージェントの制御を選択
3.以下の様なコンソールが現れる。
  オプションなど変更すると、一番下にjcmdでどの様なコマンドを発行するのか確認可能

f:id:yoneyore:20210606234635p:plain
なお、JMXの稼働状況確認や起動・停止することも可能
JFR

[jmc経由]
予めJMCでJFRを実行したいJavaプロセスと接続を行っておく必要がある。
その後、対象プロセスを選択した状態で右クリックを行い、フライト記録の開始を選択する。
するとフライト記録の開始というウィザードが表示される。
内容に従いながら設定することで記録が開始される。

[jcmd経由]
例) 1分録画する場合

jcmd Javaプロセス番号 JFR.start name=test maxage=1m filename=c:\temp\hogehoge.jfr

オプション詳細はJavaコマンドマニュアルのAdvanced Runtime Options for Java当たりから記載有
(但し、他のオプションも入り乱れている)

利用方法

他のサイトやYoutube上で沢山解説してくれている。

公式、英語だけど字幕&翻訳機能使えばだいたい追える
www.youtube.com
RedHatさんの公式ブログ
OpenJDK 8uでJDK Flight Recorderの入門 - 赤帽エンジニアブログ

P26~P39当たりに記載有
それ以外の部分もMTAやGC Viewerなど聞いたこと無いという人は是非見るべき資料
Javaの障害解析に関する道しるべ的良い資料
speakerdeck.com

その他

リモート接続がうまくいかない

どうもリモート接続するとうまくいかないケースがある。
原因としては、rmi接続する時の名前解決がうまくいかない場合に発生する模様である。
(IPv4で解決するところと、IPv6で解決するところが混在した場合に起きている?)
加えて、com.sun.management.jmxremote.local.onlyがtrueになっていた。
最適解では無いであろうが、以下の方法を行う事で接続できる様になった。

  • 接続対象のJava起動時に、 java.rmi.server.hostname=接続対象のIPv4アドレス を指定する
  • 接続対象のJavaJMX起動時に、 jmxremote.host=接続対象のIPv4アドレス を指定する
認証やSSLの設定を行いたい

Windowsのがうまく設定できないので、実現出来た時に纏める
Linuxの場合の対応方法
www.programmersought.com

jcmdで良く利用するコマンド
# JMXの起動(上記解説の通り、別途オプションが色々必要)
jcmd Javaプロセス番号 ManagementAgent.start
# JMXの状態確認
jcmd Javaプロセス番号 ManagementAgent.status
# JMXの停止
jcmd Javaプロセス番号 ManagementAgent.stop
# 起動引数の確認
jcmd Javaプロセス番号 VM.command_line
# system.propertyの値の確認
jcmd Javaプロセス番号 VM.system_properties
# VMフラグの値を出力(-allで全量出力)
jcmd Javaプロセス番号 VM.flags
# スレッドダンプ取得(-lで詳細出力)
jcmd Javaプロセス番号 Thread.print
# ヒープダンプ取得(-allでファントム参照も含める、引数無の場合はフルGC後取得)
jcmd Javaプロセス番号 GC.heap_dump filename=c:\temp\hogehoge.dump

詳しく知りたい場合は、JavaSE11のマニュアル jcmdユーティリティを参照すれば良い。

参考資料

JDK11のJMCのマニュアル、今は分かりにくい
JDK Mission Control | Oracle 日本
JDK7のJMCのマニュアル、古いけど日本語で読みたいなら今はこっち
Java Platform, Standard Edition Java Mission Control ユーザーガイド
JFRに関する解説を記載してくれている
目次 · 入門: JDK Flight Recoder
JFR Event Streamingについて
【NADP】JFR Event Streamingについて(デモ解説その1) | インサイト - Natic | 日商エレクトロニクス
トラブルシューティングについてどうやってしていけばいいのか丁寧に解説してくれている
youtu.be
古い本であるが、現代においても体系的に学習するのにとてもいい本

現場で使えるデバック&トラブルシュートが理解できる様になってから買った方がいいかも基礎が身についてないと感じたらこの本がお勧め
ストレージやCPUで遅くなる理由などがイメージしやすくなる

認証・認可関連の本(2021年5末時点)

あまり認証や認可に関する本が無いので纏めてみた。
この中でピンとくるもの無ければ、Web界隈を追い求める方が良さげ。
(英語本、技術書典界隈追えてないのでもっとあるかもだけど…)

OpenID Connect入門: 概念からセキュリティまで体系的に押さえる

新しいけど、Kindleでしか今は買えなさそう

【電子版】雰囲気でOAuth2.0を使っているエンジニアがOAuth2.0を整理して、手を動かしながら学べる本

今のところ電子版、booth経由の購入のみ
authya.booth.pm

【電子版】OAuth、OAuth認証OpenID Connectの違いを整理して理解できる本

今のところ電子版、booth経由の購入のみ
booth.pm

OAuth徹底入門

かなりお堅い、OAuth自体を用いて基盤作る人向け?

「Auth0」で作る!認証付きシングルページアプリケーション

2018年8月と少し古い、初心者向け本の模様

認証関連

Software Design (ソフトウェアデザイン) 2020年11月号

雑誌なので、最初に読むものとしてはとっかかりやすい

日経ITエンジニアスクール 暗号と認証 最強の指南書

認証周りも含めた基礎知識固めるための本、この辺知識手薄で情報処理試験真面目に受けてない人は読んだ方がいいかも

パスワード認証最強論

パスワードとは?という本質を理解するための本、読み物、現時点ではKindleでしか買えなさそう

マイクロサービスパターン

認証のことが載っているのはP524~525位
本事態はとても良い本であるが、認証のために期待して買う本ではない(認証とかキーワード打ったらレコメンドされるので)

セキュリティ界隈

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版

徳丸本、開発するのに読んでない人は開発止めてでも読むべき本(見える風景が変わるはず[読むのに時間は必要])

徳丸浩のWebセキュリティ教室

徳丸本では心が折れそう、全く歯が立たない人に向けた本(という認識)

【電子版】OAuth・OIDCへの攻撃と対策を整理して理解できる本(リダイレクトへの攻撃編

今のところ電子版、booth経由の購入のみ
authya.booth.pm

バイナリレベルで再帰的にファイル群を比較したい

【前提条件】
・ファイルの構造が同一であるが、中身が多少異なるディレクトリ同士を比較したい
・仮に/tmp/aと/tmp/b配下の全てのファイルを比較したいとする

【コマンド】

cd /tmp/a
find . -type f -exec cmp '{}' /tmp/b/'{}' \;

【その他】
・テキストレベルで再帰的に比較したい

diff -r /tmp/a /tmp/b

・差異があるかどうかだけを比較したい

cd /tmp/a
find . -type f -exec sha512sum '{}' \; | sort > ../a.txt
cd /tmp/b
find . -type f -exec sha512sum '{}' \; | sort > ../b.txt
diff /tmp/a.txt /tmp/b.txt