2020-08-18 MySQLにauth_tcprivを組み込んで試してmake installしてなくて大ハマリしたけど最終的にうまくいった

  • 大体実装ができてきたので、tcp_save_syn_listenをLD_PRELOADしたmysqldにuserを作って、その認証にauth_tcprivプラグインを使うように設定して検証していた
  • うまくいかなくてauth_tcprivをデバッグしながらコンパイルしても1時間ぐらいうまくいかず、なんだなんだと頭を抱えていたらmake installを忘れていた.......
    • 実際にはコードは正しく動いていたし、設定も正しかった
    • バイナリを新しくできていなかったというオチ
    • それで一時間ハマり続けた
  • こういう新しいでかいミドルウェアの中身を触るときには、それのお作法とかミドルウェアの細かい実装がまだ頭に入っていないので、どうしても自分のコードやミドルウェアに入れた設定を疑いがちだけどそうではなくて、結局もっと基本的なところでミスっているというよくある例
    • 自分が調べたり書いたコードをもう少し信じて、もっと根本的なところのミスを切り分けるということをこれまで幾度となく経験してきたけど、新しい巨大ソフトウェアを触るとはまりがち
    • 気をつけていきたい
    • 作法がわかってきたら、切り分けができるようになって、これ絶対バイナリ更新されてないだろ、とかそういうふうに気づけるようになる
  • その結果、IPv6周りなどでsetsockoptとgetsockoptがエラー吐いている事がわかったので、明日以降はそのへんを調査していく
  • と思ったけど、気になってコード書き直してたらうまくいった!
kill `pgrep mysqld`; sleep 2 && LD_PRELOAD=/usr/local/mysql_tcpriv/bin/tcp_save_syn_listen.so /usr/local/mysql_tcpriv/bin/mysqld --user=vagrant --basedir=/usr/local/mysql_tcpriv --datadir=/usr/local/mysql_tcpriv/data --log-error-verbosity=3 &
  • こんな感じでリモートのmysqlクライアントのuidによって認証・認可を行える

  • mysqlクライアント

vagrant@client:~$ id && mysql -u 1001 -h 192.168.0.3 --port=13306 
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),111(lxd),118(lpadmin),119(sambashare)
ERROR 1698 (28000): Access denied for user '1001'@'192.168.0.2'


vagrant@client:~$ id && mysql -u 1000 -h 192.168.0.3 --port=13306 
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),111(lxd),118(lpadmin),119(sambashare)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.21-tcpriv tcpriv

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • mysqlサーバログ
auth_tcpriv debug: remote_uid=1000 auth_uid=1001
auth_tcpriv debug: don't match remote uid with auth uid: remote_uid=1000 auth_uid=1001
2020-08-18T10:46:40.180142Z 8 [Note] [MY-010925] [Server] Access denied for user '1001'@'192.168.0.2'

auth_tcpriv debug: remote_uid=1000 auth_uid=1000
auth_tcpriv debug: match remote uid with auth uid: remote_uid=1000 auth_uid=1000