[Armadillo:07834] at-cgi で0600なresolv.confが生成される

Yasuhisa Nakamura email@hidden
2012年 1月 21日 (土) 11:35:33 JST


中村です。

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で作っておく、
というのでもいいかもしれません。

-- 
なかむら




armadillo メーリングリストの案内