You assign an Attachment constraint to cause an object to hold a position on the surface of another object. The Attachment constraint is not a hierarchical link, but it has the effect of "linking" an object to the surface of another object as follows:
Attach a "source" object to the face of a "target" object so that the source object acts as if it's glued to the target object, no matter how the surface of the target object is deformed.
Animate the Attachment parameters so that the source object moves over the surface of the target object.
Unlike hierarchical linking, which considers only object transforms, an object using an Attachment constraint follows the deformations of another object based on that object's modifiers.
You use features on the Attachment Parameters rollout on the Motion panel, to pick a target object and position the source object.
Click Pick Object, then click the target object to perform the attachment.
Click Set Position and click or drag on the surface of the target object to place the source object onto the surface.
If you want to move the source object along the normal of the face (move it below or above the face) click Affect Object Only on the Hierarchy panel and move the object, using Local transform coordinates.
Turn on Align to Surface if you want to align the world Z axis of the source object with the surface normal of the target object. Even with Align to Surface selected, you can always rotate the source object to orient it the way you want in relation to the target object.
If you were to align trees on an uneven terrain, you would turn off Align to Surface so that all of the trees grew upright, regardless of the angle of the terrain surface.
You can move to any frame and click Set Position to animate the source object moving across the surface of the target object. It is not necessary to turn on the Animate button, because you are working with an animation constraint.
When you set positions for the source target on multiple frames, its attachment to the target object is only fixed at each keyframe. Frames between keys are interpolated and may not match the target surface.
Test your animation, and either adjust the values of the keys, or add intermediate keys to better match the target surface. Too many keys can result in jittery movement of the source object, while too few keys may result in the source object missing the surface of the target object over some frames.