[Armadillo:07841] Re: at-cgi で0600なresolv.confが生成される
Takenoshita Koyo
email@hidden
2012年 1月 24日 (火) 17:38:58 JST
竹之下です。
詳細な報告ありがとうございます。
> 別な方法として、空の/default/resolv.conf を0644で作っておく、
> というのでもいいかもしれません。
という方法が確実かもしれませんね。
他の影響がないか、検討してみます。
(2012年01月21日 11:35), Yasuhisa Nakamura wrote:
> 中村です。
>
> at-cgiが生成する /etc/config/resolv.conf がrootしか読めない
> 0600のファイルになってしまうケースがあります。
>
> ●発生ケース
>
> IPアドレス固定でDNSを使わないファームウェア(romfs)を作ります。
> 具体的には、vendor/Atmark...../etc/default/interfaces を
> 書き換えてIPアドレス固定の設定にし、/etc/default/resolv.confは、
> 作りません。
>
> このromfsイメージ作り、netflashでフラッシュに書き込んだ後、
> flatfsd -i
> で再起動します。
> "-i"は、reboot前にconfigフラッシュをクリアしますので、
> もしそれ以前に/etc/config/resolv.confがあったとしても、
> 再起動後にはresolv.confはなくなります。
>
> ブラウザでat-cgiにアクセスして、"Network"の画面をみると、
> "DNS Server"のところは空になっているはずです。
>
> このような状態のときに、DNSサーバによる名前解決が必要に
> なって(たとえば、at-cgiの"Firmware"の画面を使って、
> アットマークテクノ社のサイトから純正ファームウェアを
> ダウンロードして書きかえる、というような作業が必要に
> なったとき)、"Network"の画面で"DSN Server"のアドレスを
> 設定して[update]ボタンで保存します。
>
> この操作で生成される /etc/config/resolv.conf ファイルが、
> オーナーがrootで、パーミッションが0600になっています。
>
> #"DNS Server"は設定せずに空のままにしておいて、
> #自分のIPアドレスだけを変更する目的で、ネットワーク設定を
> #変更したときにも、0600の空の/etc/config/resolv.confが
> #生成されます。0600のresolv.confができてしまうと、
> #このあとどんな操作をしても0600のままです。
> #"AutoIP"にしてDHCPで取ってきても0600のままです。
>
>
> ● rootしか読めないrosolv.confだと・・・
>
> rootしか読めないファイルですから、at-cgiでは読むことが
> できません。今設定したはずの"DNS Server"のところは空は、
> 空のままです。
>
> また、"Firmware"の画面で[Get firmware options]ボタンを押すと、
> "Failed to get update options"というエラーになります。
> これは、root以外はresolv.confを読めないので、at-cgiから
> 起動されたwgetが、ファームウェアダウンロードサーバの
> IPアドレスを解決できないためです。
>
>
> ● 原因
>
> /misc-utils.cのsudo_string_to_file()内のmkstemp()が
> つくる一時ファイルは0600ですので、それを/etc/config/resolv.confに
> コピーすると、0600なresolv.confができあがります。
>
> #resolv.confがないときにDHCPで作られるresolv.confは
> #0644なので、その状態で0600のresolv.confをコピーしても
> #resolv.confは0644のままです。
>
>
> ● パッチ
>
> いろいろな解決方法があると思いますが・・・
>
> --- at-cgi/common/misc-utils.c (revision xxx)
> +++ at-cgi/common/misc-utils.c (working copy)
> @@ -296,6 +296,7 @@
> {
> int ret;
> char line_buffer[MAX_STR_LEN_S];
> + char *chmod_args[] = {SUDO_PATH, CHMOD_PATH, "0644", RESOLV_CONF_PATH, NULL};
>
> if (!nameserver) {
> return -1;
> @@ -312,6 +313,11 @@
> return -1;
> }
>
> + ret = cgi_exec(chmod_args[0], chmod_args);
> + if (ret< 0) {
> + syslog(LOG_WARNING, "at-cgi: failed to chmod resolv.conf");
> + }
> +
> return 0;
> }
>
> Index: at-cgi/common/core.h
> ===================================================================
> --- at-cgi/common/core.h (revision 238)
> +++ at-cgi/common/core.h (working copy)
> @@ -59,6 +59,7 @@
> #define CAT_PATH "/bin/cat"
> #define RM_PATH "/bin/rm"
> #define CP_PATH "/bin/cp"
> +#define CHMOD_PATH "/bin/chmod"
> #define LED_CTRL_PATH "/bin/ledctrl"
> #define CRONTAB_PATH "/usr/bin/crontab"
> #define MAIL_PATH "/bin/mail"
>
>
> この他に、vendor/Atmark...../etc/sudoersに "/bin/chmod" を
> 追加する必要があります。
>
> 別な方法として、空の/default/resolv.conf を0644で作っておく、
> というのでもいいかもしれません。
>
--
Koyo Takenoshita
armadillo メーリングリストの案内