[ https://issues.apache.org/jira/browse/MAPREDUCE-181?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12751438#action_12751438 ]
Amar Kamat commented on MAPREDUCE-181: -------------------------------------- Here is the final proposal : # Here is how the handshake happens for job submission ## jobclient asks the jobtracker for a new jobid (jobtracker maintains a mapping from job-id to user-name [ugi]. This user is the owner of the job and will be allowed to submit the job) ## using the Input-split, the jobclient constructs a split _meta-info_ for the jobtracker to be able to create the task->node locality cache. {code} job-split-meta-info : - split-location (location of the actual split/raw-bytes) - split class (used to reinstantiate the split object) - split-info (array of individual split meta-info) split-meta-info : - locations (hostnames where this split is local) - start offset (start in raw-bytes) - length (total bytes in the corresponding raw-bytes) - data-size : total data that will be processed in this split {code} ## with this new id, the jobclient upload job.xml, job.split, job.jar and achives/libs to a staging area (/user/_user-name_/.staging/_jobid_/). job.xml is staged to support (jobtracker.getJobFile()) api. ## after the upload is done, the jobclient submits a job by passing job-id, job-conf and job-split-meta-info via rpc. ## jobtracker does the following things upon a submitjob request ### validate conf (includes queuecheck, acls checks etc along with user-name [conf.username and owner match]and ownership checks [called of getnewid() and submitjob()]) ### serialize conf to mapred.system.dir/jobid/job.xml (for restarts) ### serialize split-meta-info to mapred.system.dir/jobid/job.split ### starts the job i.e create jobinprogress ## when a tt comes asking for a task, the jobtracker passes the split-metainfo (along with split-location and split-classname). Tasktracker uses this metainfo for reading the split raw-bytes. ## tasktracker now localizes the job.jar from /user/_user-name_/.staging/_job-id_/job.jar and then unjars it. This is done using the job-conf (having user-credentials) ## mapred.system.dir can now be 700 and only accessible to mapred daemons ## readFields() in jobconf caps the total characters in jobconf. This prevents users from passing huge job-confs. For now the limit is 3*1024*1024 chars ## job-split metainfo is also capped in readFields() to accept split meta-info < 10mb. ## since jobtracker.getNewJobId() maintains a mapping from jobid to username, the jobtracker needs to cleanup this mapping upon some timeout. One way to timeout is to use a thread which periodically cleans up this mapping. ## Upon job completion, jobcleanup code cleans up the staging folder i.e /user/_user-name_/.staging/_job-id_/. ## if the jobclient crashes or fails to submit job then the temp files /user/_user-name_/.staging/_job-id_/ are not deleted as this can be used for debugging purposes. # Upon restart the mapred.system.dir can be completely trusted and hence no checking is done here. > Secure job submission > ---------------------- > > Key: MAPREDUCE-181 > URL: https://issues.apache.org/jira/browse/MAPREDUCE-181 > Project: Hadoop Map/Reduce > Issue Type: Bug > Reporter: Amar Kamat > Assignee: Amar Kamat > Attachments: hadoop-3578-branch-20-example-2.patch, > hadoop-3578-branch-20-example.patch, HADOOP-3578-v2.6.patch, > HADOOP-3578-v2.7.patch, MAPRED-181-v3.8.patch > > > Currently the jobclient accesses the {{mapred.system.dir}} to add job > details. Hence the {{mapred.system.dir}} has the permissions of > {{rwx-wx-wx}}. This could be a security loophole where the job files might > get overwritten/tampered after the job submission. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.