TSIG error with server: tsig verify failure

TSIG error with server: tsig verify failure

ってなメッセージが /var/log/message にでてくる。

Jun 30 13:38:06 xxxx sssd[2095491]: ; TSIG error with server: tsig verify failure
Jun 30 13:38:06 xxxx sssd[2095491]: ; TSIG error with server: tsig verify failure
Jun 30 13:38:06 xxxx sssd[2095491]: ; TSIG error with server: tsig verify failure
Jun 30 13:38:06 xxxx sssd[2095491]: ; TSIG error with server: tsig verify failure

なんでsystemctl restart sssd.service

sssdって認証情報をキャッシュしてくれるヤツなんですが、デフォルトでadをプロバイダとして利用してる。
で、そいつのDNSレコードをnsupdateで更新しようとして失敗している模様。

対処

/etc/sssd/sssd.confで dyndns_updateを無効にする。

dyndns_update = false

その後sssdを再起動。

# systemctl restart sssd.service

EC2からsshで外にでられない

EC2からsshで外に出られない

ってな現象。

セキュリティグループ

セキュリティグループのアウトバウンドルールは TCP/22 で 0.0.0.0 で許可。でもNG。

サブネットACL

当該EC2が所属しているサブネットのネットワークACLもチェック。 アウトバウンドルールでTCP/22も許可
なんでや。

Reachability Analyzerをチェック

VPC内でどこか引っかってるかチェック。Internet Gatewayまでは到達していることを確認。
なるほどInternet Gatewayで引っかかってるんやな。

CloudWatchでチェック

CloudWatchのLog Group→VPCから宛先アドレスで検索。
こんなログを発見。

egress 8 REJECT 419084031744 eni-05e47517f4bc99d6d 172.19.96.249 XXX.XXX.XXX.XXXX XXX.XXX.XXX.XXX 22270 22 6 4 208 1656410829 1656410861 OK
ingress - ACCEPT 419084031744 eni-05e47517f4bc99d6d 172.19.80.121 172.19.96.249 XXX.XXX.XXX.XX 52856 22 6 4 208 1656410829 1656410861 OK

172.19.80.121はEC2のプライベートアドレス、172.19.96.249はインタネットゲートウェイVPC側アドレス。
そうか、こいつが所属しているサブネットでブロックされてるんやな。

ってことでこのサブネットのネットワークACLを編集。
とおりました。

RHEL8でyum updateするとなにやら警告が

RHEL8でyum updateするとなにやら警告が

RHEL8でyum updateするとこんな警告がでてきてエラーになる。

# yum check-update
Updating Subscription Management repositories.
メタデータの期限切れの最終確認: 0:09:19 時間前の 2022年06月21日 13時07分53秒 に実施しました。
Module yaml error: Unexpected key in data: static_context [line 9 col 3]
Module yaml error: Unexpected key in data: static_context [line 9 col 3]

このModule云々で検索するとRedHatの以下のページがヒット。

access.redhat.com

長いけど、libmodulemdをupdateせよと。でもyumでlibmodulemdをupdateしても最新だよっていわれて終了。
しかたなく手動でrpmをインストール。
ここ
Log In | Red Hat IDP
にブツがあるでダウンロードしてインストール。

# yum install /tmp/libmodulemd-2.13.0-1.el8.x86_64.rpm 

これで解決。

nginxのproxy_passで名前解決してくれない

nginxのproxy_passで名前解決してくれない

nginxが動作しているホストの /etc/hosts にこんな行を書いて

172.18.1.1 hogehoge.example.com

nginxでこんな感じにかいてみました。

location ~ /hogehoge/ {
    proxy_pass http://hogehoge.example.com ;
}

ところが、これだと502エラーになっちゃう。
errorlogに名前解決できないみたいなエラー。

022/06/13 17:59:00 [error] 28796#0: *21619 no resolver defined to resolve hogehoge.example.com

どうもnginxさんはhostsはみてくれないみたい。

じゃあどうするの

dnsmasqをいれて、localhostで名前させる。その上でresolverを指定する。

dnsmasqをインストール

# yum -y install dnsmasq

dnsmasqを起動

# systemctl start dnsmasq

resolverを記述

location ~ /hogehoge/ {
 resolver 127.0.0.1 ;
    proxy_pass http://hogehoge.example.com ;
}

めんどくさいな。

nginxのlocation

nginxのlocation

文法が厳しすぎる。
これはNG。意図した通りにProxyしてくれない。

location ~ ^/hogehoge{
    proxy_pass http://www.example.com ;
}

これはOK。正規表現の後ろにspaceが必要。

location ~ ^/hogehoge {
    proxy_pass http://www.example.com ;
}

たしかにパーサからすると、どこで正規表現終わるんや、ってなるのかもしれない。
だったら、エラーにしてくれればいいのに。。

iamユーザポリシーをterraformingをつかってterraform管理にする

iamユーザポリシーをterraformingをつかってterraform管理にする

aws上に環境を移したのはいいんでですが、ベンダさんや、保守者をいれると膨大な数のAIMユーザが出来てきます。まぁ膨大といっても200かそこらですけどね。
それぞれのユーザは有効期限がついてたり、ソースアドレスを制限していたりします。特に有効期限は一斉に変更しないといけないのですが、ちまちまとコンソールで変更とかやってられない。そこでterraform管理下へ移します。

terraformingでtfstateファイルを作成する

適当なディレクトリを作成してtfstateファイルを作成。今回はAIMのユーザポリシーを変更するのでaimupを出力。

$ terraforming iamup --tfstate> terraform.tfstate

terraformingでIAMユーザポリシーを作成

ユーザポリシーを吐き出させる。で、initする。当然のようにエラー。

$ terraforming aimup > main.tf
$ terraform init
(エラーいっぱい)
Template interpolation doesn't expect a colon at this location. Did you intend this to be a literal sequence to
be processed as part of another language? If so, you can escape it by starting with "$${" instead of just "${".

なんか"${"は使えないみたいなので、"$${"にしろっていってます。ってことでエディタで変換。再度initをかけてみる。
こんどは違うエラー

  Error: Invalid legacy provider address
│
│ This configuration or its associated state refers to the unqualified provider "aws".
│
│ You must complete the Terraform 0.13 upgrade process before upgrading to later versions.
╵

なんじゃ? 

プロバイダが違うらしい

バージョンの違いでプロバイダがちがうらしい。以下のコマンドを叩く。

$ terraform state replace-provider registry.terraform.io/-/aws registry.terraform.io/hashicorp/aws

これ実際には空のtfファイルでinit実行したあとにplanででてきたエラーで探しました。

planをかけてみる

$ terraforrm plan

OK!

あとは変更したいところを編集してapplyすればいい。

nginxでリファラによってプロクシ先を変更する

nginxでリファラによってプロクシ先を変更する

nginxで動作しているウェブサーバから複数のバックエンドサーバへリバースプロキシをしています。
ほとんどのバックエンドサーバはお行儀がいいので /hoge 以下がAサーバ、/fuga以下ならBサーバという設定ですみます。

location ~ ^/hoge {
    proxy_pass http://server-a.example.com ;
}

location ~ ^/fuga {
    proxy_pass http://server-b.example.com ;
}

ところが中にはHTML中のスクリプトや、イメージで ../scripts とか指定してくる人いて、しかも複数いたりします。
同一URIパスだけど、リファラによってリバースプロキシ先を変更する必要があるのですが、どうしたらいいんだろ。

ifを使う

location中でifを使うといいかな、とこんな風に書いてみたんですが意図した動作をしません。

location ~ ^/scripts {
    if ( $http_referer ~ /hoge/ ){
        proxy_pass http://server-a.example.com ;
    }

    if ( $http_referer ~ /fuga/ ){
        proxy_pass http://server-b.example.com ;
    }
}

なんでかわかりませんww
location中でifを使うんじゃねえって記事も見つかるのでそういう使い方は禁忌みたい。

mapを使う

ってことで変数を利用します。if分でプロクシ先のURIを変数へいれてもいいんですが、mapを使うとスマート。

map $http_referer $proxyhost {
        ~/hoge/               "http://sever-a.example.com" ;
        ~/fuga/                "http://server-b.example.com" ;
}

これをserverセグメントの外に書く。
locationで設定した変数を使う。

    location ~ ^/scripts/ {
        proxy_pass $proxyhost ;
    }