20210107のLinuxに関する記事は6件です。

透過Proxyを設定したら証明書なしに何故か動いちゃった話

こちらの投稿
Squid proxy - a short guide (forward & transparent proxy examples, SSL bumping, links to guides) -Reddit
などを参考にSquidで透過Proxyの設定をしたら,自己署名ルート証明書を追加せずに動いちゃった話です。

環境

PC: ThinkPad T490 Arch Linux
認証付きProxy必須の環境
Azure上に構築したHTTP ProxyをSSHポートフォワーディングで持ってきている
create_apでWi-Fiを飛ばしていて,スマホはDronyを使いHTTP Proxy非対応のアプリもProxy経由で通信できるようにしている

Squidで複数のProxyを操る -Qiita より

設定ファイルとか

proxy.server.jp:8080(仮)と0.0.0.0:8888を親に持つSquidの設定ファイル:

/etc/squid/squid.conf
#
# Recommended minimum configuration:
#

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

#
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

on_unsupported_protocol tunnel all
# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

cache_peer proxy.server.jp parent 8080 0 no-query no-netdb-exchange no-digest login=USER:PASS
proxy-only
cache_peer 0.0.0.0    parent 8888 0 no-query no-netdb-exchange no-digest default

acl sorting time SMTWHF 1:00-6:00
acl blacklist dstdomain "/usr/local/etc/squid/blacklist"
acl blog url_regex blog
acl blacklist_day dstdomain "/usr/local/etc/squid/blacklist_day"

acl status http_status !200

http_port 7080 intercept
https_port 7443 intercept ssl-bump \
 generate-host-certificates=on \
 dynamic_cert_mem_cache_size=4MB \
 cert=/etc/squid/cert/myCA.pem \
 key=/etc/squid/cert/myCA.pem

acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3

#ssl_bump peek step1    # <- enabling this breaks it
ssl_bump stare step2
ssl_bump bump step3
# Uncommenting this may also break bumping.
#ssl_bump bump all
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow all


# And finally deny all other access to this proxy
http_access deny all

# Squid normally listens to port 3128
http_port 3354
icp_port 0

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/cache/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/cache/squid

#
# Add any of your own refresh_pattern entries above these.
#
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

# サブProxyがあれば設定

# ローカルネットワークセグメントには親プロキシを通さずダイレクトアクセス
acl developersegments1 dst 192.168.0.0/24
always_direct allow developersegments1

never_direct allow all

# キャッシュしない
cache deny all

#cache_peer_access proxy.server.jp deny sorting
cache_peer_access proxy.server.jp deny blacklist sorting
cache_peer_access proxy.server.jp deny blog sorting
cache_peer_access proxy.server.jp deny blacklist_day
cache_peer_access proxy.server.jp deny status

iptablesで追加した設定
ap0に端末(スマートフォン)が接続されている

iptables -t nat -A PREROUTING -i ap0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 7080
iptables -t nat -A PREROUTING -i ap0 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 7443

理由

†原因究明中†

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RaspberryPi 4 Model B で USBポートの電源をON/OFFする

やりたかったこと

ラズパイに接続したwebカメラで異常検出を行い、異常ケースでパトランプを回す、というようなことがしたかった。
(正確にはこれからやる予定)
色々調べた結果、USB連動で電源ON/OFFするのが、最も手軽&電子工作等しなくてもできそうだったのですが、懸念点がいくつか。

  • 世の中にラズパイ4での記事が無い
  • ラズパイ3ではUSBポートの親子関係?があり、色々面倒らしい
    • 回避策としては、個別給電ON/OFFに対応している別のUSB-Hubを挟むといいらしい

やりたいことが「USBカメラ」を回して監視しつつ、「USB電源制御」で別の機器を動かしたい、というニーズなので、個別にON/OFFできないのは致命的…。
が、しかしラズパイ4ではUSB3.0ポートが搭載されたりとハードウェア的に大きく変わっているので、できるのでは…?
ということでやってみましたー。

結論:できた

完全に個別でON/OFFできました!完全勝利!

用意したもの

  • RaspberryPi 4 Model B
  • USB接続のwebカメラ
  • USB給電で動くガジェット(今回は適当なものがなかったのでそのへんに落ちてた有線マウス)

検証手順

  • USBポートのうち1つにカメラを接続し、VedeoStreamを開いて表示
  • の状態で残りのポートにUSB給電ガジェットを接続して、電源OFF
  • VedeoStreamが止まらない=カメラへの給電が止まらないことを確認
  • 以上をポート毎にぐるぐる検証

実際の手順

hub-ctrl導入

sudo apt-get install libusb-dev
wget http://www.gniibe.org/oitoite/ac-power-control-by-USB-hub/hub-ctrl.c
gcc -O2 hub-ctrl.c -o hub-ctrl-armhf-static -lusb -static
sudo cp hub-ctrl-armhf-static /usr/local/bin/hub-ctrl

USBポートの状態を確認

この場合。ポート2にカメラ、ポート4にマウスが刺さっている。

sudo lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 027: ID 05ac:0304 Apple, Inc. Mighty Mouse [Mitsumi, M1152]
Bus 001 Device 026: ID 1e4e:0100 Cubeternet WebCam
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

USB2.0と3.0で別々のrootを持っているらしいことが分かる。

sudo hub-ctrl -v
Hub #0 at 002:001
 INFO: ganged switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
Hub #1 at 001:002
 INFO: ganged switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0103 power enable connect
   Port 3: 0000.0100 power
   Port 4: 0000.0303 lowspeed power enable connect
Hub #2 at 001:001
 INFO: individual power switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect

Hub #1がUSB関連、Hub #2がイーサネットらしい。
こっちでは結局USB2.0も3.0も同じHubに属している。
物理的配置はこんな感じ。
ラズパイ3ではPort2からだったのが1からになってるのがちょっといい感じ。

 LAN
+---+  Port1 Port2(USB3.0)
|   |
+---+  Port3 Port4(USB2.0)

給電制御してみる

sudo hub-ctrl -b 1 -d 2 -P 4 -p 0 -v
 Hub Port Status:
Hub #1 at 001:002
 INFO: ganged switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0103 power enable connect
   Port 3: 0000.0100 power
   Port 4: 0000.0303 lowspeed power enable connect
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect
Send control message (REQUEST=1, FEATURE=8, INDEX=4)
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0103 power enable connect
   Port 3: 0000.0100 power
   Port 4: 0000.0000

コマンドオプション

-b バスNo Hub #1 at 001:002の001の方
-d デバイスNo Hub #1 at 001:002の002の方 ※lsusbで出てくるDeviceは関係ない
-P PortNo(USBポートの番号)
-p 0:OFF 1:ON
-v 詳細表示オプション(普段はつけなくて良い)

参考記事

raspberry pi 3 b+とパトランプで遊ぶ - 不動産情報ボット
RaspberryPI 3 Model B で USBポートの電源をON/OFFする: パソコン鳥のブログ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

samba纏め

サーバープロセス

サーバープロセス 説明
smbd ファイル共有、認証など
nmbd ブラウジング機能、NetBIOS名前解決、WINSサーバーなど
winbindd Winbind機能

ポート番号

ポート番号 説明
137/UDP NetBIOS名前解決やブラウジング
138/UDP NetBIOS名前解決やドメインログオン
139/TCP ファイル共有
445/TCP ファイル共有

smb.conf

globalセクション

  • Samba全体に関わる設定を行います。
  • 変更をした場合、Sambaの再起動が必要です。
  • globalセクションで設定した項目が、以降のセクションで現れた場合は、設定が上書きされます。
パラメータ 説明
workgroup Sambaサーバーが、所属するワークグループ名もしくはドメイン名を指定します。
server role Sambaサーバーの動作モードを指定します。
netbios name SambaサーバーのNetBIOS名を指定する。
server string サーバの名前など説明を記述する。
hosts allow 接続を許可すホストを指定する。(指定しなかったホストは拒否される。)
guest account アカウントが存在しないユーザーにGuestとしてアクセスする場合に利用する。
map to guest Sambaユーザーとして認証できなかった場合の動作を指定する。
Never : ゲスト認証を許可しない。
Bad User : 存在しないユーザーを指定された場合は、ゲスト認証であるとみなし、guest accountで定義されたユーザーでログインする。
Bad Passwor : 上記に加えて、パスワード入力ミスの場合もゲスト認証であるとみなす。
log file ログファイルを指定する。接続元ホストを示す変数「%m」を使うと、接続元ホストごとにログファイルを分けれる
max log size ログファイルの最大サイズを指定する。値が0の場合は、制限は行われない。
encrypt passwords 暗号化パスワードを利用する。この値はYes以外利用するべきではない。
smb passwd file パスワード認証をsmbpasswd方式で行う場合のパスワードファイルを指定する。
unix password sync SambaのパスワードとLinuxのパスワードを同期させるか。
passwd program unix password syncを有効にした場合、Samba側でパスワードを変更した際に実行するプログラム。
passwd chat unix password syncを有効にした場の応答内容。
username map UNIXユーザーを別のユーザーとマッピングさせるファイルを指定する。
logon script ログオン時に実行するスクリプトファイルを指定する。
wins support WINSサーバーとして動作させる。
wins server WINSサーバーのIPアドレスを指定する。

共有

パラメータ 説明
comment コメントを指定。
browseable ブラウジングし他時に表示されるかどうかを指定する。ただし、共有名を直接指定するとアクセスすることができます。
writable 書き込みを許可するかどうかを指定する。
read only writableの逆の意味。
write list 書き込みが例外的に許可されるユーザーを指定します。グループを指定する時は、@
path 共有ディレクトリのパスを指定する。
force user 共有内に作成するファイルやディレクトリの所有者、所有グループを、強制的に指定したユーザーにします。
force group 共有内に作成するファイルやディレクトリの所有者、所有グループを、強制的に指定したグループにします。
hide dot files 隠し属性を適用するかどうか。
hide files 任意のファイルやディレクトリを表示させたくない場合、その名前を指定する。
veto files 表示もアクセスもさせたくないファイルやディレクトリを指定する。
create mask ファイルに適用可能なパーミッション 0744
directory mask ディレクトリに適用可能なパーミッション 0755
force create mask 必ずファイルに適用されるパーミッション 0000
force directory mask 必ずディレクトリに適用されるパーミッション 0000
valid users アクセス可能なユーザーを指定する。グループを指定する時は、@
guest ok guestログインを許可するかどうかそ指定する。
public guestログインを許可するかどうかそ指定する。

homes

  • UNIXユーザーの各ホームディレクトリを一括して共有するためのセクション。
  • ユーザーごとに、ホームディレクトリの共有を定義す必要がありません。
smb.conf
[homes]
 comment = Home Directiry
 browseable = No
 writable = Yes

printers

パラメータ 説明
print ok プリンタ共有として利用する。
printable プリンタ共有として利用する。
smb.conf
[printers]
 comment = ALL printers
 path = /var/spool/samba
 browseable = no
 guest ok = no
 writable = no
 printable = Yes

個々

  • 任意の名前の共有を作成することができます。
smb.conf
[public]
 comment = Public
 path = /home/samba/piblic
 public = Yes
 writable = No
 writa list = @memmber
smb.conf
[tmp]
 comment = tmp
 path = /tmp
 read only = no
 public = Yes
smb.conf
[secret$]
 path = /var/samba/secret
 valid users = @super

testparm

  • smb.conf の構文にミスがないかチェックを行う。

ログ

  • Sambaは、syslogを介さずに独自にログを処理します。
  • /var/log/sambaディレクトリ以下などに、いくつかのファイルに分かれて出される。

マスターブラウザの設定

  • ワークグループ単位と、ドメイン単位で存在します。
  • どのホストがマスターブラウザになるかは、OSの種類による優先度に基づいて選出される。
  • samba自身をドメインコントローラにする場合、33以上にすれば優先的に選出される。
パラメータ 説明
local master ローカルマスターブラウザのブラウザ選出に参加する(選出されるとか限らない)
domain master ドメインマスターブラウザに選出されるようになる。
preferred master ブラウザ選定を促す。
os level 優先度

認証の設定

パラメータ

  • クライアントがどのようにSambaに応答するかを指定する。
パラメータ 説明
security デフォルトは、「USER」です。
この場合smb passwdファイルなどを使って認証を行います。
Sambaユーザーアカウントとパスワードが必要です。

ユーザー管理

smbpasswd

  • Samba2で利用されていた方式でテキスト形式のパスワードファイル(/etc/samba/smbpasswd)にユーザー情報を1ユーザー1行で格納します。
  • Samba3系の一部でもデフォルトのバックエンドデータベースですが、Sambaで扱えるユーザー項目の一部しか格納できません。
smb.conf
passdb backend = smbpasswd

tdbsam

  • バイナリ形式のデータベースファイル(/etc/samba/passdb.tdb)にユーザー情報を格納します。
  • Sambaで扱えるユーザー情報の全項目を格納できます。
smb.conf
passdb backend = tdbsam:/etc/samba/passdb.tdb

ldapsam

  • LDAPサーバーにユーザー情報を格納します。
  • 別途LDAPサーバーが必要ですが、多数のユーザーを扱う場合に適しています。
smb.conf
passdb backend = ldapsam:ldap://LDAPサーバー名[:ポート番号]

コマンド

pdbedit

オプション 説明
-L 一覧表示
-a 追加
-x 削除

smbpasswd

オプション 説明
-d 無効化
-e 有効化
-x 削除

管理コマンド

コマンド 説明
smbcontrol Sambaサーバーを構成するそれぞれのデーモンにメッセージを送って制御する。
smbstatus Sambaサーバーに接続されているクライアント、使用中の共有、ロックされているファイルを共有する。
nbmlookup NetBIOS名を問い合わせたり、NetBIOS名からIPアドレスを検索する。

Sambaクライアント(smbclient)

オプション 説明
-L リスト表示を要求する
-N 認証を行わない
-U 接続あするユーザーを指定する
サブコマンド 説明
cd 移動
del 削除
サブコマンド 説明
dir リスト表示
exit 終了
get 取得
mget 纏めて取得
mkdir ディレクトリ作成
mput 纏めて転送
lcd ローカル側のディレクトリを移動
put 転送
mdir ディレクトリを削除

ACL

smb.conf
vfs objects = acl_xattr
map acl inherit = yes
store dos attributes =yes

getfacl

  • ACLエントリを表示する。
ACLエントリ 説明
user 所有者①
group 所有グループ②
other その他のユーザー③
user:USER ユーザーUSER④
group:GROUP グループGROUP⑤
mask マスク値、②④⑤に適用

※mask:誤って大きなアクセス権を与えてしまうことを防いだり、一時的に所有者以外のアクセス権を制限したりすることができる。
(#ehhective; と表示される。)

setfacl

  • ACLを設定する。
オプション 説明
-m 追加、もしくは変更する。
-x 削除する。
--remove-all すべて削除する。

リンク

Amazon EC2(Amazon linux)のファイルサーバ構築
Amazon Linux 2でSambaを構築する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OOM Killerの対象外にしたい(CentOS7)

Out of Memory が発生した場合でもプロセスを落とされたくない場合、
/etc/systemd/system 等の配下にあるsystemd用ファイルに以下を設定する。

[Service]
~~省略~~
OOMScoreAdjust=-1000
~~省略~~

OOMScoreAdjust を -1000 に設定すると、対象サービスのプロセスはkill対象外になる。
(MySQLを落とされて悲惨な目にあったので設定しておきたい)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Virtualbox Extension がエラーで入らなかった話

「ある日突然」「何もやっていないのに」「前はできていたのに」Virtualboxの拡張パックがインストールできなくなって少し苦労したので、もしも同じ境遇の人がいたら少しは役にたつかも?と思い投稿することにした。半分自分宛の備忘録も兼ねる。

現象と経緯

現象はこうだ。

これまで Ubuntu 20.04 LTS Desktop を使っていて、時たま使いたくなる Windows 10 を Virtualbox 上のVMとして設定して使っていた。USB 3.0 を使いたいこともあるので、Extension Pack をいれていた。6.1.14 までは正常に Extension Pack も更新できていた。

だがしかし。

少し前に(たぶん)、 Virtualbox が 6.1.16 に更新されていたが起動はしていなかった。で、昨日久しぶりに Virtualbox を起動したら Extension pack が古いよ、と警告されたので、じゃぁ更新するかと公式サイトからダウンロードして開いてみたが、エラーでインストールできなかった。(エラー時のスクショは取り忘れ。あると良かったんだけど。)

解決への道

どうしたかというと、まずは apt でどうにかしようと試行錯誤した。apt で取れるVirtualboxのバージョンは少し古く 6.1.10 。なので、一旦今の6.1.16を削除した上で改めて 6.1.10 を入れてみたが、新しいバージョンで動かしていたVMだから、VMが起動しない。何度か apt remove --purge して apt install とかしたが状況は変わらず。なので、ぐぐってみるも有益な情報はすぐにはみつからず。色々見ていく中で、手動で更新した、という記事を見つけた

これを試してみようと考えて、ダウンロードした Extension pack のファイルをunzipしてみたがZIPではなかった。記事では触れられてない(多分)が、tar.gz 形式だった。tar xzf して展開すると、同じようなファイルが出てきた。これを指示通りの場所(aptで入れていると /usr/lib/virtualbox/xtensionPacks/Oracle_VM_VirtualBox_Extension_Pack として置いてやる。んでもって改めて Virutalbox を起動したら、インストール済み拡張パックとして認識された。ふぅ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Virtualbox Extension Pack がエラーで入らなかった話

「ある日突然」「何もやっていないのに」「前はできていたのに」Virtualboxの拡張パックがインストールできなくなって少し苦労したので、もしも同じ境遇の人がいたら少しは役にたつかも?と思い投稿することにした。半分自分宛の備忘録も兼ねる。

現象と経緯

現象はこうだ。

これまで Ubuntu 20.04 LTS Desktop を使っていて、時たま使いたくなる Windows 10 を Virtualbox 上のVMとして設定して使っていた。USB 3.0 を使いたいこともあるので、Extension Pack をいれていた。6.1.14 までは正常に Extension Pack も更新できていた。

だがしかし。

少し前に(たぶん)、 Virtualbox が 6.1.16 に更新されていたが起動はしていなかった。で、昨日久しぶりに Virtualbox を起動したら Extension pack が古いよ、と警告されたので、じゃぁ更新するかと公式サイトからダウンロードして開いてみたが、エラーでインストールできなかった。(エラー時のスクショは取り忘れ。あると良かったんだけど。)

解決への道

どうしたかというと、まずは apt でどうにかしようと試行錯誤した。apt で取れるVirtualboxのバージョンは少し古く 6.1.10 。なので、一旦今の6.1.16を削除した上で改めて 6.1.10 を入れてみたが、新しいバージョンで動かしていたVMだからなのか、VMが起動しない。何度か apt remove --purge して apt install とかしたが状況は変わらず。なので、ぐぐってみるも有益な情報はすぐにはみつからず。色々見ていく中で、手動で更新した、という記事を見つけた

これを試してみようと考えて、ダウンロードした Extension pack のファイルをunzipしてみたがZIPではなかった。記事では触れられてない(多分)が、tar.gz 形式だった。tar xzf して展開すると、同じようなファイルが出てきた。これを指示通りの場所 ( /usr/lib/virtualbox/xtensionPacks/Oracle_VM_VirtualBox_Extension_Pack) に置いてやる。んでもって改めて Virutalbox を起動したら、インストール済み拡張パックとして認識された。ふぅ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む