[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 メーリングリストの案内