[one-users] [RFC] Writing a file repository system for images, kernels, context files, and more

Vivien Bernet-Rollande vivien.bernet-rollande at nexen.alterway.fr
Fri Jun 24 09:00:19 PDT 2011


Hi everyone.

I have recently deployed an installation of Open Nebula. Simple 
background : we're running Xen on Debian, with a custom TM driver that 
uses both NFS and iSCSI (sharing that TM driver is in our roadmap).

I have encountered  a few shortcomings. Some I have simply accepted for 
now, others I have bypassed as I could. One of them has to do with file 
management.

I'll consider several types of files :
  - VM images.
  - kernels/initrd images.
  - contextualization files.

Regarding VM images :
If a non-privileged user wants to use his own images, he needs either :
  - a shell on the master host, and put his images as world readable.
  - to put his images on a public http/ftp server
We found neither to be satisfying from the point of security.

Regarding kernels/initrds there is no way fo a user to upload his 
kernels. Kernels must either be installed on all compute nodes, or on a 
shared file system.

Regarding contextualization files, it's pretty much the same problem as 
with images.

Basically, what I would like is the following :
  - all files that may be used in a template by a non privileged users 
are owned by oneadmin
  - all files that may be used in a template by a non privileged users 
are chmoded 600
  - all files used in a template are referenced by a file ID.
Allowing end-users to manipulate system paths is a security nightmare.

Basically, what I want is :
  - admins may manipulate images with a path
  - users are only allowed to use file ids (e.g. 
KERNEL="kernel-linux3.0.grsec" or an arbitrary id)
  - users may upload files through the API, possibly through sunstone

I'm making the following proposition. This is not something I suggest 
should simply be added to the roadmap. This is something I (or someone 
else where I work) will be working on, and contribute back. Hence I'm 
looking for feedback on what the community thinks about it.

There would be a new "file" API, with associated "onefile" command.
"onefile create" would take a file parameter, and upload that file 
_through the API_.
Oned would then save that file in a directory (/srv/cloud/files).
Templates could then refer to those using their ids.

Files may have key-value pairs associated with them, and onefile can 
manipulated these.

There would be a "onefile update" command, which would allow a user to 
update a file, yet keep the same ID and key-value pairs.

A file is read-only. A file is never written to by a VM, or oned, or 
anything.

Admins may create a file with a "--local" flag. In that case, the path 
is sent to oned rather than the file, and oned copies the File. If the 
file is a symlink, the symlink is copied, rather than the file it links to.

Anything parsing a template is updated to understand this idea of file 
id, and replace it the right value. If the template contains paths and 
was submitted by an untrusted user, a "permission denied" error is 
returned. This can be disabled or enabled to ensure compatibility in the 
oned.conf file.

Contextualization may be done by selecting all files that have a certain 
value for a certain key (e.g. "role->mysql" or 
"vhost->www.example.com"), or by specifying the file's id, or it's path if

An image may be created from a file. The image repository needs to know 
how to import a file.

A file may be uploaded compressed. It would make sense to store it 
compressed as well (or at least as a sparse file).

I welcome any remarks or questions on this idea.

-- 
Vivien Bernet-Rollande
Systems&  Networking Engineer
Alter Way Hosting




More information about the Users mailing list