GeoNodes. Random Rotation from normals
The Attribute Randomize node will fill the specified attribute with random values, but cannot (by itself) account for the existing state of the attribute. To take the initial rotation into account, you'll want the Point Rotate node.
In the below example, rot_offset is a custom attribute filled by Attribute Randomize that is used as an offset from the initial (normal-aligned) rotation. You can name it something different if you'd like. Set the min/max bounds on this attribute to change the range of random rotation.

Note that if you want rot_offset to be considered in tangent space (treating the surface normal as positive z), you'll have to choose &quot;Point&quot; instead of &quot;Object&quot; in the Point Rotate node.